[vtkusers] Transformation matrix for transforming one vector to another
David Gobbi
david.gobbi at gmail.com
Sat Dec 31 11:00:31 EST 2011
On Sat, Dec 31, 2011 at 8:24 AM, Donny Zimmerman
<donny.zimmerman at willowpointsoftware.com> wrote:
> If I have a plane perpendicular to one vector say {0, 1000, 0} how would I
> get the transformation matrix to transform it to be perpendicular to vector
> {975, -250, 600}. I would like to use the RotateX, RotateY, RotateZ and
> translate functions of vtkTransform to accomplish this. Any help?
This fits into the "advanced math" category, you can't do it with
any of the basic transform operations. The solution relies on
quaternions. Below is some code that generates the 3x3 rotation
matrix. Finding the translation and building a 4x4 matrix is left as
an exercise for the reader.
// Compute rotation matrix between two vectors
double vec[3];
vtkMath::Cross(normal1, normal2, vec);
double costheta = vtkMath::Dot(normal1, normal2);
double sintheta = vtkMath::Norm(vec);
double theta = atan2(sintheta, costheta);
if (sintheta != 0)
{
vec[0] /= sintheta;
vec[1] /= sintheta;
vec[2] /= sintheta;
}
// convert to quaternion
costheta = cos(0.5*theta);
sintheta = sin(0.5*theta);
double quat[4];
quat[0] = costheta;
quat[1] = vec[0]*sintheta;
quat[2] = vec[1]*sintheta;
quat[3] = vec[2]*sintheta;
// convert to matrix
double mat[3][3];
vtkMath::QuaternionToMatrix3x3(quat, mat);
-- David
More information about the vtkusers
mailing list