From 4da864707c6dfc8ec1b5bf601bb6f3013d3c705b Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 23 Apr 2017 17:58:24 -0600 Subject: [PATCH] light: remove use of glm::quaternion --- light/settings.cc | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/light/settings.cc b/light/settings.cc index d975e21f..9481899c 100644 --- a/light/settings.cc +++ b/light/settings.cc @@ -20,8 +20,6 @@ #include -#include - glm::vec3 vec_from_mangle(const glm::vec3 &m) { const glm::vec3 tmp = m * static_cast(Q_PI / 180.0f); @@ -34,10 +32,21 @@ glm::vec3 vec_from_mangle(const glm::vec3 &m) glm::vec3 mangle_from_vec(const glm::vec3 &v) { + const glm::vec3 up(0, 0, 1); const glm::vec3 east(1, 0, 0); - const glm::quat rotationQuat = glm::rotation(east, v); - const glm::vec3 eulerAngles = glm::eulerAngles(rotationQuat); - const glm::vec3 mangle = glm::vec3(eulerAngles.z, -eulerAngles.y, 0) * static_cast(180.0f / Q_PI); + const glm::vec3 north(0, 1, 0); + + // get rotation about Z axis + float x = glm::dot(east, v); + float y = glm::dot(north, v); + float theta = atan2f(y, x); + + // get angle away from Z axis + float cosangleFromUp = glm::dot(up, v); + cosangleFromUp = qmin(qmax(-1.0f, cosangleFromUp), 1.0f); + float radiansFromUp = acosf(cosangleFromUp); + + const glm::vec3 mangle = glm::vec3(theta, -(radiansFromUp - Q_PI/2.0), 0) * static_cast(180.0f / Q_PI); return mangle; }