Bugfix #3422
authorTon Roosendaal <ton@blender.org>
Mon, 21 Nov 2005 10:45:58 +0000 (10:45 +0000)
committerTon Roosendaal <ton@blender.org>
Mon, 21 Nov 2005 10:45:58 +0000 (10:45 +0000)
When using 'protection flags' for XYZ rotations, inserting keys in
Poses resulted in wrong interpolations (doing -270 degrees instead of
+90 for example). This caused by converting quaternion to euler and
back...
Solved it by correcting the quaternion in the end for the rotation
sign of the original quaternion.

NOTE: Pose animators should be aware that inserting rotations keys of
180 degrees or larger will still make the key rotate along the shortest
path.

source/blender/src/transform.c

index 4a8e1dded80d773b1133d7db1b441c30cc2e6e83..0602aa22e44e43f267e614c5d599827d644cba5a 100755 (executable)
@@ -1043,8 +1043,9 @@ static void protectedQuaternionBits(short protectflag, float *quat, float *oldqu
        /* this function only does the delta rotation */
        
        if(protectflag) {
-               float eul[3], oldeul[3];
+               float eul[3], oldeul[3], quat1[4];
                
+               QUATCOPY(quat1, quat);
                QuatToEul(quat, eul);
                QuatToEul(oldquat, oldeul);
                
@@ -1056,6 +1057,10 @@ static void protectedQuaternionBits(short protectflag, float *quat, float *oldqu
                        eul[2]= oldeul[2];
                
                EulToQuat(eul, quat);
+               /* quaternions flip w sign to accumulate rotations correctly */
+               if( (quat1[0]<0.0f && quat[0]>0.0f) || (quat1[0]>0.0f && quat[0]<0.0f) ) {
+                       QuatMulf(quat, -1.0f);
+               }
        }
 }