专题9设计一个灵活的摄像机.pptVIP

  • 0
  • 0
  • 约4.99千字
  • 约 19页
  • 2017-07-05 发布于四川
  • 举报
抛砖引玉 抛砖引玉 专题9 选择场景中的角色 学习目标: 1.掌握摄像机的几种基本变化 2.将摄像机的基本功能封装成为完整类形式 3. 将封装的类应用于实例 摄像机的运动 封装的摄像机类 摄像机设计 我们定义一个相对于世界坐标系的位置和摄像机的方向,这里使用四个摄像机向量:right vector , ?up vector,look vector 以及 position vector,如下图所示。这些向量用来为摄像机定义一个坐标系来描述在世界坐标中的对应关系。因为 right ,up 和 look 向量定义了摄像机在世界中的方向,我们有时把它们三个向量一起称为方向向量(orientation vectors)。方向向量必须被标准化。假如彼此互相垂直且都是单位长度,那么我们就称它们是正交标准化向量。我们做这些限制是因为等一会儿我们要将方向向量插入到一个行矩阵中。因为行向量是正交标准化的,所以该矩阵也就是正交矩阵。回忆一下,正交矩阵有一个特性就是它的逆矩阵等于它的转置矩阵。 摄像机设计 在程序中摄像机以以下6种方式运动: 1)围绕right向量旋转 2)围绕up向量旋转 3)围绕look向量旋转 4)沿着right向量平移 5)沿着up向量飞行 6)沿着look向量移动 摄像机动作的实现 摄像机动作的实现 1)围绕right向量旋转: 2)围绕up向量旋转 3)围绕look向量旋转 摄像机动作的实现 4)沿着right向量平移 5)沿着up向量飞行 6)沿着look向量移动 封装的摄像机类 class Camera { public: enum CameraType { LANDOBJECT, AIRCRAFT }; Camera(); Camera(CameraType cameraType); ~Camera(); void strafe(float units); // left/right void fly(float units); // up/down void walk(float units); // forward/backward void pitch(float angle); // rotate on right vector void yaw(float angle); // rotate on up vector void roll(float angle); // rotate on look vector void getViewMatrix(D3DXMATRIX* V); void setCameraType(CameraType cameraType); void getPosition(D3DXVECTOR3* pos); void setPosition(D3DXVECTOR3* pos); void getRight(D3DXVECTOR3* right); void getUp(D3DXVECTOR3* up); void getLook(D3DXVECTOR3* look); private: CameraType _cameraType; D3DXVECTOR3 _right; D3DXVECTOR3 _up; D3DXVECTOR3 _look; D3DXVECTOR3 _pos; }; 程序实现 void Camera::getViewMatrix(D3DXMATRIX* V) { // Keep cameras axes orthogonal to eachother D3DXVec3Normalize(_look, _look); D3DXVec3Cross(_up, _look, _right); D3DXVec3Normalize(_up, _up); D3DXVec3Cross(_right, _up, _look); D3DXVec3Normalize(_right, _right); // Build the view matrix: float x = -D3DXVec3Dot(_right, _pos); float y = -D3DXVec3Dot(_up, _pos); float z = -D3DXVec3Dot(_look, _pos); (*V)(0,0) = _right.x; (*V)(0, 1) = _up.x; (*V)(0, 2) = _look.x; (*V)(0, 3) = 0.0f; (*V)(1,0) = _right.y; (*V)(1, 1) = _up.y; (*V)(1, 2) =

文档评论(0)

1亿VIP精品文档

相关文档