LiFeng_Camera.cpp
上传用户:dfjhuyju
上传日期:2013-03-13
资源大小:11035k
文件大小:5k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #pragma comment(lib, "winmm.lib")
  2. #include "LiFeng.h"
  3. #include "StdAfx.h"
  4. #include "LiFeng_Camera.h"
  5. #include <math.h>
  6. LiFeng_Camera::Init(HWND wnd)
  7. {
  8. hwnd = wnd;
  9. }
  10. LiFeng_Camera::LiFeng_Camera()
  11. {
  12. CVector3 vZero = CVector3(0.0, 0.0, 0.0);
  13. CVector3 vView = CVector3(0.0, 1.0, 0.5);
  14. CVector3 vUp   = CVector3(0.0, 0.0, 1.0);
  15. m_vPosition = vZero;
  16. m_vView = vView;
  17. m_vUpVector = vUp;
  18. m_Role = false;
  19. Role_Flag = false;
  20. }
  21. void LiFeng_Camera::PositionCamera(float positionX, float positionY, float positionZ,
  22.         float viewX,     float viewY,     float viewZ,
  23.  float upVectorX, float upVectorY, float upVectorZ)
  24. {
  25. CVector3 vPosition = CVector3(positionX, positionY, positionZ);
  26. CVector3 vView = CVector3(viewX, viewY, viewZ);
  27. CVector3 vUpVector = CVector3(upVectorX, upVectorY, upVectorZ);
  28. m_vPosition = vPosition;
  29. m_vView     = vView;
  30. m_vUpVector = vUpVector;
  31. }
  32. void LiFeng_Camera::SetViewByMouse(int w,int h,BOOL rol)
  33. {
  34. POINT mousePos;
  35. int middleX = w/2;
  36. int middleY = h/2;
  37. float angleY = 0.0f;
  38. float angleZ = 0.0f;
  39. static float currentRotX = 0.0f;
  40. GetCursorPos(&mousePos);
  41. if( (mousePos.x == middleX) && (mousePos.y == middleY) ) return;
  42. SetCursorPos(middleX, middleY);
  43. angleY = (float)( (middleX - mousePos.x) ) / 500.0f;
  44. angleZ = (float)( (middleY - mousePos.y) ) / 500.0f;
  45. currentRotX -= angleZ;  
  46. if(rol!=m_Role)
  47. {
  48. m_Role = rol;
  49. }
  50. else
  51. {
  52. if(currentRotX > 2.0f)
  53. currentRotX = 2.0f;
  54. else if(currentRotX < -2.0f)
  55. currentRotX = -2.0f;
  56. else
  57. {
  58. CVector3 vAxis = Cross(m_vView - m_vPosition, m_vUpVector);
  59. vAxis = Normalize(vAxis);
  60. if(fabs(angleZ)>=fabs(angleY))
  61. {
  62. RotateView(angleZ, vAxis.x, vAxis.y, vAxis.z);
  63. }
  64. else
  65. {
  66. RotateView(angleY, 0, 1, 0);
  67. }
  68. }
  69. }
  70. }
  71. void LiFeng_Camera::RotateView(float angle, float x, float y, float z)
  72. {
  73. CVector3 vNewView;
  74. CVector3 vView = m_vView - m_vPosition;
  75. float cosTheta = (float)cos(angle);
  76. float sinTheta = (float)sin(angle);
  77. vNewView.x  = (cosTheta + (1 - cosTheta) * x * x) * vView.x;
  78. vNewView.x += ((1 - cosTheta) * x * y - z * sinTheta) * vView.y;
  79. vNewView.x += ((1 - cosTheta) * x * z + y * sinTheta) * vView.z;
  80. vNewView.y  = ((1 - cosTheta) * x * y + z * sinTheta) * vView.x;
  81. vNewView.y += (cosTheta + (1 - cosTheta) * y * y) * vView.y;
  82. vNewView.y += ((1 - cosTheta) * y * z - x * sinTheta) * vView.z;
  83. vNewView.z  = ((1 - cosTheta) * x * z - y * sinTheta) * vView.x;
  84. vNewView.z += ((1 - cosTheta) * y * z + x * sinTheta) * vView.y;
  85. vNewView.z += (cosTheta + (1 - cosTheta) * z * z) * vView.z;
  86. m_vView = m_vPosition + vNewView;
  87. }
  88. void LiFeng_Camera::StrafeCamera(float speed)
  89. {
  90. m_vPosition.x += m_vStrafe.x * speed;
  91. m_vPosition.z += m_vStrafe.z * speed;
  92. // Add the strafe vector to our view
  93. m_vView.x += m_vStrafe.x * speed;
  94. m_vView.z += m_vStrafe.z * speed;
  95. }
  96. void LiFeng_Camera::MoveCamera(float speed)
  97. {
  98. CVector3 vVector = m_vView - m_vPosition;
  99. vVector = Normalize(vVector);
  100. m_vPosition.x += vVector.x * speed;
  101. m_vPosition.y += vVector.y * speed;
  102. m_vPosition.z += vVector.z * speed;
  103. m_vView.x += vVector.x * speed;
  104. m_vView.y += vVector.y * speed;
  105. m_vView.z += vVector.z * speed;
  106. }
  107. void LiFeng_Camera::CheckForMovement(float speed)
  108. {
  109. if(GetKeyState(VK_UP) & 0x80 || GetKeyState('W') & 0x80) {
  110. MoveCamera(speed);
  111. }
  112. if(GetKeyState(VK_DOWN) & 0x80 || GetKeyState('S') & 0x80) {
  113. MoveCamera(-speed);
  114. }
  115. if(GetKeyState(VK_LEFT) & 0x80 || GetKeyState('A') & 0x80) {
  116. StrafeCamera(-speed);
  117. }
  118. if(GetKeyState(VK_RIGHT) & 0x80 || GetKeyState('D') & 0x80) {
  119. StrafeCamera(speed);
  120. }
  121. if(GetKeyState('M') & 0x80)
  122. {
  123. Role_Flag = true;
  124. ShowCursor(false);
  125. }
  126. if(GetKeyState('N') & 0x80)
  127. {
  128. Role_Flag = false;
  129. ShowCursor(true);
  130. }
  131. }
  132. void LiFeng_Camera::Update(int w,int h,float speed) 
  133. {
  134. CalculateHorizonVec();
  135. CalculateVerticalVec();
  136. ViewDerection = m_vView - m_vPosition;
  137. ViewDerection = Normalize(ViewDerection);
  138. CVector3 vCross = Cross(m_vView - m_vPosition, m_vUpVector);
  139. m_vStrafe = Normalize(vCross);
  140. if(Role_Flag)
  141. {
  142. SetViewByMouse(w,h,Role_Flag);
  143. }
  144. else
  145. {
  146. m_Role = false;
  147. }
  148. CheckForMovement(speed);
  149. }
  150. void LiFeng_Camera::Look()
  151. {
  152. gluLookAt(m_vPosition.x, m_vPosition.y, m_vPosition.z,
  153.   m_vView.x,  m_vView.y,     m_vView.z,
  154.   m_vUpVector.x, m_vUpVector.y, m_vUpVector.z);
  155. }
  156. void LiFeng_Camera::CalculateHorizonVec()
  157. {
  158. CVector3 frontderection;
  159. CVector3 horizonderection;
  160. CVector3 ViewVector=m_vPosition-m_vView;
  161. frontderection=CVector3(ViewVector.x,ViewVector.y,0);
  162. m_vStrafe=Cross(ViewVector,frontderection);
  163. Normalize(m_vStrafe);
  164. }
  165. void LiFeng_Camera::CalculateVerticalVec()
  166. {
  167. CVector3 ViewVector=m_vPosition-m_vView;
  168. VerticalVector=Cross(ViewVector,m_vStrafe);
  169. Normalize(VerticalVector);
  170. }