[Insight-users] Quaternions and Euler rotations

Tib itk at fete.ch
Fri Aug 24 13:36:40 EDT 2007

Yes, it works fine. Thanks a lot !
  ----- Original Message ----- 
  From: Blezek, Daniel J (GE, Research) 
  To: Nic 
  Cc: ITK 
  Sent: Friday, August 24, 2007 4:57 PM
  Subject: RE: [Insight-users] Quaternions and Euler rotations

  Hi Nic,

    Here's a good quaternion tutorial: http://www.itk.org/CourseWare/Training/QuaternionsI.pdf  I think you might want to read this first.  Versors are unit quaternions, i.e., they can't represent scaling.  You can set a itk::Versor using a vnl_quaternion -- http://www.itk.org/Doxygen/html/classitk_1_1Versor.html for documentation.

    From a quaternion, you can get the axis and angle as:




    From: Nic [mailto:itk at fete.ch] 
    Sent: Friday, August 24, 2007 10:26 AM
    To: Blezek, Daniel J (GE, Research)
    Subject: Re: [Insight-users] Quaternions and Euler rotations

    Ok, thx ! :)
    So, if I understand well, in my example:
    - RotX would be 0
    - RotY would be Pi
    - and RotZ an angle in radians

    But what about the angle of the versor I have to set for the rotation ? How do I compute it ?

    In my code now :

    axis[0] = RR[0];
    axis[1] = RR[1];
    axis[2] = RR[2];

    rotation.Set( axis, angleVersor);
    transform->SetRotation( rotation );
    registration->SetInitialTransformParameters( transform->GetParameters() );

    By the way, what is the rule you employ for setting your quaternion like this ? Or do you have a ressource on the web where it is explained how it works ?
    I never heard before about Quaternion, thus it's a bit new for me :)

    ----- Original Message ----- 
    From: Blezek, Daniel J (GE, Research) 
    To: Nic ; ITK 
    Sent: Friday, August 24, 2007 2:37 PM
    Subject: RE: [Insight-users] Quaternions and Euler rotations

    Hi Nic,

    Here is some example code, it uses the vnl package included with Inisght.  RMat contians the 3x3 rotation matrix, while RR contains the initialized Quaternion.

          // Rotate!
          double RotX, RotY, RotZ;
          RotX = InitialRotation[0] * vnl_math::pi / 180.0;
          RotY = InitialRotation[1] * vnl_math::pi / 180.0;
          RotZ = InitialRotation[2] * vnl_math::pi / 180.0;
          vnl_quaternion<double> Rx(vcl_sin(RotX/2.0), 0, 0, vcl_cos(RotX/2.0));
          vnl_quaternion<double> Ry(0, vcl_sin(RotY/2.0), 0, vcl_cos(RotY/2.0));
          vnl_quaternion<double> Rz(0, 0, vcl_sin(RotZ/2.0), vcl_cos(RotZ/2.0));

          vnl_quaternion<double> RR = Rx * Ry * Rz;
          vnl_matrix_fixed<double,3,3> RMat = RR.rotation_matrix_transpose();


    From: insight-users-bounces+blezek=crd.ge.com at itk.org [mailto:insight-users-bounces+blezek=crd.ge.com at itk.org] On Behalf Of Nic
    Sent: Friday, August 24, 2007 7:12 AM
    To: Insight Users
    Subject: [Insight-users] Quaternions and Euler rotations

        doing a 3D registration of two stacks as in example 8.6.1 and using itkVersorRigid3DTransform, I would like to calculate the 3 axis components and the angle of the Versor resulting from:
        - a rotation of a certain angle around z-axis
        - a 180°rotation around y-axis
        - no rotation around x-axis
    This is because I would like to initialize my transform before launching.
    Does anyone have an idea how to calculate it ? Seems that I have to calculate Quaternions; trying to do it actually but I not really used with..
    Thx, nic
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/insight-users/attachments/20070824/17d1fe67/attachment.html

More information about the Insight-users mailing list