[Date Index]
[Thread Index]
[Author Index]
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.
Prev by Date:
**Re: I want to read numbers written in E-format.**
Next by Date:
**Re: using mma in a terminal: cursors doesn't work**
Previous by thread:
**Rotations.m package bug?**
Next by thread:
**Hermite Differential Equation**
| |