织梦CMS - 轻松建站从此开始!

罗索

D3DCamera封装类:用于架设一个可以操纵的摄像机

jackyhwei 发布于 2010-08-17 22:09 点击:次 
落鹤生:这是一个D3DCamera的封装类,用于架设一个可以操纵的摄像机。
TAG:

头文件:

  1. // 文件: D3DCamera.h 
  2. // 描述: D3DCamera类的头文件,定义变量,函数。 
  3.  
  4. #pragma once 
  5. #include <d3dx9.h> 
  6. #pragma comment (lib, "d3d9.lib") 
  7. #pragma comment (lib, "d3dx9.lib") 
  8. #include "D3DWindow.h" 
  9. class D3DCamera 
  10. public
  11.     D3DCamera(LPDIRECT3DDEVICE9 _pd3dDevice); 
  12. public
  13.     ~D3DCamera(void); 
  14. public
  15.     VOID resetCamera(); 
  16.     VOID applyCamera(); 
  17.     LRESULT mouseProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); 
  18.     VOID keyProc(); 
  19. private
  20.     VOID setCamera(); 
  21. private
  22.     LPDIRECT3DDEVICE9 m_pd3dDevice;// D3D设备 
  23.     BOOL m_bIsRotaion;// 是否旋转 
  24.     D3DXVECTOR3 m_vPos;// 摄像机位置 
  25.     D3DXVECTOR3 m_vLookAt;// 摄像机视点 
  26.     D3DXVECTOR3 m_vUp;// 摄像机顶方向 
  27.     D3DXVECTOR3 m_vRight;// 摄像机右方向 
  28.     D3DXVECTOR3 m_vDirection;// 摄像机面向方向 
  29.     FLOAT m_fNear;// 视角最近距离 
  30.     FLOAT m_fFar;// 视角最远距离 
  31.     FLOAT m_fFOV;// 视角可视角度 
  32.     FLOAT m_fAspect;// 视角宽高比 
  33.      
  34.     FLOAT m_fMaxPitch;// 视角仰视最大值 
  35.     FLOAT m_fMinPitch;// 视角俯视最大值 
  36.     FLOAT m_fCameraYawAngle;// 摄像机Y轴旋转角度 
  37.     FLOAT m_fCameraPitchAngle;// 摄像机X轴旋转角度 
  38.     D3DXVECTOR3 m_vDelta; // 摄像机移动向量 
  39.     FLOAT m_fSpeed; // 摄像机移动速度 
  40.     POINT m_LastPoint; // 上一个鼠标位置 
  41. }; 

