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.