Open Source Tomb Raider Engine
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

Camera.cpp 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /*!
  2. * \file src/Camera.cpp
  3. * \brief OpenGL camera class
  4. *
  5. * \author Mongoose
  6. */
  7. #include <stdio.h>
  8. #include <math.h>
  9. #include "Camera.h"
  10. Camera::Camera() {
  11. mFlags = 0;
  12. mViewDistance = 14.0f;
  13. mTranslateDelta = 256.0f;
  14. mRotateDelta = OR_DEG_TO_RAD(15.0f);
  15. mRotateDelta2 = OR_DEG_TO_RAD(5.0f);
  16. mFlags &= Camera_FlyMode;
  17. reset();
  18. }
  19. void Camera::getPosition(vec3_t pos) {
  20. pos[0] = mPos[0];
  21. pos[1] = mPos[1];
  22. pos[2] = mPos[2];
  23. }
  24. void Camera::getUp(vec3_t up) {
  25. up[0] = mUp[0];
  26. up[1] = mUp[1];
  27. up[2] = mUp[2];
  28. }
  29. void Camera::getTarget(vec3_t target) {
  30. target[0] = mTarget[0];
  31. target[1] = mTarget[1];
  32. target[2] = mTarget[2];
  33. }
  34. float Camera::getYaw() {
  35. return OR_RAD_TO_DEG(mTheta);
  36. }
  37. vec_t Camera::getRadianYaw() {
  38. return mTheta;
  39. }
  40. vec_t Camera::getRadianPitch() {
  41. return mTheta2;
  42. }
  43. void Camera::rotate(float angle, float x, float y, float z) {
  44. Quaternion t, n;
  45. Matrix matrix;
  46. vec_t side[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
  47. vec_t up[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
  48. vec_t look[4] = { 0.0f, 0.0f, -1.0f, 1.0f };
  49. unsigned int i;
  50. matrix_t m;
  51. t.set(angle, x, y, z);
  52. n = mQ * t;
  53. n.normalize();
  54. n.getMatrix(m);
  55. matrix.setMatrix(m);
  56. matrix.multiply4v(side, mSide);
  57. matrix.multiply4v(look, mTarget);
  58. matrix.multiply4v(up, mUp);
  59. for (i = 0; i < 3; ++i) {
  60. mSide[i] += mPos[i];
  61. mTarget[i] += mPos[i];
  62. mUp[i] += mPos[i];
  63. }
  64. mQ = n;
  65. }
  66. void Camera::translate(float x, float y, float z) {
  67. int i;
  68. vec_t result[4];
  69. vec_t v[4];
  70. matrix_t m;
  71. Matrix matrix;
  72. v[0] = x;
  73. v[1] = y;
  74. v[2] = -z;
  75. v[3] = 1;
  76. m[0] = mSide[0] - mPos[0];
  77. m[1] = mUp[0] - mPos[0];
  78. m[2] = mTarget[0] - mPos[0];
  79. m[3] = 0;
  80. m[4] = mSide[1] - mPos[1];
  81. m[5] = mUp[1] - mPos[1];
  82. m[6] = mTarget[1] - mPos[1];
  83. m[7] = 0;
  84. m[8] = mSide[2] - mPos[2];
  85. m[9] = mUp[2] - mPos[2];
  86. m[10] = mTarget[2] - mPos[2];
  87. m[11] = 0;
  88. m[12] = 0;
  89. m[13] = 0;
  90. m[14] = 0;
  91. m[15] = 1;
  92. matrix.setMatrix(m);
  93. matrix.multiply4v(v, result);
  94. for (i = 0; i < 3; ++i) {
  95. mSide[i] += result[i];
  96. mUp[i] += result[i];
  97. mTarget[i] += result[i];
  98. mPos[i] += result[i];
  99. }
  100. mPos[0] = x;
  101. mPos[1] = y;
  102. mPos[2] = z;
  103. }
  104. void Camera::reset() {
  105. mTheta = 0.0f;
  106. mTheta2 = 0.0f;
  107. mPos[0] = 0.0f;
  108. mPos[1] = 0.0f;
  109. mPos[2] = 0.0f;
  110. mTarget[0] = 0.0f;
  111. mTarget[1] = 0.0f;
  112. mTarget[2] = mViewDistance;
  113. mSide[0] = 1.0f;
  114. mSide[1] = 0.0f;
  115. mSide[2] = 0.0f;
  116. mUp[0] = 0.0f;
  117. mUp[1] = 1.0f;
  118. mUp[2] = 0.0f;
  119. mQ.setIdentity();
  120. translate(0.0f, 0.0f, 0.0f);
  121. }
  122. void Camera::setSensitivityY(float angle) {
  123. mRotateDelta2 = OR_DEG_TO_RAD(angle);
  124. }
  125. void Camera::setSensitivityX(float angle) {
  126. mRotateDelta = OR_DEG_TO_RAD(angle);
  127. }
  128. void Camera::command(enum camera_command cmd) {
  129. switch (cmd) {
  130. case CAMERA_MOVE_FORWARD:
  131. if (mFlags & Camera_FlyMode)
  132. mPos[2] += (mTranslateDelta * cosf(mTheta));
  133. mPos[0] += (mTranslateDelta * sinf(mTheta));
  134. mPos[1] += (mTranslateDelta * sinf(mTheta2));
  135. break;
  136. case CAMERA_MOVE_BACKWARD:
  137. if (mFlags & Camera_FlyMode)
  138. mPos[2] -= (mTranslateDelta * cosf(mTheta));
  139. mPos[0] -= (mTranslateDelta * sinf(mTheta));
  140. mPos[1] -= (mTranslateDelta * sinf(mTheta2));
  141. break;
  142. case CAMERA_MOVE_LEFT:
  143. mPos[0] -= (mTranslateDelta * sinf(mTheta - 90.0f));
  144. mPos[2] -= (mTranslateDelta * cosf(mTheta - 90.0f));
  145. break;
  146. case CAMERA_MOVE_RIGHT:
  147. mPos[0] -= (mTranslateDelta * sinf(mTheta + 90.0f));
  148. mPos[2] -= (mTranslateDelta * cosf(mTheta + 90.0f));
  149. break;
  150. case CAMERA_ROTATE_UP:
  151. if (mTheta2 < (M_PI / 2)) {
  152. mTheta2 += mRotateDelta2;
  153. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  154. }
  155. break;
  156. case CAMERA_ROTATE_DOWN:
  157. if (mTheta2 > -(M_PI / 2)) {
  158. mTheta2 -= mRotateDelta2;
  159. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  160. }
  161. break;
  162. case CAMERA_ROTATE_RIGHT:
  163. mTheta += mRotateDelta;
  164. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  165. break;
  166. case CAMERA_ROTATE_LEFT:
  167. mTheta -= mRotateDelta;
  168. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  169. break;
  170. case CAMERA_MOVE_UP:
  171. mPos[1] -= mTranslateDelta / 2.0f;
  172. mTarget[1] -= mTranslateDelta / 2.0f;
  173. break;
  174. case CAMERA_MOVE_DOWN:
  175. mPos[1] += mTranslateDelta / 2.0f;
  176. mTarget[1] += mTranslateDelta / 2.0f;
  177. break;
  178. case CAMERA_SPEED_UP:
  179. ++mTranslateDelta;
  180. break;
  181. case CAMERA_SPEED_DOWN:
  182. if (--mTranslateDelta < 0.0f)
  183. mTranslateDelta = 1.0f;
  184. break;
  185. }
  186. }
  187. void Camera::setSpeed(float s) {
  188. mTranslateDelta = s;
  189. }
  190. void Camera::update() {
  191. mTarget[2] = (mViewDistance * cosf(mTheta)) + mPos[2];
  192. mTarget[0] = (mViewDistance * sinf(mTheta)) + mPos[0];
  193. mTarget[1] = (mViewDistance * sinf(mTheta2)) + mPos[1]; // + height_offset;
  194. }
  195. void Camera::setPosition(vec3_t pos) {
  196. mPos[0] = pos[0];
  197. mPos[1] = pos[1];
  198. mPos[2] = pos[2];
  199. }
  200. void Camera::setUp(vec3_t up) {
  201. mUp[0] = up[0];
  202. mUp[1] = up[1];
  203. mUp[2] = up[2];
  204. }
  205. void Camera::setTarget(vec3_t target) {
  206. mTarget[0] = target[0];
  207. mTarget[1] = target[1];
  208. mTarget[2] = target[2];
  209. }