2
0

PerspectiveCamera.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "anki/scene/PerspectiveCamera.h"
  2. namespace anki {
  3. //==============================================================================
  4. // setAll =
  5. //==============================================================================
  6. void PerspectiveCamera::setAll(float fovx_, float fovy_, float znear_,
  7. float zfar_)
  8. {
  9. fovX = fovx_;
  10. fovY = fovy_;
  11. zNear = znear_;
  12. zFar = zfar_;
  13. calcProjectionMatrix();
  14. calcLSpaceFrustumPlanes();
  15. }
  16. //==============================================================================
  17. // calcProjectionMatrix =
  18. //==============================================================================
  19. void PerspectiveCamera::calcProjectionMatrix()
  20. {
  21. float f = 1.0 / tan(fovY * 0.5); // f = cot(fovY/2)
  22. projectionMat(0, 0) = f * fovY / fovX; // = f/aspectRatio;
  23. projectionMat(0, 1) = 0.0;
  24. projectionMat(0, 2) = 0.0;
  25. projectionMat(0, 3) = 0.0;
  26. projectionMat(1, 0) = 0.0;
  27. projectionMat(1, 1) = f;
  28. projectionMat(1, 2) = 0.0;
  29. projectionMat(1, 3) = 0.0;
  30. projectionMat(2, 0) = 0.0;
  31. projectionMat(2, 1) = 0.0;
  32. projectionMat(2, 2) = (zFar + zNear) / ( zNear - zFar);
  33. projectionMat(2, 3) = (2.0 * zFar * zNear) / (zNear - zFar);
  34. projectionMat(3, 0) = 0.0;
  35. projectionMat(3, 1) = 0.0;
  36. projectionMat(3, 2) = -1.0;
  37. projectionMat(3, 3) = 0.0;
  38. invProjectionMat = projectionMat.getInverse();
  39. }
  40. //==============================================================================
  41. // calcLSpaceFrustumPlanes =
  42. //==============================================================================
  43. void PerspectiveCamera::calcLSpaceFrustumPlanes()
  44. {
  45. float c, s; // cos & sine
  46. Math::sinCos(Math::PI + fovX / 2, s, c);
  47. // right
  48. lspaceFrustumPlanes[FP_RIGHT] = Plane(Vec3(c, 0.0, s), 0.0);
  49. // left
  50. lspaceFrustumPlanes[FP_LEFT] = Plane(Vec3(-c, 0.0, s), 0.0);
  51. Math::sinCos((3 * Math::PI - fovY) * 0.5, s, c);
  52. // top
  53. lspaceFrustumPlanes[FP_TOP] = Plane(Vec3(0.0, s, c), 0.0);
  54. // bottom
  55. lspaceFrustumPlanes[FP_BOTTOM] = Plane(Vec3(0.0, -s, c), 0.0);
  56. // near
  57. lspaceFrustumPlanes[FP_NEAR] = Plane(Vec3(0.0, 0.0, -1.0), zNear);
  58. // far
  59. lspaceFrustumPlanes[FP_FAR] = Plane(Vec3(0.0, 0.0, 1.0), -zFar);
  60. }
  61. } // end namespace