第10讲摄像机漫游分析解析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);//设置摄像机(观察)矩阵

相关文档
最新文档