Open Source Tomb Raider Engine
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

Camera.cpp 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*!
  2. * \file src/Camera.cpp
  3. * \brief Camera class
  4. *
  5. * \author Mongoose
  6. * \author xythobuz
  7. */
  8. #include <stdio.h>
  9. #include <math.h>
  10. #include "Camera.h"
  11. Camera::Camera() {
  12. mViewDistance = 14.0f;
  13. mRotationDeltaX = 1.0f;
  14. mRotationDeltaY = 1.0f;
  15. mTheta = 0.0f;
  16. mTheta2 = 0.0f;
  17. mPos[0] = 0.0f;
  18. mPos[1] = 0.0f;
  19. mPos[2] = 0.0f;
  20. mTarget[0] = 0.0f;
  21. mTarget[1] = 0.0f;
  22. mTarget[2] = mViewDistance;
  23. mSide[0] = 1.0f;
  24. mSide[1] = 0.0f;
  25. mSide[2] = 0.0f;
  26. mUp[0] = 0.0f;
  27. mUp[1] = -1.0f; // 1.0f
  28. mUp[2] = 0.0f;
  29. mQ.setIdentity();
  30. }
  31. void Camera::getPosition(vec3_t pos) {
  32. pos[0] = mPos[0];
  33. pos[1] = mPos[1];
  34. pos[2] = mPos[2];
  35. }
  36. void Camera::getTarget(vec3_t target) {
  37. target[0] = mTarget[0];
  38. target[1] = mTarget[1];
  39. target[2] = mTarget[2];
  40. }
  41. vec_t Camera::getRadianYaw() {
  42. return mTheta;
  43. }
  44. vec_t Camera::getRadianPitch() {
  45. return mTheta2;
  46. }
  47. void Camera::setPosition(vec3_t pos) {
  48. mPos[0] = pos[0];
  49. mPos[1] = pos[1];
  50. mPos[2] = pos[2];
  51. }
  52. void Camera::setSensitivityX(vec_t sens) {
  53. mRotationDeltaX = sens;
  54. }
  55. void Camera::setSensitivityY(vec_t sens) {
  56. mRotationDeltaY = sens;
  57. }
  58. void Camera::update() {
  59. mTarget[2] = (mViewDistance * cosf(mTheta)) + mPos[2];
  60. mTarget[0] = (mViewDistance * sinf(mTheta)) + mPos[0];
  61. mTarget[1] = (mViewDistance * sinf(mTheta2)) + mPos[1]; // + height_offset;
  62. }
  63. void Camera::rotate(float angle, float x, float y, float z) {
  64. Quaternion t, n;
  65. Matrix matrix;
  66. vec_t side[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
  67. vec_t up[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
  68. vec_t look[4] = { 0.0f, 0.0f, -1.0f, 1.0f };
  69. matrix_t m;
  70. t.set(angle, x, y, z);
  71. n = mQ * t;
  72. n.normalize();
  73. n.getMatrix(m);
  74. matrix.setMatrix(m);
  75. matrix.multiply4v(side, mSide);
  76. matrix.multiply4v(look, mTarget);
  77. matrix.multiply4v(up, mUp);
  78. for (int i = 0; i < 3; ++i) {
  79. mSide[i] += mPos[i];
  80. mTarget[i] += mPos[i];
  81. mUp[i] += mPos[i];
  82. }
  83. mQ = n;
  84. }
  85. void Camera::command(enum camera_command cmd) {
  86. switch (cmd) {
  87. case CAMERA_ROTATE_UP:
  88. if (mTheta2 < (M_PI / 2)) {
  89. mTheta2 += mRotationDeltaY;
  90. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  91. }
  92. break;
  93. case CAMERA_ROTATE_DOWN:
  94. if (mTheta2 > -(M_PI / 2)) {
  95. mTheta2 -= mRotationDeltaY;
  96. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  97. }
  98. break;
  99. case CAMERA_ROTATE_RIGHT:
  100. mTheta += mRotationDeltaX;
  101. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  102. break;
  103. case CAMERA_ROTATE_LEFT:
  104. mTheta -= mRotationDeltaX;
  105. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  106. break;
  107. }
  108. }