第10讲摄像机漫游分析解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摄像机漫游
设置观察矩阵代码:
//建立并设置观察矩阵
D3DXVECTOR3 vEyePt( 0.0f,0.0f,-15.0f );
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpV ec( 0.0f, 1.0f, 0.0f );
D3DXMA TRIX matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
观察变换---摄像机属性
通常用四个分量来确定一个摄像机相对于世界坐标系的位置和朝向:左分量、上分量、观察分量和位置分量。在世界坐标系中,这几个分量都通过向量表示,并且实际上它们为摄像机定义了一个局部坐标系,
需要将世界坐标系中的物体随着摄像机一起进行变换,以便让摄像机的坐标系与世界坐标系完全重合
摄像机变换
1.沿各分量平移
由于摄像机包含向右、向上、观察三个分量,因此可以控制摄像机分别沿这三个分量进行平移。其中,沿右分量的平移称作扫视,沿上分量的平移称作升降,而沿观察分量的平移称作平动,如图所示
2.绕各分量旋转
摄像机的另一种变换是分别绕上分量、右分量和观察分量进行旋转。其中,绕上分量的旋转称作偏航,绕右分量的旋转称作俯仰,而绕观察分量的旋转称作滚动,如图所示
3.绕观察点旋转
摄像机的平移和旋转已经能够满足简单的应用,但是有时候还需要将观察点固定,并控制摄像机围绕该点做圆周运动,以便能够从不同角度观察同一物体。因此,还需要让摄像机绕某个点进行旋转,如图所示
以摄像机在y方向上绕点l=(l x,l y,l z)旋转为例,假设当前摄像机位于p点(观察点l与p点同在y平面内),那么当摄像机按逆时针方向旋转a 角度后应该位于p’点,如图所示。
//摄像机绕Y轴旋转fAngle角度
VOID CCamera::CircleRotationY(FLOAT fAngle)
{
D3DXMA TRIX R;
D3DXMatrixRotationAxis(&R, &m_vUpVec, fAngle);
D3DXVec3TransformCoord(&m_vRightVec, &m_vRightVec, &R);
D3DXVec3TransformCoord(&m_vLookVec, &m_vLookVec, &R);
float dx = m_vPosition.x - m_vLookat.x;
float dz = 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类定义
#pragma once
#include
#include
//--------------------------------------------------------------------------------------
// Name: class CCamera
// Desc: 虚拟摄像机平移、旋转
//--------------------------------------------------------------------------------------
class CCamera
{
private:
D3DXVECTOR3 m_vRightVec; // 摄像机右侧向量
D3DXVECTOR3 m_vUpVec; // 摄像机上方向量
D3DXVECTOR3 m_vLookVec; //摄像机视线方向
D3DXVECTOR3 m_vPosition; // 摄像机当前位置
D3DXMA TRIX m_matView; // 摄像机矩阵
D3DXMA TRIX m_matProj; // 投影矩阵
D3DXVECTOR3 m_vLookat; //摄像机视线位置
LPDIRECT3DDEVICE9 m_pd3dDevice;
public:
CCamera(IDirect3DDevice9 *pd3dDevice);
virtual ~CCamera(void);
public:
VOID GetViewMatrix(D3DXMA TRIX *pMatrix);//获取摄像机矩阵
VOID GetProjMatrix(D3DXMATRIX *pMatrix) { *pMatrix = m_matProj; }
VOID GetCameraPos(D3DXVECTOR3 *pVector) { *pVector = m_vPosition; }
VOID GetLookVector(D3DXVECTOR3 *pVector) { *pVector = m_vLookVec; }
VOID ResetLookatPos(D3DXVECTOR3 *pLookat = NULL);//设置视线位置
VOID ResetCameraPos(D3DXVECTOR3 *pVector = NULL);//设置摄像机位置
VOID ResetViewMatrix(D3DXMA TRIX *pMatrix = NULL);//设置摄像机(观察)矩阵