- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第10讲摄像机漫游
摄像机漫游
设置观察矩阵代码:
//建立并设置观察矩阵
D3DXVECTOR3 vEyePt( 0.0f,0.0f,-15.0f );
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
D3DXMATRIX matView;
D3DXMatrixLookAtLH( matView, vEyePt, vLookatPt, vUpVec );
g_pd3dDevice-SetTransform( D3DTS_VIEW, matView );
观察变换---摄像机属性
通常用四个分量来确定一个摄像机相对于世界坐标系的位置和朝向:左分量、上分量、观察分量和位置分量。在世界坐标系中,这几个分量都通过向量表示,并且实际上它们为摄像机定义了一个局部坐标系,
需要将世界坐标系中的物体随着摄像机一起进行变换,以便让摄像机的坐标系与世界坐标系完全重合
摄像机变换
1.沿各分量平移
由于摄像机包含向右、向上、观察三个分量,因此可以控制摄像机分别沿这三个分量进行平移。其中,沿右分量的平移称作扫视,沿上分量的平移称作升降,而沿观察分量的平移称作平动,如图所示
2.绕各分量旋转
摄像机的另一种变换是分别绕上分量、右分量和观察分量进行旋转。其中,绕上分量的旋转称作偏航,绕右分量的旋转称作俯仰,而绕观察分量的旋转称作滚动,如图所示
3.绕观察点旋转
摄像机的平移和旋转已经能够满足简单的应用,但是有时候还需要将观察点固定,并控制摄像机围绕该点做圆周运动,以便能够从不同角度观察同一物体。因此,还需要让摄像机绕某个点进行旋转,如图所示
以摄像机在y方向上绕点l=(lx,ly,lz)旋转为例,假设当前摄像机位于p点(观察点l与p点同在y平面内),那么当摄像机按逆时针方向旋转a 角度后应该位于p’点,如图所示。
//摄像机绕Y轴旋转fAngle角度
VOID CCamera::CircleRotationY(FLOAT fAngle)
{
D3DXMATRIX 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 d3d9.h
#include d3dx9.h
//--------------------------------------------------------------------------------------
// Name: class CCamera
// Desc: 虚拟摄像机平移、旋转
//--------------------------------------------------------------------------------------
class CCamera
{
private:
D3DXVECTOR3 m_vRightVec; // 摄像机右侧向量
D3DXVECTOR3 m_vUpVec; // 摄像机上方向量
D3DXVECTOR3 m_vLookVec; //摄像机视线方向
D3DXVECTOR3 m_vPosition; // 摄像机当前位置
D3DXMATRIX m_matView; // 摄像机矩阵
D3DXMATRIX m
文档评论(0)