关于摄像机类

CameraClass.h

 

  1. //=============================================================================   
  2. // Name: CameraClass.h   
  3. //  Des: 一个封装了实现虚拟摄像机的类的头文件   
  4. // 2013年 3月10日  Create by 浅墨    
  5. //=============================================================================   
  6.   
  7.   
  8. #pragma once   
  9.   
  10. #include <d3d9.h>   
  11. #include <d3dx9.h>   
  12.   
  13. class CameraClass  
  14. {  
  15. private:  
  16.     //成员变量的声明   
  17.     D3DXVECTOR3             m_vRightVector;        // 右分量向量   
  18.     D3DXVECTOR3             m_vUpVector;           // 上分量向量   
  19.     D3DXVECTOR3             m_vLookVector;         // 观察方向向量   
  20.     D3DXVECTOR3             m_vCameraPosition;        // 摄像机位置的向量   
  21.     D3DXVECTOR3             m_vTargetPosition;        //目标观察位置的向量   
  22.     D3DXMATRIX              m_matView;          // 取景变换矩阵   
  23.     D3DXMATRIX              m_matProj;          // 投影变换矩阵      
  24.     LPDIRECT3DDEVICE9       m_pd3dDevice;  //Direct3D设备对象   
  25.   
  26. public:  
  27.     //一个计算取景变换的函数   
  28.     VOID CalculateViewMatrix(D3DXMATRIX *pMatrix);    //计算取景变换矩阵   
  29.   
  30.     //三个Get系列函数   
  31.     VOID GetProjMatrix(D3DXMATRIX *pMatrix)  { *pMatrix = m_matProj; }  //返回当前投影矩阵   
  32.     VOID GetCameraPosition(D3DXVECTOR3 *pVector)  { *pVector = m_vCameraPosition; } //返回当前摄像机位置矩阵   
  33.     VOID GetLookVector(D3DXVECTOR3 *pVector) { *pVector = m_vLookVector; }  //返回当前的观察矩阵   
  34.   
  35.     //四个Set系列函数,注意他们都参数都有默认值NULL的,调用时不写参数也可以   
  36.     VOID SetTargetPosition(D3DXVECTOR3 *pLookat = NULL);  //设置摄像机的目标观察位置向量   
  37.     VOID SetCameraPosition(D3DXVECTOR3 *pVector = NULL); //设置摄像机所在的位置向量   
  38.     VOID SetViewMatrix(D3DXMATRIX *pMatrix = NULL);  //设置取景变换矩阵   
  39.     VOID SetProjMatrix(D3DXMATRIX *pMatrix = NULL);  //设置投影变换矩阵   
  40.   
  41. public:  
  42.     // 沿各分量平移的三个函数   
  43.     VOID MoveAlongRightVec(FLOAT fUnits);   // 沿right向量移动   
  44.     VOID MoveAlongUpVec(FLOAT fUnits);      // 沿up向量移动   
  45.     VOID MoveAlongLookVec(FLOAT fUnits);    // 沿look向量移动   
  46.   
  47.     // 绕各分量旋转的三个函数   
  48.     VOID RotationRightVec(FLOAT fAngle);    // 绕right向量选择   
  49.     VOID RotationUpVec(FLOAT fAngle);       // 绕up向量旋转   
  50.     VOID RotationLookVec(FLOAT fAngle);     // 绕look向量旋转   
  51.   
  52. public:  
  53.     //构造函数和析构函数   
  54.     CameraClass(IDirect3DDevice9 *pd3dDevice);  //构造函数   
  55.     virtual ~CameraClass(void);  //析构函数   
  56.   
  57. };  

 