源代码:

  1. // 文件: D3DCamera.cpp 
  2. // 描述: D3DCamera类,用于架设一个可以操纵的摄像机 
  3.  
  4. #include "D3DCamera.h" 
  5. #include "D3DImage.h" 
  6.  
  7. // 名称: D3DCamera() 
  8. // 描述: 自定义构造函数 
  9. D3DCamera::D3DCamera(LPDIRECT3DDEVICE9 _pd3dDevice) 
  10.     m_pd3dDevice = _pd3dDevice; 
  11.     // 设置摄像机位置,视点,顶方向 
  12.     D3DXMATRIXA16 matView; 
  13.     m_vPos = D3DXVECTOR3(0.0f, 0.0f, -WND_HEIGHT/2*ZOOM);   // 摄像机位置 
  14.     m_vLookAt = D3DXVECTOR3(0.0f, 0.0f, 0.0f);              // 摄像机视点 
  15.     m_vUp = D3DXVECTOR3(0.0f, 1.0f, 0.0f);                  // 摄像机顶方向 
  16.     D3DXMatrixLookAtLH( &matView, &m_vPos, &m_vLookAt, &m_vUp ); 
  17.     m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView ); 
  18.     // 使用透视投影矩阵,设置摄像机视角, 
  19.     D3DXMATRIXA16 matProj; 
  20.      
  21.     D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI / 4, 4.0f/3.0f, 0.0001f, 2000.0f ); 
  22.     m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj ); 
  23.     // 设置其他变量 
  24.     m_vDirection = m_vLookAt - m_vPos; 
  25.     D3DXVec3Cross( &m_vRight, &m_vUp, &m_vDirection ); 
  26.     m_fCameraYawAngle = D3DX_PI; 
  27.     m_fCameraPitchAngle = 0; 
  28.     m_fSpeed = ZOOM*0.5; 
  29.     m_bIsRotaion = FALSE; 
  30. D3DCamera::~D3DCamera(void
  31.  
  32. // 名称: setCamera() 
  33. // 描述: 设置摄像机位置,看点 
  34. VOID D3DCamera::setCamera() 
  35.     D3DXMATRIXA16 matView; 
  36.     D3DXMatrixLookAtLH( &matView, &m_vPos, &m_vLookAt, &m_vUp ); 
  37.     m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView ); 
  38.  
  39. // 名称: resetCamera() 
  40. // 描述: 设置摄像机位置,看点 
  41. VOID D3DCamera::resetCamera() 
  42.     m_vPos = D3DXVECTOR3(0.0f, 0.0f, -WND_HEIGHT/2*ZOOM);   // 摄像机位置 
  43.     m_vLookAt = D3DXVECTOR3(0.0f, 0.0f, 0.0f);              // 摄像机视点 
  44.     m_vUp = D3DXVECTOR3(0.0f, 1.0f, 0.0f);                  // 摄像机顶方向 
  45.     m_vDirection = m_vLookAt - m_vPos; 
  46.     D3DXVec3Cross( &m_vRight, &m_vUp, &m_vDirection ); 
  47.     m_fCameraYawAngle = D3DX_PI; 
  48.     m_fCameraPitchAngle = 0; 
  49.     setCamera(); 
  50.  
  51. // 名称: applyCamera() 
  52. // 描述: 应用摄像机变换 
  53. VOID D3DCamera::applyCamera() 
  54.     POINT ptCurrentPos; 
  55.     POINT ptDeltaPos; 
  56.     if(m_bIsRotaion) 
  57.     { 
  58. // 计算鼠标偏移 
  59. GetCursorPos(&ptCurrentPos); 
  60. ptDeltaPos.x = ptCurrentPos.x - m_LastPoint.x; 
  61. ptDeltaPos.y = ptCurrentPos.y - m_LastPoint.y; 
  62. SetCursorPos(m_LastPoint.x,m_LastPoint.y); 
  63. //m_LastPoint = ptCurrentPos; 
  64. float fYaw = ptDeltaPos.x*0.0025f; 
  65. float fPitch = ptDeltaPos.y*0.0025f; 
  66. // 根据鼠标偏移计算欧拉角 
  67. m_fCameraYawAngle   += fYaw; 
  68. m_fCameraPitchAngle -= fPitch; 
  69. // 限定俯仰角大小 
  70. if(m_fCameraPitchAngle > D3DX_PI*0.49f) 
  71.   m_fCameraPitchAngle = D3DX_PI*0.49f; 
  72. else if(m_fCameraPitchAngle < -D3DX_PI*0.49f) 
  73.   m_fCameraPitchAngle = -D3DX_PI*0.49f; 
  74.     } 
  75.     // 根据欧拉角Yaw,Pitch计算摄像机的旋转矩阵 
  76.     D3DXMATRIX matCameraRotation; 
  77.     ZeroMemory(&matCameraRotation, sizeof(D3DXMATRIX)); 
  78.     D3DXMatrixRotationYawPitchRoll(&matCameraRotation, m_fCameraYawAngle,
  79.  m_fCameraPitchAngle,0.0f); 
  80.      
  81.     // 根据旋转矩阵将摄像机的朝向和顶方向变换 
  82.     D3DXVECTOR3 vWorldUp, vWorldAhead; 
  83.     D3DXVECTOR3 vLocalUp = D3DXVECTOR3(0,1,0); 
  84.     D3DXVECTOR3 vLocalAhead = D3DXVECTOR3(0,0,-WND_HEIGHT/2*ZOOM); 
  85.     D3DXVec3TransformCoord( &vWorldUp, &vLocalUp, &matCameraRotation ); 
  86.     D3DXVec3TransformCoord( &vWorldAhead, &vLocalAhead, &matCameraRotation ); 
  87.      
  88.     // 将局部偏移量转到全局坐标 
  89.     D3DXVECTOR3 vWorldDelta; 
  90.     D3DXVec3TransformCoord( &vWorldDelta, &m_vDelta, &matCameraRotation ); 
  91.      
  92.     // 根据偏移量计算视点位置 
  93.     m_vPos += vWorldDelta; 
  94.     if(m_vPos.y < 0) 
  95.         m_vPos.y = 0; 
  96.     if(m_vPos.y > ZOOM*200) 
  97.         m_vPos.y = ZOOM*200; 
  98.     m_vLookAt = m_vPos + vWorldAhead; 
  99.     // 设置摄像机 
  100.     setCamera(); 
  101.     // 更新变量 
  102.     m_vDirection = m_vLookAt - m_vPos; 
  103.     m_vUp = vWorldUp; 
  104.     D3DXVec3Cross( &m_vRight, &m_vUp, &m_vDirection ); 
  105.  
  106. // 名称: mouseProc() 
  107. // 描述: 鼠标消息处理 
  108. LRESULT D3DCamera::mouseProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) 
  109.     switch( msg ) 
  110.     { 
  111.     case WM_RBUTTONDOWN: 
  112.         { 
  113.             m_bIsRotaion = true
  114.             SetCapture(hWnd); 
  115.             GetCursorPos(&m_LastPoint); 
  116.         } 
  117.         break
  118.     case WM_RBUTTONUP: 
  119.         { 
  120.             m_bIsRotaion = false
  121.             ReleaseCapture(); 
  122.         } 
  123.         break
  124.     } 
  125.     return 0; 
  126.  
  127. // 名称: keyProc() 
  128. // 描述: 键盘消息处理 
  129. VOID D3DCamera::keyProc() 
  130.     static char _up = VK_SPACE; 
  131.     static char _down = 'X'
  132.     static char _left = 'A'
  133.     static char _right = 'D'
  134.     static char _head = 'W'
  135.     static char _back = 'S'
  136.     static char _reset = 'R'
  137.     m_vDelta = D3DXVECTOR3(0, 0, 0); 
  138.     if( GetKeyState(_head) & 0x80 ) 
  139.     { 
  140.         m_vDelta.z -= m_fSpeed; 
  141.     } 
  142.     if( GetKeyState(_back) & 0x80 ) 
  143.     { 
  144.         m_vDelta.z += m_fSpeed; 
  145.     } 
  146.     if( GetKeyState(_left) & 0x80 ) 
  147.     { 
  148.         m_vDelta.x += m_fSpeed; 
  149.     } 
  150.     if( GetKeyState(_right) & 0x80 ) 
  151.     { 
  152.         m_vDelta.x -= m_fSpeed; 
  153.     } 
  154.     if( GetKeyState(_up) & 0x80 ) 
  155.     { 
  156.         m_vPos.y += m_fSpeed; 
  157.     } 
  158.     if( GetKeyState(_down) & 0x80 ) 
  159.     { 
  160.         m_vPos.y -= m_fSpeed; 
  161.     } 
  162.     if( GetKeyState(_reset) & 0x80 ) 
  163.     { 
  164.         resetCamera(); 
  165.     } 

 

(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201008/9989.html]
本文出处:网络博客 作者:秩名
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容