Re: Rotation about 3 principal axes
- To: mathgroup at smc.vnet.net
- Subject: [mg94223] Re: Rotation about 3 principal axes
- From: dh <dh at metrohm.com>
- Date: Mon, 8 Dec 2008 06:22:54 -0500 (EST)
- References: <ghavrq$obo$1@smc.vnet.net>
Hi Robert,
rotation are a bit tricky. Your mistake lies in assuming that rotations
can be applied in any order. This is not true. It matters if you first
apply Rx and then Ry or first Ry and then Rx. Your code first aplies Rx
and the Ry.
So lets assume a 90 degree rotation around y and the some rotation
around x. The corresponding matrixes (for simplicity I am using 3D
ccordinates, not homogeneous coordinates like RotationTransform does) are:
Rx={{1, 0, 0}, {0, Cos[a], Sin[a]}, {0, -Sin[a], Cos[a]}}
Ry={{0, 0, 1}, {0, 1, 0}, {-1, 0, 0}}
calculating Ry.Rx gives:
{{0, -Sin[a], Cos[a]}, {0, Cos[a], Sin[a]}, {-1, 0, 0}}
you see the z-component of the result (from {-1,0,0}) is now constant,
that is we rotate by the angle a around the z-axis.
On the other hand, Rx.Ry gives:
{{0, 0, 1}, {-Sin[a], Cos[a], 0}, {-Cos[a], -Sin[a], 0}}
and you see that now the x component is not changed by the angle a, that
is, we have a rotation around the x axis. And this is what you assumed
in first place!
hope this helps, Daniel
robert prince-wright wrote:
> Can someone help me change the code below.
>
> The manipulate is meant to represent the effect of rotating a local coordinate set about angles 'ax', 'ay', 'az', these angles should be rotations about the global coordinates. If you use the sliders independently (i.e. with the other two angles set to zero) then it behaves as expected. However, if you change angle 'ay' to 90 (blue line downwards) and then slide 'ax' then the local coordinates rotate about the global z and not the desired global x. Somehow it is not using the rotation vectors inside the RotationTransform[ ]. I have tried various combinations including the use of Rotate[g,w,p], but the same think keeps happening.
>
>
>
> Manipulate[
> LCposition = N[{0, 0, 0}];
> xLocal := Line[{LCposition, LCposition + {1 , 0., 0.}}];
> yLocal := Line[{LCposition, LCposition + {0., 1 , 0.}}];
> zLocal := Line[{LCposition, LCposition + {0., 0., 1 }}];
> lc = {Thick, Blue, xLocal, Green, yLocal, Red, zLocal};
>
> Rx := RotationTransform[ ax Degree, {1, 0, 0}, {0, 0, 0}];
> Ry := RotationTransform[ ay Degree, {0, 1, 0}, {0, 0, 0}];
> Rz := RotationTransform[ az Degree, {0, 0, 1}, {0, 0, 0}];
>
> gx := GeometricTransformation[lc, Rx];
> gy := GeometricTransformation[gx, Ry];
> gz := GeometricTransformation[gy, Rz];
>
> Graphics3D[gz, PlotRange -> {{-3, 3}, {-3, 3}, {-3, 3}}],
> {{ax, 0}, -360, 360, 1, Appearance -> "Labeled"},
> {{ay, 0}, -360, 360, 1, Appearance -> "Labeled"},
> {{az, 0}, -360, 360, 1, Appearance -> "Labeled"}
> ]
>