fixed rotation uh, being really rotaty 😭
This commit is contained in:
@@ -139,6 +139,20 @@ Camera Engine::makeCameraFromObject(const SceneObject& obj) const {
|
|||||||
return cam;
|
return cam;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
// Equivalent to glm::extractEulerAngleXYZ without depending on the experimental header.
|
||||||
|
glm::vec3 ExtractEulerXYZ(const glm::mat3& m) {
|
||||||
|
float T1 = std::atan2(m[2][1], m[2][2]);
|
||||||
|
float C2 = std::sqrt(m[0][0] * m[0][0] + m[1][0] * m[1][0]);
|
||||||
|
float T2 = std::atan2(-m[2][0], C2);
|
||||||
|
float S1 = std::sin(T1);
|
||||||
|
float C1 = std::cos(T1);
|
||||||
|
float T3 = std::atan2(S1 * m[0][2] - C1 * m[0][1], C1 * m[1][1] - S1 * m[1][2]);
|
||||||
|
// GLM's extractEulerAngleXYZ returns (-T1, -T2, -T3)
|
||||||
|
return glm::vec3(-T1, -T2, -T3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Engine::DecomposeMatrix(const glm::mat4& matrix, glm::vec3& pos, glm::vec3& rot, glm::vec3& scale) {
|
void Engine::DecomposeMatrix(const glm::mat4& matrix, glm::vec3& pos, glm::vec3& rot, glm::vec3& scale) {
|
||||||
pos = glm::vec3(matrix[3]);
|
pos = glm::vec3(matrix[3]);
|
||||||
scale.x = glm::length(glm::vec3(matrix[0]));
|
scale.x = glm::length(glm::vec3(matrix[0]));
|
||||||
@@ -150,7 +164,8 @@ void Engine::DecomposeMatrix(const glm::mat4& matrix, glm::vec3& pos, glm::vec3&
|
|||||||
if (scale.y != 0.0f) rotMat[1] /= scale.y;
|
if (scale.y != 0.0f) rotMat[1] /= scale.y;
|
||||||
if (scale.z != 0.0f) rotMat[2] /= scale.z;
|
if (scale.z != 0.0f) rotMat[2] /= scale.z;
|
||||||
|
|
||||||
rot = glm::eulerAngles(glm::quat_cast(rotMat));
|
// Use explicit XYZ extraction so yaw isn't clamped to [-90, 90] like glm::yaw/pitch/roll.
|
||||||
|
rot = ExtractEulerXYZ(rotMat);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::recordState(const char* /*reason*/) {
|
void Engine::recordState(const char* /*reason*/) {
|
||||||
|
|||||||
Reference in New Issue
Block a user