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. m_fovy = D3DX_PI/4;
  9. m_Aspect = 1;
  10. m_zn = 1;
  11. m_zf = 20;
  12. }
  13. CZFXCamera::~CZFXCamera()
  14. {
  15. }
  16. void CZFXCamera::SetPosX(float x)
  17. {
  18. m_x = x;
  19. }
  20. void CZFXCamera::SetPosY(float y)
  21. {
  22. m_y = y;
  23. }
  24. void CZFXCamera::SetPosZ(float z)
  25. {
  26. m_z = z;
  27. }
  28. // 设置摄像机的镜头属性
  29. void CZFXCamera::SetProjProp(float zn, float zf, float fovy, float Aspect)
  30. {
  31. m_zn = zn;
  32. m_zf = zf;
  33. m_fovy = fovy;
  34. m_Aspect = Aspect;
  35. }
  36. // 改变摄像机镜头的广角属性,默认为增大广角(increase == ture, 当该值设为false时为缩小广角)
  37. // 默认每次增大为1度(当然这个值也可通过变量increment设置)
  38. void CZFXCamera::Change_fovy(bool increase, float increment)
  39. {
  40. m_fovy += (increase?increment:-increment);
  41. }
  42. D3DXVECTOR3* CZFXCamera::GetLookVec(D3DXVECTOR3* lookAtVec)
  43. {
  44. float cosPitch = cos(m_pitchAngle);
  45. float sinPitch = sin(m_pitchAngle);
  46. float cosYaw   = cos(m_yawAngle);
  47. float sinYaw   = sin(m_yawAngle);
  48. lookAtVec->x = cosPitch * sinYaw;
  49. lookAtVec->y = sinPitch;
  50. lookAtVec->z = cosPitch * cosYaw;
  51. return lookAtVec;
  52. }
  53. // 获取摄像机的视口矩阵
  54. D3DXMATRIX* CZFXCamera::GetViewMatrix(D3DXMATRIX* pMatView)
  55. {
  56. /*  D3DXMatrixLookAtLH Function in SDK interpretation
  57. zaxis = normal(At - Eye)
  58. xaxis = normal(cross(Up, zaxis))
  59. yaxis = cross(zaxis, xaxis)
  60. xaxis.x           yaxis.x           zaxis.x          0
  61. xaxis.y           yaxis.y           zaxis.y          0
  62. xaxis.z           yaxis.z           zaxis.z          0
  63. -dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  1
  64. */
  65. D3DXVECTOR3 zAxis, up, xAxis, yAxis;
  66. float cosPitch = cos(m_pitchAngle);
  67. float sinPitch = sin(m_pitchAngle);
  68. float cosYaw   = cos(m_yawAngle);
  69. float sinYaw   = sin(m_yawAngle);
  70. // 构造zAxis,构造时已是单位向量
  71. zAxis.x = cosPitch * sinYaw;
  72. zAxis.y = sinPitch;
  73. zAxis.z = cosPitch * cosYaw;
  74. // 构造up,构造时已是单位向量
  75. up.x = -sinPitch * sinYaw;
  76. up.y = cosPitch;
  77. up.z = -sinPitch * cosYaw;
  78. // 构造xAxis和yAxis
  79. D3DXVec3Cross( &xAxis, &up, &zAxis );
  80. D3DXVec3Cross( &yAxis, &zAxis, &xAxis );
  81. // Build the view matrix:
  82. D3DXVECTOR3 pos( m_x, m_y, m_z );
  83. float x = -D3DXVec3Dot(&xAxis, &pos);
  84. float y = -D3DXVec3Dot(&yAxis, &pos);
  85. float z = -D3DXVec3Dot(&zAxis, &pos);
  86. (*pMatView)(0,0) = xAxis.x; (*pMatView)(0, 1) = yAxis.x; (*pMatView)(0, 2) = zAxis.x; (*pMatView)(0, 3) = 0.0f;
  87. (*pMatView)(1,0) = xAxis.y; (*pMatView)(1, 1) = yAxis.y; (*pMatView)(1, 2) = zAxis.y; (*pMatView)(1, 3) = 0.0f;
  88. (*pMatView)(2,0) = xAxis.z; (*pMatView)(2, 1) = yAxis.z; (*pMatView)(2, 2) = zAxis.z; (*pMatView)(2, 3) = 0.0f;
  89. (*pMatView)(3,0) = x;       (*pMatView)(3, 1) = y;       (*pMatView)(3, 2) = z;       (*pMatView)(3, 3) = 1.0f;
  90. return pMatView;
  91. }
  92. // 获取摄像机的投影矩阵
  93. D3DXMATRIX* CZFXCamera::GetProjMatrix(D3DXMATRIX* pMatProj)
  94. {
  95. return D3DXMatrixPerspectiveFovLH(pMatProj, m_fovy, m_Aspect, m_zn, m_zf);;
  96. }
  97. // +z代表前进方向,+x代表向右方向
  98. void CZFXCamera::Walk(float x, float z)
  99. {
  100. float cosPitch = cos(m_pitchAngle);
  101. float sinPitch = sin(m_pitchAngle);
  102. float cosYaw   = cos(m_yawAngle);
  103. float sinYaw   = sin(m_yawAngle);
  104. m_z += z * cosPitch * cosYaw - x * cosPitch * sinYaw;
  105. m_x += z * cosPitch * sinYaw + x * cosPitch * cosYaw;
  106. m_y += z * sinPitch;
  107. }
  108. void CZFXCamera::Pitch(float fAngle)
  109. {
  110. m_pitchAngle += fAngle;
  111. }
  112. void CZFXCamera::Yaw(float fAngle)
  113. {
  114. m_yawAngle += fAngle;
  115. }