[Bf-blender-cvs] [d29cf49e9ab] master: Fix quaternion compatibility function

Campbell Barton noreply at git.blender.org
Tue Nov 26 16:01:13 CET 2019


Commit: d29cf49e9abea73e7e115d6164de11d1d5afd339
Author: Campbell Barton
Date:   Wed Nov 27 01:51:41 2019 +1100
Branches: master
https://developer.blender.org/rBd29cf49e9abea73e7e115d6164de11d1d5afd339

Fix quaternion compatibility function

Use closest quaternion instead of only checking w sign flipping,
which didn't catch all cases.

T

===================================================================

M	source/blender/blenlib/intern/math_rotation.c

===================================================================

diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c
index 94f0f523c6e..2a6652fa424 100644
--- a/source/blender/blenlib/intern/math_rotation.c
+++ b/source/blender/blenlib/intern/math_rotation.c
@@ -212,11 +212,13 @@ void quat_to_compatible_quat(float q[4], const float a[4], const float old[4])
   float old_unit[4];
   /* Skips `!finite_v4(old)` case too. */
   if (normalize_qt_qt(old_unit, old) > eps) {
+    float q_negate[4];
     float delta[4];
     rotation_between_quats_to_quat(delta, old_unit, a);
     mul_qt_qtqt(q, old, delta);
-    if ((q[0] < 0.0f) != (old[0] < 0.0f)) {
-      negate_v4(q);
+    negate_v4_v4(q_negate, q);
+    if (len_squared_v4v4(q_negate, old) < len_squared_v4v4(q, old)) {
+      copy_qt_qt(q, q_negate);
     }
   }
   else {



More information about the Bf-blender-cvs mailing list