MatrixToRotAxis is nummerically instable



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 09/09/2005 at 08:26, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   9.1 
    Platform:   Windows  ; Mac  ;  
    Language(s) :     C++  ;

    ---------
    Hello

    The problem in MatrixToRotAxis is this code

    // Achse berechnen
         v->x= m.v2.z-m.v3.y;
         v->y= m.v3.x-m.v1.z;
         v->z= m.v1.y-m.v2.x;
         *v = !(*v);

    if the matrix is near identity then v will be really small.. the normalization however will bring it to length 1. This results in an almost random unit vector. Which is now our rotation axis.. :-(

    My workaround is:

    Quaternion q;
         q.SetMatrix(LM(m));
         if(Len(q.v)<1.0e-6) {
              v = Vector(1,0,0);
              w = 0;
         }
         else {
              v = SV(!(q.v));
              w = 2.0*acos(q.w);
         }

    Not that you would call this efficient. But it seems to work.

    best regards
    Michael


Log in to reply