A fix for bug #96 (MNME's armature bug). The result of a
authorChris Want <cwant@ualberta.ca>
Thu, 24 Apr 2003 23:13:58 +0000 (23:13 +0000)
committerChris Want <cwant@ualberta.ca>
Thu, 24 Apr 2003 23:13:58 +0000 (23:13 +0000)
crossproduct was not checked for a zero vector.

source/blender/blenkernel/intern/armature.c

index 5fb87e58ecccd93ee7b25bb6e91e610dc8a39a54..e05e222284b6e6e5f9ff5a16d548e8fbe4e5dde0 100644 (file)
@@ -887,11 +887,27 @@ void make_boneMatrixvr (float outmatrix[][4],float delta[3], float roll)
 
        /*      Find Axis & Amount for bone matrix*/
        Crossf (axis,target,nor);
-       Normalise (axis);
-       theta=(float) acos (Inpf (target,nor));
 
-       /*      Make Bone matrix*/
-       VecRotToMat3(axis, theta, bMatrix);
+       if (Inpf(axis,axis) > 0.0000000000001) {
+               /* if nor is *not* a multiple of target ... */
+               Normalise (axis);
+               theta=(float) acos (Inpf (target,nor));
+
+               /*      Make Bone matrix*/
+               VecRotToMat3(axis, theta, bMatrix);
+       }
+       else {
+               /* if nor is a multiple of target ... */
+               float updown;
+
+               /* point same direction, or opposite? */
+               updown = ( Inpf (target,nor) > 0 ) ? 1.0 : -1.0;
+
+               /* I think this should work ... */
+               bMatrix[0][0]=updown; bMatrix[0][1]=0.0;    bMatrix[0][2]=0.0;
+               bMatrix[1][0]=0.0;    bMatrix[1][1]=updown; bMatrix[1][2]=0.0;
+               bMatrix[2][0]=0.0;    bMatrix[2][1]=0.0;    bMatrix[2][2]=1.0;
+       }
 
        /*      Make Roll matrix*/
        VecRotToMat3(nor, roll, rMatrix);