zfxCamera.cpp
上传用户:junlon
上传日期:2022-01-05
资源大小:39075k
文件大小:3k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "zfxCamera.h"
  3. CZFXCamera::CZFXCamera()
  4. {
  5. m_x = m_y = m_z = 0;
  6. m_pitchAngle = 0;
  7. m_yawAngle = 0;
  8. }
  9. CZFXCamera::~CZFXCamera()
  10. {
  11. }
  12. void CZFXCamera::SetPosX(float x)
  13. {
  14. m_x = x;
  15. }
  16. void CZFXCamera::SetPosY(float y)
  17. {
  18. m_y = y;
  19. }
  20. void CZFXCamera::SetPosZ(float z)
  21. {
  22. m_z = z;
  23. }
  24. void CZFXCamera::GetLookVec(D3DXVECTOR3* lookAtVec)
  25. {
  26. float cosPitch = cos(m_pitchAngle);
  27. float sinPitch = sin(m_pitchAngle);
  28. float cosYaw   = cos(m_yawAngle);
  29. float sinYaw   = sin(m_yawAngle);
  30. lookAtVec->x = cosPitch * sinYaw;
  31. lookAtVec->y = sinPitch;
  32. lookAtVec->z = cosPitch * cosYaw;
  33. }
  34. void CZFXCamera::GetViewMatrix(D3DXMATRIX* pMatView)
  35. {
  36. /*  D3DXMatrixLookAtLH Function in SDK interpretation
  37. zaxis = normal(At - Eye)
  38. xaxis = normal(cross(Up, zaxis))
  39. yaxis = cross(zaxis, xaxis)
  40. xaxis.x           yaxis.x           zaxis.x          0
  41. xaxis.y           yaxis.y           zaxis.y          0
  42. xaxis.z           yaxis.z           zaxis.z          0
  43. -dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  1
  44. */
  45. D3DXVECTOR3 zAxis, up, xAxis, yAxis;
  46. float cosPitch = cos(m_pitchAngle);
  47. float sinPitch = sin(m_pitchAngle);
  48. float cosYaw   = cos(m_yawAngle);
  49. float sinYaw   = sin(m_yawAngle);
  50. // 构造zAxis,构造时已是单位向量
  51. zAxis.x = cosPitch * sinYaw;
  52. zAxis.y = sinPitch;
  53. zAxis.z = cosPitch * cosYaw;
  54. // 构造up,构造时已是单位向量
  55. up.x = -sinPitch * sinYaw;
  56. up.y = cosPitch;
  57. up.z = -sinPitch * cosYaw;
  58. // 构造xAxis和yAxis
  59. D3DXVec3Cross( &xAxis, &up, &zAxis );
  60. D3DXVec3Cross( &yAxis, &zAxis, &xAxis );
  61. // Build the view matrix:
  62. D3DXVECTOR3 pos( m_x, m_y, m_z );
  63. float x = -D3DXVec3Dot(&xAxis, &pos);
  64. float y = -D3DXVec3Dot(&yAxis, &pos);
  65. float z = -D3DXVec3Dot(&zAxis, &pos);
  66. (*pMatView)(0,0) = xAxis.x; (*pMatView)(0, 1) = yAxis.x; (*pMatView)(0, 2) = zAxis.x; (*pMatView)(0, 3) = 0.0f;
  67. (*pMatView)(1,0) = xAxis.y; (*pMatView)(1, 1) = yAxis.y; (*pMatView)(1, 2) = zAxis.y; (*pMatView)(1, 3) = 0.0f;
  68. (*pMatView)(2,0) = xAxis.z; (*pMatView)(2, 1) = yAxis.z; (*pMatView)(2, 2) = zAxis.z; (*pMatView)(2, 3) = 0.0f;
  69. (*pMatView)(3,0) = x;       (*pMatView)(3, 1) = y;       (*pMatView)(3, 2) = z;       (*pMatView)(3, 3) = 1.0f;
  70. }
  71. // +z代表前进方向,+x代表向右方向
  72. void CZFXCamera::Walk(float x, float z)
  73. {
  74. float cosPitch = cos(m_pitchAngle);
  75. float sinPitch = sin(m_pitchAngle);
  76. float cosYaw   = cos(m_yawAngle);
  77. float sinYaw   = sin(m_yawAngle);
  78. m_z += z * cosPitch * cosYaw - x * cosPitch * sinYaw;
  79. m_x += z * cosPitch * sinYaw + x * cosPitch * cosYaw;
  80. m_y += z * sinPitch;
  81. }
  82. void CZFXCamera::Pitch(float fAngle)
  83. {
  84. m_pitchAngle += fAngle;
  85. }
  86. void CZFXCamera::Yaw(float fAngle)
  87. {
  88. m_yawAngle += fAngle;
  89. }