Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
RotateHandle.cpp
Go to the documentation of this file.
1#include "RotateHandle.h"
2
3#include <iostream>
4#include <glm/ext/matrix_transform.hpp>
5#include <glm/gtc/type_ptr.hpp>
8
9
10RotateHandle::RotateHandle(SceneObject *tgt, Axis ax) : target(tgt), axis(ax) {}
11
13 glm::vec3 axisDirection = axisDir(axis);
14 glm::vec3& planeNormal = axisDirection;
15 glm::vec3 center = target->getPosition();
16
17 // Ray-plane intersection
18 float denom = glm::dot(ray.dir, planeNormal);
19 if (glm::abs(denom) < 1e-6f) return; // ray is parallel to plane
20
21 float t = glm::dot(center - ray.origin, planeNormal) / denom;
22 glm::vec3 currentHitPoint = ray.origin + t * ray.dir;
23
24 glm::vec3 from = glm::normalize(initialHitPoint - center);
25 glm::vec3 to = glm::normalize(currentHitPoint - center);
26
27 float angle = glm::atan(glm::dot(glm::cross(from, to), axisDirection), glm::dot(from, to));
28
29 glm::quat delta = glm::angleAxis(angle, axisDirection);
30
31 glm::quat finalQuat = delta * originalQuat;
32
33 target->setRotationQuat(finalQuat);
34}
35
36void RotateHandle::setDragState(glm::vec3 initHitPos) {
37 initialHitPoint = initHitPos;
38 originalQuat = target->getRotationQuat();
39}
40
42 glm::mat4 model(1.0f);
43 model = glm::translate(model, target->getPosition());
44 model = model * rotateFromYToAxis(axis);
45 model = glm::scale(model, glm::vec3(scale, scale, scale));
46 return model;
47}
Axis
Cardinal axes for handle orientation.
Definition Axis.h:7
constexpr glm::vec3 axisDir(Axis a)
Converts an axis enum to its corresponding unit vector.
Definition IHandle.h:17
static glm::mat4 rotateFromYToAxis(Axis axis)
Computes rotation matrix to align mesh from +Y to target axis.
Definition IHandle.h:127
glm::mat4 getModelMatrix() const override
Gets the model transformation matrix for rendering this handle.
void onDrag(const Math::Ray &ray) override
Handles continuous dragging motion.
RotateHandle(SceneObject *tgt, Axis ax)
void setDragState(glm::vec3 initHitPos) override
Initializes the drag operation state.
glm::vec3 getPosition() const
void setRotationQuat(const glm::quat &q)
glm::quat getRotationQuat() const
glm::vec3 origin
Starting point of the ray in world space.
Definition Ray.h:12
glm::vec3 dir
Direction vector (should be normalized)
Definition Ray.h:13
Represents a ray in 3D space.
Definition Ray.h:11