CameraClass.cpp

 

  1. //=============================================================================   
  2. // Name: CameraClass.cpp   
  3. //  Des: 一个封装了实现虚拟摄像机的类的源文件   
  4. // 2013年 3月10日  Create by 浅墨    
  5. //=============================================================================   
  6. #include "CameraClass.h"   
  7.   
  8. #ifndef SCREEN_WIDTH   
  9. #define SCREEN_WIDTH    800                     //为窗口宽度定义的宏,以方便在此处修改窗口宽度   
  10. #define SCREEN_HEIGHT   600                 //为窗口高度定义的宏,以方便在此处修改窗口高度   
  11. #endif   
  12.   
  13. //-----------------------------------------------------------------------------   
  14. // Desc: 构造函数   
  15. //-----------------------------------------------------------------------------   
  16. CameraClass::CameraClass(IDirect3DDevice9 *pd3dDevice)  
  17. {  
  18.     m_pd3dDevice = pd3dDevice;  
  19.     m_vRightVector  = D3DXVECTOR3(1.0f, 0.0f, 0.0f);   // 默认右向量与X正半轴重合   
  20.     m_vUpVector     = D3DXVECTOR3(0.0f, 1.0f, 0.0f);   // 默认上向量与Y正半轴重合   
  21.     m_vLookVector   = D3DXVECTOR3(0.0f, 0.0f, 1.0f);   // 默认观察向量与Z正半轴重合   
  22.     m_vCameraPosition  = D3DXVECTOR3(0.0f, 0.0f, -250.0f);   // 默认摄像机坐标为(0.0f, 0.0f, -250.0f)   
  23.     m_vTargetPosition    = D3DXVECTOR3(0.0f, 0.0f, 0.0f);//默认观察目标位置为(0.0f, 0.0f, 0.0f);   
  24.   
  25. }  
  26.   
  27.   
  28. //-----------------------------------------------------------------------------   
  29. // Name:CameraClass::CalculateViewMatrix( )   
  30. // Desc: 根据给定的矩阵计算出取景变换矩阵   
  31. //-----------------------------------------------------------------------------   
  32. VOID CameraClass::CalculateViewMatrix(D3DXMATRIX *pMatrix)   
  33. {  
  34.     //1.先把3个向量都规范化并使其相互垂直,成为一组正交矩阵   
  35.     D3DXVec3Normalize(&m_vLookVector, &m_vLookVector);  //规范化观察分量   
  36.     D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector);    // 上向量与观察向量垂直   
  37.     D3DXVec3Normalize(&m_vUpVector, &m_vUpVector);                // 规范化上向量   
  38.     D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector);    // 右向量与上向量垂直   
  39.     D3DXVec3Normalize(&m_vRightVector, &m_vRightVector);          // 规范化右向量   
  40.   
  41.   
  42.     // 2.创建出取景变换矩阵   
  43.     //依次写出取景变换矩阵的第一行   
  44.     pMatrix->_11 = m_vRightVector.x;           // Rx   
  45.     pMatrix->_12 = m_vUpVector.x;              // Ux   
  46.     pMatrix->_13 = m_vLookVector.x;            // Lx   
  47.     pMatrix->_14 = 0.0f;  
  48.     //依次写出取景变换矩阵的第二行   
  49.     pMatrix->_21 = m_vRightVector.y;           // Ry   
  50.     pMatrix->_22 = m_vUpVector.y;              // Uy   
  51.     pMatrix->_23 = m_vLookVector.y;            // Ly   
  52.     pMatrix->_24 = 0.0f;  
  53.     //依次写出取景变换矩阵的第三行   
  54.     pMatrix->_31 = m_vRightVector.z;           // Rz   
  55.     pMatrix->_32 = m_vUpVector.z;              // Uz   
  56.     pMatrix->_33 = m_vLookVector.z;            // Lz   
  57.     pMatrix->_34 = 0.0f;  
  58.     //依次写出取景变换矩阵的第四行   
  59.     pMatrix->_41 = -D3DXVec3Dot(&m_vRightVector, &m_vCameraPosition);    // -P*R   
  60.     pMatrix->_42 = -D3DXVec3Dot(&m_vUpVector, &m_vCameraPosition);       // -P*U   
  61.     pMatrix->_43 = -D3DXVec3Dot(&m_vLookVector, &m_vCameraPosition);     // -P*L   
  62.     pMatrix->_44 = 1.0f;  
  63. }  
  64.   
  65.   
  66. //-----------------------------------------------------------------------------   
  67. // Name:CameraClass::SetTargetPosition( )   
  68. // Desc: 设置摄像机的观察位置   
  69. //-----------------------------------------------------------------------------   
  70. VOID CameraClass::SetTargetPosition(D3DXVECTOR3 *pLookat)   
  71. {  
  72.     //先看看pLookat是否为默认值NULL   
  73.     if (pLookat != NULL)  m_vTargetPosition = (*pLookat);  
  74.     else m_vTargetPosition = D3DXVECTOR3(0.0f, 0.0f, 1.0f);  
  75.   
  76.     m_vLookVector = m_vTargetPosition - m_vCameraPosition;//观察点位置减摄像机位置,得到观察方向向量   
  77.     D3DXVec3Normalize(&m_vLookVector, &m_vLookVector);//规范化m_vLookVector向量   
  78.   
  79.     //正交并规范化m_vUpVector和m_vRightVector   
  80.     D3DXVec3Cross(&m_vUpVector, &m_vLookVector, &m_vRightVector);  
  81.     D3DXVec3Normalize(&m_vUpVector, &m_vUpVector);  
  82.     D3DXVec3Cross(&m_vRightVector, &m_vUpVector, &m_vLookVector);  
  83.     D3DXVec3Normalize(&m_vRightVector, &m_vRightVector);  
  84. }  
  85.   
  86. //-----------------------------------------------------------------------------   
  87. // Name:CameraClass::SetCameraPosition( )   
  88. // Desc: 设置摄像机所在的位置   
  89. //-----------------------------------------------------------------------------   
  90. VOID CameraClass::SetCameraPosition(D3DXVECTOR3 *pVector)   
  91. {  
  92.     D3DXVECTOR3 V = D3DXVECTOR3(0.0f, 0.0f, -250.0f);  
  93.     m_vCameraPosition = pVector ? (*pVector) : V;//三目运算符,如果pVector为真的话,返回*pVector的值(即m_vCameraPosition=*pVector),否则返回V的值(即m_vCameraPosition=V)   
  94. }  
  95.   
  96. //-----------------------------------------------------------------------------   
  97. // Name:CameraClass::SetViewMatrix( )   
  98. // Desc: 设置取景变换矩阵   
  99. //-----------------------------------------------------------------------------   
  100. VOID CameraClass::SetViewMatrix(D3DXMATRIX *pMatrix)   
  101. {  
  102.     //根据pMatrix的值先做一下判断   
  103.     if (pMatrix) m_matView = *pMatrix;  
  104.     else CalculateViewMatrix(&m_matView);  
  105.     m_pd3dDevice->SetTransform(D3DTS_VIEW, &m_matView);  
  106.     //把取景变换矩阵的值分下来分别给右分量,上分量,和观察分量   
  107.     m_vRightVector = D3DXVECTOR3(m_matView._11, m_matView._21, m_matView._31);  
  108.     m_vUpVector    = D3DXVECTOR3(m_matView._12, m_matView._22, m_matView._32);  
  109.     m_vLookVector  = D3DXVECTOR3(m_matView._13, m_matView._23, m_matView._33);  
  110. }  
  111.   
  112. //-----------------------------------------------------------------------------   
  113. // Name:CameraClass::SetProjMatrix( )   
  114. // Desc: 设置投影变换矩阵   
  115. //-----------------------------------------------------------------------------   
  116. VOID CameraClass::SetProjMatrix(D3DXMATRIX *pMatrix)   
  117. {  
  118.     //判断值有没有,没有的话就计算一下   
  119.     if (pMatrix != NULL) m_matProj = *pMatrix;  
  120.     else D3DXMatrixPerspectiveFovLH(&m_matProj, D3DX_PI / 4.0f, (float)((double)SCREEN_WIDTH/SCREEN_HEIGHT), 1.0f, 30000.0f);//视截体远景设为30000.0f,这样就不怕看不到远处的物体了   
  121.     m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &m_matProj);//设置投影变换矩阵   
  122. }  
  123.   
  124. //-----------------------------------------------------------------------------   
  125. // Name:CameraClass::MoveAlongRightVec( )   
  126. // Desc: 沿右向量平移fUnits个单位   
  127. //-----------------------------------------------------------------------------   
  128. VOID CameraClass::MoveAlongRightVec(FLOAT fUnits)   
  129. {  
  130.     //直接乘以fUnits的量来累加就行了   
  131.     m_vCameraPosition += m_vRightVector * fUnits;  
  132.     m_vTargetPosition   += m_vRightVector * fUnits;  
  133. }  
  134.   
  135. //-----------------------------------------------------------------------------   
  136. // Name:CameraClass::MoveAlongUpVec( )   
  137. // Desc:  沿上向量平移fUnits个单位   
  138. //-----------------------------------------------------------------------------   
  139. VOID CameraClass::MoveAlongUpVec(FLOAT fUnits)   
  140. {  
  141.     //直接乘以fUnits的量来累加就行了   
  142.     m_vCameraPosition += m_vUpVector * fUnits;  
  143.     m_vTargetPosition   += m_vUpVector * fUnits;  
  144. }  
  145.   
  146. //-----------------------------------------------------------------------------   
  147. // Name:CameraClass::MoveAlongLookVec( )   
  148. // Desc:  沿观察向量平移fUnits个单位   
  149. //-----------------------------------------------------------------------------   
  150. VOID CameraClass::MoveAlongLookVec(FLOAT fUnits)   
  151. {  
  152.     //直接乘以fUnits的量来累加就行了   
  153.     m_vCameraPosition += m_vLookVector * fUnits;  
  154.     m_vTargetPosition   += m_vLookVector * fUnits;  
  155. }  
  156.   
  157. //-----------------------------------------------------------------------------   
  158. // Name:CameraClass::RotationRightVec( )   
  159. // Desc:  沿右向量旋转fAngle个弧度单位的角度   
  160. //-----------------------------------------------------------------------------   
  161. VOID CameraClass::RotationRightVec(FLOAT fAngle)   
  162. {  
  163.     D3DXMATRIX R;  
  164.     D3DXMatrixRotationAxis(&R, &m_vRightVector, fAngle);//创建出绕m_vRightVector旋转fAngle个角度的R矩阵   
  165.     D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &R);//让m_vUpVector向量绕m_vRightVector旋转fAngle个角度   
  166.     D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &R);//让m_vLookVector向量绕m_vRightVector旋转fAngle个角度   
  167.   //m_vTargetPosition = m_vCameraPosition+m_vLookVector * D3DXVec3Length(&(m_vTargetPosition-m_vCameraPosition));
    //个人觉得上面是对的
  168.     m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//更新一下观察点的新位置(方向乘以模=向量)   
  169. }  
  170.   
  171. //-----------------------------------------------------------------------------   
  172. // Name:CameraClass::RotationUpVec( )   
  173. // Desc:  沿上向量旋转fAngle个弧度单位的角度   
  174. //-----------------------------------------------------------------------------   
  175. VOID CameraClass::RotationUpVec(FLOAT fAngle)   
  176. {  
  177.     D3DXMATRIX R;  
  178.     D3DXMatrixRotationAxis(&R, &m_vUpVector, fAngle);//创建出绕m_vUpVector旋转fAngle个角度的R矩阵   
  179.     D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &R);//让m_vRightVector向量绕m_vUpVector旋转fAngle个角度   
  180.     D3DXVec3TransformCoord(&m_vLookVector, &m_vLookVector, &R);//让m_vLookVector向量绕m_vUpVector旋转fAngle个角度   
  181.   //m_vTargetPosition = m_vCameraPosition+m_vLookVector * D3DXVec3Length(&(m_vTargetPosition-m_vCameraPosition));
    //上面是我的
  182.     m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//更新一下观察点的新位置(方向乘以模=向量)   
  183. }  
  184.   
  185. //-----------------------------------------------------------------------------   
  186. // Name:CameraClass::RotationLookVec( )   
  187. // Desc:  沿观察向量旋转fAngle个弧度单位的角度   
  188. //-----------------------------------------------------------------------------   
  189. VOID CameraClass::RotationLookVec(FLOAT fAngle)   
  190. {  
  191.     D3DXMATRIX R;  
  192.     D3DXMatrixRotationAxis(&R, &m_vLookVector, fAngle);//创建出绕m_vLookVector旋转fAngle个角度的R矩阵   
  193.     D3DXVec3TransformCoord(&m_vRightVector, &m_vRightVector, &R);//让m_vRightVector向量绕m_vLookVector旋转fAngle个角度   
  194.     D3DXVec3TransformCoord(&m_vUpVector, &m_vUpVector, &R);//让m_vUpVector向量绕m_vLookVector旋转fAngle个角度   
  195.   //m_vTargetPosition = m_vCameraPosition+m_vLookVector * D3DXVec3Length(&(m_vTargetPosition-m_vCameraPosition));
    //我的意见是上一个,下面的是浅莫的
  196.     m_vTargetPosition = m_vLookVector * D3DXVec3Length(&m_vCameraPosition);//更新一下观察点的新位置(方向乘以模=向量)   
  197. }  
  198.   
  199.   
  200. //-----------------------------------------------------------------------------   
  201. // Desc: 析构函数   
  202. //-----------------------------------------------------------------------------   
  203. CameraClass::~CameraClass(void)  
  204. {  
  205. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值