第10讲摄像机漫游Word文档下载推荐.docx

上传人:b****5 文档编号:16070976 上传时间:2022-11-18 格式:DOCX 页数:12 大小:193.79KB
下载 相关 举报
第10讲摄像机漫游Word文档下载推荐.docx_第1页
第1页 / 共12页
第10讲摄像机漫游Word文档下载推荐.docx_第2页
第2页 / 共12页
第10讲摄像机漫游Word文档下载推荐.docx_第3页
第3页 / 共12页
第10讲摄像机漫游Word文档下载推荐.docx_第4页
第4页 / 共12页
第10讲摄像机漫游Word文档下载推荐.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

第10讲摄像机漫游Word文档下载推荐.docx

《第10讲摄像机漫游Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第10讲摄像机漫游Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。

第10讲摄像机漫游Word文档下载推荐.docx

在世界坐标系中,这几个分量都通过向量表示,并且实际上它们为摄像机定义了一个局部坐标系,

需要将世界坐标系中的物体随着摄像机一起进行变换,以便让摄像机的坐标系与世界坐标系完全重合

摄像机变换

Ø

1.沿各分量平移

由于摄像机包含向右、向上、观察三个分量,因此可以控制摄像机分别沿这三个分量进行平移。

其中,沿右分量的平移称作扫视,沿上分量的平移称作升降,而沿观察分量的平移称作平动,如图所示

 

2.绕各分量旋转

摄像机的另一种变换是分别绕上分量、右分量和观察分量进行旋转。

其中,绕上分量的旋转称作偏航,绕右分量的旋转称作俯仰,而绕观察分量的旋转称作滚动,如图所示

3.绕观察点旋转

摄像机的平移和旋转已经能够满足简单的应用,但是有时候还需要将观察点固定,并控制摄像机围绕该点做圆周运动,以便能够从不同角度观察同一物体。

因此,还需要让摄像机绕某个点进行旋转,如图所示

以摄像机在y方向上绕点l=(lx,ly,lz)旋转为例,假设当前摄像机位于p点(观察点l与p点同在y平面内),那么当摄像机按逆时针方向旋转a角度后应该位于p’点,如图所示。

//摄像机绕Y轴旋转fAngle角度

VOIDCCamera:

:

CircleRotationY(FLOATfAngle)

{

D3DXMATRIXR;

D3DXMatrixRotationAxis(&

R,&

m_vUpVec,fAngle);

D3DXVec3TransformCoord(&

m_vRightVec,&

R);

m_vLookVec,&

floatdx=m_vPosition.x-m_vLookat.x;

floatdz=m_vPosition.z-m_vLookat.z;

m_vPosition.x=m_vLookat.x+dx*cosf(fAngle)-dz*sinf(fAngle);

m_vPosition.z=m_vLookat.z+dx*sinf(fAngle)+dz*cosf(fAngle);

ResetLookatPos(&

m_vLookat);

}

根据上面介绍的内容,可以定义一个具有九个自由度的摄像机CCamera类,其中可以沿三个分量平移、绕三个分量旋转,以及在三个坐标方向上绕观察点旋转。

4.CCamera类定义

#pragmaonce

#include<

d3d9.h>

d3dx9.h>

//--------------------------------------------------------------------------------------

//Name:

classCCamera

//Desc:

虚拟摄像机平移、旋转

classCCamera

private:

D3DXVECTOR3m_vRightVec;

//摄像机右侧向量

D3DXVECTOR3m_vUpVec;

//摄像机上方向量

D3DXVECTOR3m_vLookVec;

//摄像机视线方向

D3DXVECTOR3m_vPosition;

//摄像机当前位置

D3DXMATRIXm_matView;

//摄像机矩阵

D3DXMATRIXm_matProj;

//投影矩阵

D3DXVECTOR3m_vLookat;

//摄像机视线位置

LPDIRECT3DDEVICE9m_pd3dDevice;

public:

CCamera(IDirect3DDevice9*pd3dDevice);

virtual~CCamera(void);

VOIDGetViewMatrix(D3DXMATRIX*pMatrix);

//获取摄像机矩阵

VOIDGetProjMatrix(D3DXMATRIX*pMatrix){*pMatrix=m_matProj;

}

