Camera.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "Camera.h"
  2. #include "GameEngine.h"
  3. #include "Utils.h"
  4. #include <cmath>
  5. Camera::Camera()
  6. {
  7. }
  8. Camera::Camera(const Camera& orig)
  9. {
  10. }
  11. Camera::~Camera()
  12. {
  13. }
  14. void Camera::storePosition()
  15. {
  16. oldCamera.set(camera);
  17. }
  18. void Camera::storeAngles()
  19. {
  20. oldLengthAngle = lengthAngle;
  21. oldWidthAngle = widthAngle;
  22. }
  23. void Camera::setPosition(float x, float y, float z)
  24. {
  25. camera.set(x, y, z);
  26. }
  27. void Camera::setAngles(float length, float width)
  28. {
  29. lengthAngle = length;
  30. widthAngle = width;
  31. }
  32. void Camera::updateView(float lag)
  33. {
  34. // -------------------------------------------------------------------------
  35. // calculate vectors for the view matrix
  36. // -------------------------------------------------------------------------
  37. // front
  38. front.setAngles(interpolate(lag, oldLengthAngle, lengthAngle), interpolate(lag, oldWidthAngle, widthAngle));
  39. // back
  40. back.setInverse(front);
  41. // right
  42. right.set(front);
  43. right.cross(0.0f, 1.0f, 0.0f);
  44. right.normalize();
  45. // left
  46. left.setInverse(right);
  47. // up
  48. up.set(front);
  49. up.cross(left);
  50. up.normalize();
  51. interCamera.set(oldCamera);
  52. interCamera.addMul(camera, lag);
  53. interCamera.addMul(oldCamera, -lag);
  54. view.set(0, 0, right.getX());
  55. view.set(0, 1, right.getY());
  56. view.set(0, 2, right.getZ());
  57. view.set(0, 3, right.dotInverse(interCamera));
  58. view.set(1, 0, up.getX());
  59. view.set(1, 1, up.getY());
  60. view.set(1, 2, up.getZ());
  61. view.set(1, 3, up.dotInverse(interCamera));
  62. view.set(2, 0, back.getX());
  63. view.set(2, 1, back.getY());
  64. view.set(2, 2, back.getZ());
  65. view.set(2, 3, back.dotInverse(interCamera));
  66. view.set(3, 0, 0.0f);
  67. view.set(3, 1, 0.0f);
  68. view.set(3, 0, 0.0f);
  69. view.set(3, 3, 1.0f);
  70. // -------------------------------------------------------------------------
  71. // calculate vectors for movement
  72. // -------------------------------------------------------------------------
  73. // front
  74. front.setY(0.0f);
  75. front.normalize();
  76. // back
  77. back.setInverse(front);
  78. // right
  79. right.set(front);
  80. right.cross(0.0f, 1.0f, 0.0f);
  81. right.normalize();
  82. // left
  83. left.setInverse(right);
  84. // up
  85. up.set(0.0f, 1.0f, 0.0f);
  86. // down
  87. down.setInverse(up);
  88. GameEngine::updateView(view);
  89. }
  90. const Vector3D& Camera::getFront()
  91. {
  92. return front;
  93. }
  94. const Vector3D& Camera::getBack()
  95. {
  96. return back;
  97. }
  98. const Vector3D& Camera::getRight()
  99. {
  100. return right;
  101. }
  102. const Vector3D& Camera::getLeft()
  103. {
  104. return left;
  105. }
  106. const Vector3D& Camera::getUp()
  107. {
  108. return up;
  109. }
  110. const Vector3D& Camera::getDown()
  111. {
  112. return down;
  113. }