diff options
author | sotech117 <michael_foiani@brown.edu> | 2023-12-13 14:53:30 -0500 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2023-12-13 14:53:30 -0500 |
commit | 0cc651b784afef1200b34af1f6248c7f4ac75b44 (patch) | |
tree | fdcba9b347de6a7eccc1e2e8b3d819a289edc5c5 /src | |
parent | e118c821460043c97e856eb780bd60f17570f278 (diff) |
add way to modify camera based on settings slider
Diffstat (limited to 'src')
-rw-r--r-- | src/camera/camera.cpp | 36 | ||||
-rw-r--r-- | src/camera/camera.h | 3 | ||||
-rw-r--r-- | src/raytracer/raytracer.cpp | 6 | ||||
-rw-r--r-- | src/raytracer/raytracescene.cpp | 2 | ||||
-rw-r--r-- | src/raytracer/raytracescene.h | 4 |
5 files changed, 30 insertions, 21 deletions
diff --git a/src/camera/camera.cpp b/src/camera/camera.cpp index 704be7e..fb63d77 100644 --- a/src/camera/camera.cpp +++ b/src/camera/camera.cpp @@ -5,28 +5,32 @@ #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> // Include this header for glm::rotate +void Camera::updateViewMatrix(SceneCameraData cameraData) { + m_viewMatrix = Vec4Ops::getViewMatrix4(cameraData.look, cameraData.up, cameraData.over); + // add settings.xy rotation + m_viewMatrix = glm::rotate(m_viewMatrix, glm::radians(settings.xy), glm::vec3(0.f, 1.f, 0.f)); + m_viewMatrix = glm::rotate(m_viewMatrix, glm::radians(settings.yz), glm::vec3(1.f, 0.f, 0.f)); + m_viewMatrix = glm::rotate(m_viewMatrix, glm::radians(settings.xz), glm::vec3(0.f, 0.f, 1.f)); + + m_translationVector = -cameraData.pos; + + m_inverseViewMatrix = glm::inverse(m_viewMatrix); + m_inverseTranslationVector = -m_translationVector; + m_controlPoints = { + {cameraData.pos[0], cameraData.pos[1], cameraData.pos[2]}, + {cameraData.pos[0], cameraData.pos[1] - 2.f, cameraData.pos[2] - 2.f}, + {cameraData.pos[0] + 2.f, cameraData.pos[1] + 2.f, cameraData.pos[2] -2.f}, + {cameraData.pos[0] + 2.f, cameraData.pos[1], cameraData.pos[2]} + }; +} + Camera::Camera(SceneCameraData cameraData) : m_pos(cameraData.pos), m_heightAngle(cameraData.heightAngle), m_focalLength(cameraData.focalLength), m_aperture(cameraData.aperture) { - m_viewMatrix = Vec4Ops::getViewMatrix4(cameraData.look, cameraData.up, cameraData.over); - // add settings.xy rotation - m_viewMatrix = glm::rotate(m_viewMatrix, glm::radians(settings.xy), glm::vec3(0.f, 1.f, 0.f)); - m_viewMatrix = glm::rotate(m_viewMatrix, glm::radians(settings.yz), glm::vec3(1.f, 0.f, 0.f)); - m_viewMatrix = glm::rotate(m_viewMatrix, glm::radians(settings.xz), glm::vec3(0.f, 0.f, 1.f)); - - m_translationVector = -cameraData.pos; - - m_inverseViewMatrix = glm::inverse(m_viewMatrix); - m_inverseTranslationVector = -m_translationVector; - m_controlPoints = { - {cameraData.pos[0], cameraData.pos[1], cameraData.pos[2]}, - {cameraData.pos[0], cameraData.pos[1] - 2.f, cameraData.pos[2] - 2.f}, - {cameraData.pos[0] + 2.f, cameraData.pos[1] + 2.f, cameraData.pos[2] -2.f}, - {cameraData.pos[0] + 2.f, cameraData.pos[1], cameraData.pos[2]} - }; + updateViewMatrix(cameraData); } glm::mat4 Camera::getViewMatrix() const { diff --git a/src/camera/camera.h b/src/camera/camera.h index 08750fb..37314c5 100644 --- a/src/camera/camera.h +++ b/src/camera/camera.h @@ -40,6 +40,8 @@ public: float cameraDepth = -1.f; std::vector<glm::vec3> m_controlPoints; + void updateViewMatrix(SceneCameraData cameraData); + private: glm::mat4 m_viewMatrix{}; glm::mat4 m_inverseViewMatrix{}; @@ -51,5 +53,6 @@ private: glm::vec4 m_translationVector{}; glm::vec4 m_inverseTranslationVector{}; + }; diff --git a/src/raytracer/raytracer.cpp b/src/raytracer/raytracer.cpp index 71a1c7f..b5e8986 100644 --- a/src/raytracer/raytracer.cpp +++ b/src/raytracer/raytracer.cpp @@ -54,9 +54,10 @@ void RayTracer::render(RGBA *imageData, const RayTraceScene &scene) { settings.currentTime++; // settings.w++; - // update physics + // update physics for moving objects Physics::updateShapePositions(m_metaData.shapes); Physics::handleCollisions(m_metaData.shapes); + } else { // done rendering // assemble the video saveFFMPEGVideo(settings.bulkOutputFolderPath); @@ -173,7 +174,8 @@ void RayTracer::sceneChanged(QLabel* imageLabel) { m_imageData = reinterpret_cast<RGBA *>(image.bits()); RayTraceScene rtScene{ m_width, m_height, m_metaData, m_depth }; - + // update the camera position + rtScene.m_camera.updateViewMatrix(m_metaData.cameraData); this->render(m_imageData, rtScene); QImage flippedImage = image.mirrored(false, false); diff --git a/src/raytracer/raytracescene.cpp b/src/raytracer/raytracescene.cpp index 77541e3..a81d535 100644 --- a/src/raytracer/raytracescene.cpp +++ b/src/raytracer/raytracescene.cpp @@ -57,7 +57,7 @@ const std::vector<SceneLightData> RayTraceScene::getLights() const { return m_lights; } -const Camera& RayTraceScene::getCamera() const { +const Camera RayTraceScene::getCamera() const { // Optional TODO: implement the getter or make your own design return m_camera; } diff --git a/src/raytracer/raytracescene.h b/src/raytracer/raytracescene.h index 35e4fb4..b608918 100644 --- a/src/raytracer/raytracescene.h +++ b/src/raytracer/raytracescene.h @@ -28,18 +28,18 @@ public: const std::vector<SceneLightData> getLights() const; // The getter of the shared pointer to the camera instance of the scene - const Camera& getCamera() const; + const Camera getCamera() const; KdTree *m_kdTree; bvh *m_bvh; const int &depth() const; + Camera& m_camera; private: int m_width; int m_height; SceneGlobalData m_sceneGlobalData; - Camera& m_camera; std::vector<RenderShapeData>m_shapes; std::vector<SceneLightData>m_lights; int m_depth; |