aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2023-12-08 12:33:50 -0500
committersotech117 <michael_foiani@brown.edu>2023-12-08 12:33:50 -0500
commitaf7b163040e76c5bbd64742738653531e24e77e6 (patch)
tree9d53b418b1e82e2900ae3a07dfe4589849470f94 /src
parentda8da03ee0b45f3adb6d12d412610bd86cf93a3d (diff)
add 4d rotation ops and view matrix calculation
Diffstat (limited to 'src')
-rw-r--r--src/4dvecops/rotations4d.cpp88
-rw-r--r--src/4dvecops/vectoroperations.cpp33
-rw-r--r--src/raytracer/raytracer.h4
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);
};