[Insight-users] Quaternions and Euler rotations
Blezek, Daniel J (GE, Research)
blezek at crd.ge.com
Fri Aug 24 10:57:23 EDT 2007
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 = RR;
axis = RR;
axis = RR;
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
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.
double RotX, RotY, RotZ;
RotX = InitialRotation * vnl_math::pi / 180.0;
RotY = InitialRotation * vnl_math::pi / 180.0;
RotZ = InitialRotation * 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..
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Insight-users