VOIDGetCameraPos(D3DXVECTOR3*pVector){*pVector=m_vPosition;

VOIDGetLookVector(D3DXVECTOR3*pVector){*pVector=m_vLookVec;

VOIDResetLookatPos(D3DXVECTOR3*pLookat=NULL);

//设置视线位置

VOIDResetCameraPos(D3DXVECTOR3*pVector=NULL);

//设置摄像机位置

VOIDResetViewMatrix(D3DXMATRIX*pMatrix=NULL);

//设置摄像机(观察)矩阵

VOIDResetProjMatrix(D3DXMATRIX*pMatrix=NULL);

//设置投影矩阵

//沿各分量平移

VOIDMoveAlongRightVec(FLOATfUnits);

//沿right向量移动

VOIDMoveAlongUpVec(FLOATfUnits);

//沿up向量移动

VOIDMoveAlongLookVec(FLOATfUnits);

//沿look向量移动

//绕各分量旋转

VOIDRotationRightVec(FLOATfAngle);

//绕right向量选择

VOIDRotationUpVec(FLOATfAngle);

//绕up向量旋转

VOIDRotationLookVec(FLOATfAngle);

//绕look向量旋转

//绕空间点旋转

VOIDCircleRotationX(FLOATfAngle);

//在X方向上绕观察点旋转

VOIDCircleRotationY(FLOATfAngle);

//在Y方向上绕观察点旋转

VOIDCircleRotationZ(FLOATfAngle);

//在Z方向上绕观察点旋转

};

5、摄像机类CCamera类的实现

#include"

Camera.h"

fstream>

CCamera:

CCamera(IDirect3DDevice9*pd3dDevice)

m_pd3dDevice=pd3dDevice;

m_vRightVec=D3DXVECTOR3(1.0f,0.0f,0.0f);

//默认右向量与X正半轴重合

m_vUpVec=D3DXVECTOR3(0.0f,1.0f,0.0f);

//默认上向量与Y正半轴重合

m_vLookVec=D3DXVECTOR3(0.0f,0.0f,1.0f);

//默认观察向量与Z正半轴重合

m_vPosition=D3DXVECTOR3(0.0f,0.0f,0.0f);

//默认摄像机的位置为原点

m_vLookat=D3DXVECTOR3(0.0f,0.0f,0.0f);

GetViewMatrix(&

m_matView);

//取得取景变换矩阵

D3DXMatrixPerspectiveFovLH(&

m_matProj,D3DX_PI/4.0f,1.0f,1.0f,2000.0f);

//投影变换矩阵

~CCamera(void)

GetViewMatrix(D3DXMATRIX*pMatrix)

//使各分量相互垂直

D3DXVec3Normalize(&

m_vLookVec);

D3DXVec3Cross(&

m_vUpVec,&

m_vRightVec);

//上向量与观察向量垂直

m_vUpVec);

//规格化上向量

//右向量与上向量垂直

//你能通过左手法则确定叉积返回的向量。

按照第一个向量指向第二个向量弯曲你的左手,//这时拇指所指的方向就是叉积向量所指的方向。

//规格化右向量

//创建取景变换矩阵

pMatrix->

_11=m_vRightVec.x;

//Rx

_12=m_vUpVec.x;

//Ux

_13=m_vLookVec.x;

//Lx

_14=0.0f;

_21=m_vRightVec.y;

//Ry

_22=m_vUpVec.y;

//Uy

_23=m_vLookVec.y;

//Ly

_24=0.0f;

_31=m_vRightVec.z;

//Rz

_32=m_vUpVec.z;

//Uz

_33=m_vLookVec.z;

//Lz

_34=0.0f;

_41=-D3DXVec3Dot(&

m_vPosition);

//-P*R

_42=-D3DXVec3Dot(&

//-P*U

_43=-D3DXVec3Dot(&

//-P*L

_44=1.0f;

ResetLookatPos(D3DXVECTOR3*pLookat)

if(pLookat!

=NULL)m_vLookat=(*pLookat);

elsem_vLookat=D3DXVECTOR3(0.0f,0.0f,1.0f);

m_vLookVec=m

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1