2.8 View Transformations and cCamera(摄像机)
咦,估计老外也腻了,直接来个声明:
class cCamera { protected: float m_XPos, m_YPos, m_ZPos; //位置坐标 float m_XRot, m_YRot, m_ZRot; // 旋转值 // 摄像机跟踪目标 float m_StartXPos, m_StartYPos, m_StartZPos; float m_StartXRot, m_StartYRot, m_StartZRot; float m_EndXPos, m_EndYPos, m_EndZPos; float m_EndXRot, m_EndYRot, m_EndZRot; D3DXMATRIX m_matWorld; // 世界转换坐标 D3DXMATRIX m_matTranslation; // 转换矩阵 D3DXMATRIX m_matRotation; // 旋转矩阵
public: cCamera(); // 构造函数 D3DXMATRIX *GetMatrix(); // 获取视角转换矩阵 BOOL Update(); // 更新转换矩阵 // 移动和旋转视角 BOOL Move(float XPos, float YPos, float ZPos); BOOL MoveRel(float XAdd, float YAdd, float ZAdd); BOOL Rotate(float XRot, float YRot, float ZRot); BOOL RotateRel(float XAdd, float YAdd, float ZAdd); // 通过Eye位置和At位置定为一个摄像头 BOOL Point(float XEye, float YEye, float ZEye, / float XAt, float YAt, float ZAt); // 设置开始和结束跟踪目标 BOOL SetStartTrack(); BOOL SetEndTrack(); // 沿着踪迹插入摄像头 //使用 Time (0.0 - 1.0) 和 全部 Length. BOOL Track(float Time, float Length); //获取转换和旋转值 float GetXPos(); float GetYPos(); float GetZPos(); float GetXRotation(); float GetYRotation(); float GetZRotation(); }; |
cCamera类和cWorldPosition类很像,所以我将放弃介绍。不同的是:Point,SetStartTrack,SetEndTrack,Track函数。你可以使用Point函数去定位一个视点并可以指定一个观察方向。
这三个track得的相关函数可以通过实践跟踪一个移动的摄像头。要使用摄像头跟踪目标,定为他的开始位置并调用cCamera::SetStartTrack。然后移动摄像头到结束位置并调用cCamera::SetEndTrack
现在,调用cCamera::Track去沿着你创建的轨迹定位摄像头有一个问题(调用之前要先cCamera::Update),Track的Time参数范围在0.0(开始目标)到1.0(结束目标)和任何在摄像头沿着track.Length步数之间和任意你想运行的主观值(比如毫秒);
摄像头跟踪可以创建一些非常棒的效果,看例子:
// 定位到 0.0f, 100.0f, -100.0f 并朝原点看 Cam.Point(0.0f, 100.0f, -100.0f, 0.0f, 0.0f, 0.0f); Cam.SetStartTrack(); // 移动到结束目标 Cam.Point(-100.0f, 0.0f, 0.0f, 0.0f, 100.0f, 0.0f); Cam.SetEndTrack(); // Position camera to halfway mark over 10000 milliseconds // 定位摄像头到中间标记大于10000毫秒 Cam.Track(0.5f, 10000); Cam.Update(); |
要设置摄像头到当前视角矩阵,使用cGraphics::SetCamera函数:
g_Graphics.SetCamera(&Cam); // 之前不要调用Update函数 |