Re: Rotations.m package bug?
- To: mathgroup at yoda.physics.unc.edu
- Subject: Re: Rotations.m package bug?
- From: Peter Whaite <peta at cim.mcgill.ca>
- Date: Mon, 20 Dec 1993 11:29:59 -0500
GB> I think something is wrong here:
GB> Chop[RotationMatrix3D[00 Degree, 0 Degree, 0 Degree] //N]
GB> {{1., 0, 0}, {0, 1., 0}, {0, 0, 1.}}
GB> Chop[RotationMatrix3D[90 Degree, 0 Degree, 0 Degree] //N]
GB> {{0, 1., 0}, {-1., 0, 0}, {0, 0, 1.}}
GB> Chop[RotationMatrix3D[0 Degree, 90 Degree, 0 Degree] //N]
GB> {{1., 0, 0}, {0, 0, 1.}, {0, -1., 0}}
GB> Chop[RotationMatrix3D[0 Degree, 0 Degree, 90 Degree] //N]
GB> {{0, 1., 0}, {-1., 0, 0}, {0, 0, 1.}}
GB> Note that the 2nd and 3rd above are the same. The package uses
GB> Euler angles to specify the rotation (I'm not certain how
GB> the axes are aligned, but it doesn't really matter). It appears
GB> to be impossible to get rotation around each of the 3 principle
GB> axes.
GB> Am I making a mistake or is something wrong with RotationMatrix3D?
There are a couple of commonly used Euler angle conventions (consult a
graphics text). If Rx[a], Ry[b], and Rz[c] represent rotations about the x,
y, and z axes of angles a, b, and c respectively then I seem to recall that
the one with Mathematica is something like...
R[phi,theta,psi] = Rz[phi] . Rx[theta] . Rz[psi]
I wish this was documented in the Mathematica source. It caused me some grief
once too. Our convention is XYZ Euler angles.
R[phi,theta,psi] = Rz[phi] . Ry[theta] . Rx[psi]
Here's what I wrote to do that.
(* We use a different Euler angle convention than is found in
Geometry'Rotation' *)
RotateXYZShape::usage = "RotateXYZShape[graphics3D, ox, oy, oz] rotates
the three-dimensional graphics object by the specified XYZ Euler
angles."
RotateXYZShape[shape_, ox_, oy_, oz_ ] :=
Block[{rotmat = N[RotationMatrixXYZ[N[ox],N[oy],N[oz]]]},
shape /. { poly:Polygon[_] :> Map[(rotmat . #)&, poly, {2}],
line:Line[_] :> Map[(rotmat . #)&, line, {2}],
point:Point[_] :> Map[(rotmat . #)&, point,{1}] }
]
RotationMatrixXYZ[ox_,oy_,oz_] :=
{{Cos[oy]*Cos[oz], -(Cos[oy]*Sin[oz]), Sin[oy]},
{Cos[oz]*Sin[ox]*Sin[oy] + Cos[ox]*Sin[oz],
Cos[ox]*Cos[oz] - Sin[ox]*Sin[oy]*Sin[oz], -(Cos[oy]*Sin[ox])},
{-(Cos[ox]*Cos[oz]*Sin[oy]) + Sin[ox]*Sin[oz],
Cos[oz]*Sin[ox] + Cos[ox]*Sin[oy]*Sin[oz], Cos[ox]*Cos[oy]}}
RotateXYZ[vec:{_,_,_}, ox_, oy_, oz_] :=
RotationMatrixXYZ[ox,oy,oz] . vec
RotateXYZ[vec:{_,_,_}, ox_, oy_, oz_, pt:{_,_,_}] :=
pt + RotationMatrixXYZ[ox,oy,oz] . (vec - pt)
GB> Also, there's a discrepency between the order of the Euler angles
GB> in the definition of RoatationMatrix3D and where its called in
GB> Rotate3D in the same package (phi,theta,psi vs theta,pha,psi).
Yeah I saw that too. The parameters are passed to Rotate3D in the same order
so its internally consistent. It should be changed to be consistent with the
documentation.
Best of luck.