diff options
author | sotech117 <michael_foiani@brown.edu> | 2023-12-08 12:33:50 -0500 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2023-12-08 12:33:50 -0500 |
commit | af7b163040e76c5bbd64742738653531e24e77e6 (patch) | |
tree | 9d53b418b1e82e2900ae3a07dfe4589849470f94 /src | |
parent | da8da03ee0b45f3adb6d12d412610bd86cf93a3d (diff) |
add 4d rotation ops and view matrix calculation
Diffstat (limited to 'src')
-rw-r--r-- | src/4dvecops/rotations4d.cpp | 88 | ||||
-rw-r--r-- | src/4dvecops/vectoroperations.cpp | 33 | ||||
-rw-r--r-- | src/raytracer/raytracer.h | 4 |
3 files changed, 124 insertions, 1 deletions
diff --git a/src/4dvecops/rotations4d.cpp b/src/4dvecops/rotations4d.cpp new file mode 100644 index 0000000..62746eb --- /dev/null +++ b/src/4dvecops/rotations4d.cpp @@ -0,0 +1,88 @@ +#include "raytracer/raytracer.h" + +glm::mat4 getRotationMatrix4XY( + float angleRadians) { + glm::mat4 result; + result[0][0] = cos(angleRadians); + result[0][1] = -sin(angleRadians); + result[1][0] = sin(angleRadians); + result[1][1] = cos(angleRadians); + result[2][2] = 1; + result[3][3] = 1; + return result; +} + +glm::mat4 getRotationMatrix4YZ( + float angleRadians) { + glm::mat4 result; + result[1][1] = cos(angleRadians); + result[1][2] = -sin(angleRadians); + result[2][1] = sin(angleRadians); + result[2][2] = cos(angleRadians); + result[0][0] = 1; + result[3][3] = 1; + return result; +} + +glm::mat4 getRotationMatrix4ZX( + float angleRadians) { + glm::mat4 result; + result[2][2] = cos(angleRadians); + result[2][0] = -sin(angleRadians); + result[0][2] = sin(angleRadians); + result[0][0] = cos(angleRadians); + result[1][1] = 1; + result[3][3] = 1; + return result; +} + +glm::mat4 getRotationMatrix4XW( + float angleRadians) { + glm::mat4 result; + result[0][0] = cos(angleRadians); + result[0][3] = -sin(angleRadians); + result[3][0] = sin(angleRadians); + result[3][3] = cos(angleRadians); + result[1][1] = 1; + result[2][2] = 1; + return result; +} + +glm::mat4 getRotationMatrix4YW( + float angleRadians) { + glm::mat4 result; + result[1][1] = cos(angleRadians); + result[1][3] = -sin(angleRadians); + result[3][1] = sin(angleRadians); + result[3][3] = cos(angleRadians); + result[0][0] = 1; + result[2][2] = 1; + return result; +} + +glm::mat4 getRotationMatrix4ZW( + float angleRadians) { + glm::mat4 result; + result[2][2] = cos(angleRadians); + result[2][3] = -sin(angleRadians); + result[3][2] = sin(angleRadians); + result[3][3] = cos(angleRadians); + result[0][0] = 1; + result[1][1] = 1; + return result; +} + +glm::mat4 RayTracer::getRotationMatrix4( + float angleRadiansXY, + float angleRadiansYZ, + float angleRadiansZX, + float angleRadiansXW, + float angleRadiansYW, + float angleRadiansZW) { + return getRotationMatrix4XY(angleRadiansXY) * + getRotationMatrix4YZ(angleRadiansYZ) * + getRotationMatrix4ZX(angleRadiansZX) * + getRotationMatrix4XW(angleRadiansXW) * + getRotationMatrix4YW(angleRadiansYW) * + getRotationMatrix4ZW(angleRadiansZW); +}
\ No newline at end of file diff --git a/src/4dvecops/vectoroperations.cpp b/src/4dvecops/vectoroperations.cpp index d41dad3..a54b758 100644 --- a/src/4dvecops/vectoroperations.cpp +++ b/src/4dvecops/vectoroperations.cpp @@ -27,4 +27,37 @@ glm::vec4 dot4( glm::vec4 u, glm::vec4 v) { return {u[0] * v[0], u[1] * v[1], u[2] * v[2], u[3] * v[3]}; +} + +glm::mat4 getViewMatrix4( + glm::vec4 fromPoint, + glm::vec4 toPoint, + glm::vec4 upVector, + glm::vec4 overVector) { + + // calculate e3 basis vector, the transformation col of view matrix + if (glm::distance(fromPoint, toPoint) < 0.0001f) { + throw std::runtime_error("fromPoint and toPoint are the same"); + } + glm::vec4 e3 = glm::normalize(fromPoint - toPoint); + + // calculate e2 basis vector, from the combinatory cross of up and over with e3 + glm::vec4 e2 = cross4(upVector, overVector, e3); + e2 = glm::normalize(e2); + if (glm::distance(e2, glm::vec4{0, 0, 0, 1}) < 0.0001f) { + throw std::runtime_error("invalid up vector"); + } + + // calculate e1 basis vector, from the cross of only the over vector + glm::vec4 e1 = cross4(overVector, e3, e2); + e1 = glm::normalize(e1); + if (glm::distance(e1, glm::vec4{0, 0, 0, 1}) < 0.0001f) { + throw std::runtime_error("invalid over vector"); + } + + // calculate e0 basis vector, the 4d orthogonal vector to the other 3 bases + glm::vec4 e0 = cross4(e3, e2, e1); + e0 = glm::normalize(e0); + + return {e2, e1, e0, e3}; }
\ No newline at end of file diff --git a/src/raytracer/raytracer.h b/src/raytracer/raytracer.h index 5fbe907..f938dd6 100644 --- a/src/raytracer/raytracer.h +++ b/src/raytracer/raytracer.h @@ -155,6 +155,8 @@ public: void sceneChanged(QLabel* imageLabel); void settingsChanged(QLabel* imageLabel); RenderData m_metaData; - + + glm::mat4 getRotationMatrix4(float angleRadiansXY, float angleRadiansYZ, float angleRadiansZX, float angleRadiansXW, + float angleRadiansYW, float angleRadiansZW); }; |