From c40b7670166952bf813577044d2954f2125a8ef5 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Wed, 15 Feb 2012 18:28:08 +0100 Subject: [PATCH] Matrix to Quaternion conversion precision fix. See below links for reasoning, but in short, avoid sqrt and division of small values. It's also possible to normalize the quaternion after the conversion, but better precision is preferable. http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/ethan.htm --- include/assimp/quaternion.inl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/assimp/quaternion.inl b/include/assimp/quaternion.inl index b6394b8a3..9113848b8 100644 --- a/include/assimp/quaternion.inl +++ b/include/assimp/quaternion.inl @@ -69,12 +69,12 @@ bool aiQuaterniont::operator!= (const aiQuaterniont& o) const template inline aiQuaterniont::aiQuaterniont( const aiMatrix3x3t &pRotMatrix) { - TReal t = 1 + pRotMatrix.a1 + pRotMatrix.b2 + pRotMatrix.c3; + TReal t = pRotMatrix.a1 + pRotMatrix.b2 + pRotMatrix.c3; // large enough - if( t > static_cast(0.001)) + if( t > static_cast(0)) { - TReal s = sqrt( t) * static_cast(2.0); + TReal s = sqrt(1 + t) * static_cast(2.0); x = (pRotMatrix.c2 - pRotMatrix.b3) / s; y = (pRotMatrix.a3 - pRotMatrix.c1) / s; z = (pRotMatrix.b1 - pRotMatrix.a2) / s;