From d5efb1435fb43db2931f0c4914dbb70f24969e23 Mon Sep 17 00:00:00 2001
From: Andreas Orthey <andreas.orthey@gmx.de>
Date: Sat, 31 May 2014 12:11:40 +0200
Subject: [PATCH] more efficient vector rotation without explicitly assigning
 quaternions

---
 src/math/transform.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/math/transform.cpp b/src/math/transform.cpp
index b8a8a380..408f5df1 100644
--- a/src/math/transform.cpp
+++ b/src/math/transform.cpp
@@ -316,8 +316,10 @@ Quaternion3f& Quaternion3f::inverse()
 
 Vec3f Quaternion3f::transform(const Vec3f& v) const
 {
-  Quaternion3f r = (*this) * Quaternion3f(0, v[0], v[1], v[2]) * (fcl::conj(*this));
-  return Vec3f(r.data[1], r.data[2], r.data[3]);
+  Vec3f u(getX(), getY(), getZ());
+  double s = getW();
+  Vec3f vprime = 2*u.dot(v)*u + (s*s - u.dot(u))*v + 2*s*u.cross(v);
+  return vprime;
 }
 
 Quaternion3f conj(const Quaternion3f& q)
-- 
GitLab