SimpleCamera.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. #include "SimpleCamera.h"
  2. #include "Bullet3Common/b3Vector3.h"
  3. #include "Bullet3Common/b3Quaternion.h"
  4. #include "Bullet3Common/b3Matrix3x3.h"
  5. struct SimpleCameraInternalData
  6. {
  7. SimpleCameraInternalData()
  8. :m_cameraTargetPosition(b3MakeVector3(0,0,0)),
  9. m_cameraDistance(20),
  10. m_cameraUp(b3MakeVector3(0,1,0)),
  11. m_cameraForward(b3MakeVector3(1,0,0)),
  12. m_cameraUpAxis(1),
  13. m_yaw(20),
  14. m_pitch(0),
  15. m_aspect(1),
  16. m_frustumZNear(0.01),
  17. m_frustumZFar(1000)
  18. {
  19. }
  20. b3Vector3 m_cameraTargetPosition;
  21. float m_cameraDistance;
  22. b3Vector3 m_cameraUp;
  23. b3Vector3 m_cameraForward;
  24. int m_cameraUpAxis;
  25. //the m_cameraPosition is a cached value, recomputed from other values
  26. b3Vector3 m_cameraPosition;
  27. float m_yaw;
  28. float m_pitch;
  29. float m_aspect;
  30. float m_frustumZNear;
  31. float m_frustumZFar;
  32. };
  33. SimpleCamera::SimpleCamera()
  34. {
  35. m_data = new SimpleCameraInternalData;
  36. }
  37. SimpleCamera::~SimpleCamera()
  38. {
  39. delete m_data;
  40. }
  41. static void b3CreateFrustum(
  42. float left,
  43. float right,
  44. float bottom,
  45. float top,
  46. float nearVal,
  47. float farVal,
  48. float frustum[16])
  49. {
  50. frustum[0*4+0] = (float(2) * nearVal) / (right - left);
  51. frustum[0*4+1] = float(0);
  52. frustum[0*4+2] = float(0);
  53. frustum[0*4+3] = float(0);
  54. frustum[1*4+0] = float(0);
  55. frustum[1*4+1] = (float(2) * nearVal) / (top - bottom);
  56. frustum[1*4+2] = float(0);
  57. frustum[1*4+3] = float(0);
  58. frustum[2*4+0] = (right + left) / (right - left);
  59. frustum[2*4+1] = (top + bottom) / (top - bottom);
  60. frustum[2*4+2] = -(farVal + nearVal) / (farVal - nearVal);
  61. frustum[2*4+3] = float(-1);
  62. frustum[3*4+0] = float(0);
  63. frustum[3*4+1] = float(0);
  64. frustum[3*4+2] = -(float(2) * farVal * nearVal) / (farVal - nearVal);
  65. frustum[3*4+3] = float(0);
  66. }
  67. #if 0
  68. static void b3CreateDiagonalMatrix(float value, float result[4][4])
  69. {
  70. for (int i=0;i<4;i++)
  71. {
  72. for (int j=0;j<4;j++)
  73. {
  74. if (i==j)
  75. {
  76. result[i][j] = value;
  77. } else
  78. {
  79. result[i][j] = 0.f;
  80. }
  81. }
  82. }
  83. }
  84. static void b3CreateOrtho(float left, float right, float bottom, float top, float zNear, float zFar, float result[4][4])
  85. {
  86. b3CreateDiagonalMatrix(1.f,result);
  87. result[0][0] = 2.f / (right - left);
  88. result[1][1] = 2.f / (top - bottom);
  89. result[2][2] = - 2.f / (zFar - zNear);
  90. result[3][0] = - (right + left) / (right - left);
  91. result[3][1] = - (top + bottom) / (top - bottom);
  92. result[3][2] = - (zFar + zNear) / (zFar - zNear);
  93. }
  94. #endif
  95. static void b3CreateLookAt(const b3Vector3& eye, const b3Vector3& center,const b3Vector3& up, float result[16])
  96. {
  97. b3Vector3 f = (center - eye).normalized();
  98. b3Vector3 u = up.normalized();
  99. b3Vector3 s = (f.cross(u)).normalized();
  100. u = s.cross(f);
  101. result[0*4+0] = s.x;
  102. result[1*4+0] = s.y;
  103. result[2*4+0] = s.z;
  104. result[0*4+1] = u.x;
  105. result[1*4+1] = u.y;
  106. result[2*4+1] = u.z;
  107. result[0*4+2] =-f.x;
  108. result[1*4+2] =-f.y;
  109. result[2*4+2] =-f.z;
  110. result[0*4+3] = 0.f;
  111. result[1*4+3] = 0.f;
  112. result[2*4+3] = 0.f;
  113. result[3*4+0] = -s.dot(eye);
  114. result[3*4+1] = -u.dot(eye);
  115. result[3*4+2] = f.dot(eye);
  116. result[3*4+3] = 1.f;
  117. }
  118. void SimpleCamera::setCameraUpAxis(int upAxis)
  119. {
  120. m_data->m_cameraUpAxis = upAxis;
  121. update();
  122. }
  123. int SimpleCamera::getCameraUpAxis() const
  124. {
  125. return m_data->m_cameraUpAxis;
  126. }
  127. void SimpleCamera::update()
  128. {
  129. int forwardAxis(-1);
  130. switch (m_data->m_cameraUpAxis)
  131. {
  132. case 1:
  133. forwardAxis = 2;
  134. m_data->m_cameraUp = b3MakeVector3(0,1,0);
  135. //gLightPos = b3MakeVector3(-50.f,100,30);
  136. break;
  137. case 2:
  138. forwardAxis = 1;
  139. m_data->m_cameraUp = b3MakeVector3(0,0,1);
  140. //gLightPos = b3MakeVector3(-50.f,30,100);
  141. break;
  142. default:
  143. {
  144. b3Assert(0);
  145. return;
  146. }
  147. };
  148. b3Vector3 eyePos = b3MakeVector3(0,0,0);
  149. eyePos[forwardAxis] = -m_data->m_cameraDistance;
  150. m_data->m_cameraForward = b3MakeVector3(eyePos[0],eyePos[1],eyePos[2]);
  151. if (m_data->m_cameraForward.length2() < B3_EPSILON)
  152. {
  153. m_data->m_cameraForward.setValue(1.f,0.f,0.f);
  154. } else
  155. {
  156. m_data->m_cameraForward.normalize();
  157. }
  158. // m_azi=m_azi+0.01;
  159. b3Scalar rele = m_data->m_yaw * b3Scalar(0.01745329251994329547);// rads per deg
  160. b3Scalar razi = m_data->m_pitch * b3Scalar(0.01745329251994329547);// rads per deg
  161. b3Quaternion rot(m_data->m_cameraUp,razi);
  162. b3Vector3 right = m_data->m_cameraUp.cross(m_data->m_cameraForward);
  163. b3Quaternion roll(right,-rele);
  164. eyePos = b3Matrix3x3(rot) * b3Matrix3x3(roll) * eyePos;
  165. m_data->m_cameraPosition = eyePos;
  166. m_data->m_cameraPosition+= m_data->m_cameraTargetPosition;
  167. }
  168. void SimpleCamera::getCameraProjectionMatrix(float projectionMatrix[16]) const
  169. {
  170. b3CreateFrustum(-m_data->m_aspect * m_data->m_frustumZNear, m_data->m_aspect * m_data->m_frustumZNear, -m_data->m_frustumZNear,m_data->m_frustumZNear, m_data->m_frustumZNear, m_data->m_frustumZFar,projectionMatrix);
  171. }
  172. void SimpleCamera::getCameraViewMatrix(float viewMatrix[16]) const
  173. {
  174. b3CreateLookAt(m_data->m_cameraPosition,m_data->m_cameraTargetPosition,m_data->m_cameraUp,viewMatrix);
  175. }
  176. void SimpleCamera::getCameraTargetPosition(double pos[3]) const
  177. {
  178. pos[0] =m_data->m_cameraTargetPosition[0];
  179. pos[1] =m_data->m_cameraTargetPosition[1];
  180. pos[2] =m_data->m_cameraTargetPosition[2];
  181. }
  182. void SimpleCamera::getCameraPosition(double pos[3]) const
  183. {
  184. pos[0] =m_data->m_cameraPosition[0];
  185. pos[1] =m_data->m_cameraPosition[1];
  186. pos[2] =m_data->m_cameraPosition[2];
  187. }
  188. void SimpleCamera::getCameraTargetPosition(float pos[3]) const
  189. {
  190. pos[0] =m_data->m_cameraTargetPosition[0];
  191. pos[1] =m_data->m_cameraTargetPosition[1];
  192. pos[2] =m_data->m_cameraTargetPosition[2];
  193. }
  194. void SimpleCamera::getCameraPosition(float pos[3]) const
  195. {
  196. pos[0] =m_data->m_cameraPosition[0];
  197. pos[1] =m_data->m_cameraPosition[1];
  198. pos[2] =m_data->m_cameraPosition[2];
  199. }
  200. void SimpleCamera::setCameraTargetPosition(float x,float y,float z)
  201. {
  202. m_data->m_cameraTargetPosition.setValue(x,y,z);
  203. update();
  204. }
  205. float SimpleCamera::getCameraDistance() const
  206. {
  207. return m_data->m_cameraDistance;
  208. }
  209. void SimpleCamera::setCameraDistance(float dist)
  210. {
  211. m_data->m_cameraDistance = dist;
  212. update();
  213. }
  214. void SimpleCamera::setCameraUpVector(float x,float y ,float z)
  215. {
  216. m_data->m_cameraUp.setValue(x,y,z);
  217. update();
  218. }
  219. void SimpleCamera::getCameraUpVector(float up[3]) const
  220. {
  221. up[0] = float(m_data->m_cameraUp[0]);
  222. up[1] = float(m_data->m_cameraUp[1]);
  223. up[2] = float(m_data->m_cameraUp[2]);
  224. }
  225. void SimpleCamera::setCameraYaw(float yaw)
  226. {
  227. m_data->m_yaw = yaw;
  228. update();
  229. }
  230. float SimpleCamera::getCameraYaw() const
  231. {
  232. return m_data->m_yaw;
  233. }
  234. void SimpleCamera::setCameraPitch(float pitch)
  235. {
  236. m_data->m_pitch = pitch;
  237. update();
  238. }
  239. void SimpleCamera::setAspectRatio(float ratio)
  240. {
  241. m_data->m_aspect = ratio;
  242. update();
  243. }
  244. float SimpleCamera::getCameraPitch() const
  245. {
  246. return m_data->m_pitch;
  247. }
  248. float SimpleCamera::getAspectRatio() const
  249. {
  250. return m_data->m_aspect;
  251. }