# Rotation around two fixed rotation axis

Hi,
I’m new to OpenGL and I try to rotate e.g. a cube around two
fixed world axis. I only managed to get one fixed axis and the
other coordinate or rotation axis move.

If I try

glRotatef(m_fAngleX, 1.0f, 0.0f, 0.0f);
glRotatef(m_fAngleY, 0.0f, 1.0f, 0.0f);

glCallList(Cube);

the x axis is the fixed rotation axis and the y axis moves

If I try it the other way round

glRotatef(m_fAngleY, 0.0f, 1.0f, 0.0f);
glRotatef(m_fAngleX, 1.0f, 0.0f, 0.0f);

the y axis is the fixed rotation axis and the x axis moves.
(the first used axis seems to be the fixed rotation axis).

Is there any possibility to use two fixed rotation axis
and how can I do it?
Roland

Easily. Change the second rotate axis so that it rotates about the correct axis. For example, lets say you first rotate about X. What you are really doing is rotating the coordinate system about X, so Y gets rotated into Y’. If you want to do a second rotation about Y instead of Y’, you must take Y and rotate it about X in opposite direction to get Y’’. Use Y’’ as the axis of the second rotation.

Or more clearly, to do a rotation about X and then Y, both fixed you need to do this:

r’=r * Mx (Mx is the rotation about X)
Y’’ = Y * Mx’ (Mx’ is the rotation about X in the opposite direction, i.e. inverse)
r’’ = r’ * My’’ (My’’ is the rotation about Y’’)
(r is the radius vector of any given point, r’ is an intermediate result, and r’’ is the final result)

[This message has been edited by DFrey (edited 02-26-2002).]

it seems to me that there might be a hint for
the solution of my problem also I’m aktually not sure
how to do it in OpenGL. Perhaps it’s too late today
or maybe I’m to stupid.
r’ is the rotated vector r with the rotation angle Mx?
=>
glRotatef(Mx, 1.0, 0.0, 0.0);

Now our Y has rotatet to Y’?
To get Y’’ we need to rotate with Mx’ again?
Mx’ = - Mx ?
=>
glRotatef(-Mx, 1.0, 0.0, 0.0);
Is that right?
(Hmm, now the first two glRotatef have undo each other?)
Even if I put glCallList(Cube) in between this two
glRotatef I’m not able to rotate around two fixed axis.
I think I misunderstand you here…

Now to get the r’’ I simply use
glRotatef(My’’,0.0,1.0,0.0); ??
and because the rotation angle My’’ is now the same as My I
could use
glRotatef(My,0.0,1.0,0.0); ??

I think I’m completely wrong. Can you help me again and write
a short example with the OpenGl functions or in which aspects
I’ve understand you wrong. That would be very great.
Roland

Originally posted by DFrey:
[b]Easily. Change the second rotate axis so that it rotates about the correct axis. For example, lets say you first rotate about X. What you are really doing is rotating the coordinate system about X, so Y gets rotated into Y’. If you want to do a second rotation about Y instead of Y’, you must take Y and rotate it about X in opposite direction to get Y’’. Use Y’’ as the axis of the second rotation.

Or more clearly, to do a rotation about X and then Y, both fixed you need to do this:

r’=r * Mx (Mx is the rotation about X)
Y’’ = Y * Mx’ (Mx’ is the rotation about X in the opposite direction, i.e. inverse)
r’’ = r’ * My’’ (My’’ is the rotation about Y’’)
(r is the radius vector of any given point, r’ is an intermediate result, and r’’ is the final result)

[This message has been edited by DFrey (edited 02-26-2002).][/b]

In my example, Mx, Mx’, and My’’ are rotation matrices. Of those, you only need to calculate Mx’. And Mx’ != -Mx, rather Mx’ = transpose of Mx. (transpose since for rotation matrices it is equal to the inverse). And then at that, since you are only multiplying the Y unit vector by that inverse matrix, you really only need to calculate one column of the matrix.

in pseudoish code:

y_axis_turned=Vector(0,1,0).Rotate(-angle_x, Vector(1,0,0))
glrotate(angle_x, Vector(1,0,0))
glrotate(angle_y, y_axis_turned)

[This message has been edited by DFrey (edited 02-26-2002).]

i,
thank you for your help. The last message made it more clear
to me.
y’’ = Mx’* y
=> | 1 0 0 | | 1 0 0 |
Mx = | 0 cos(a) -sin(a)| => Mx’(inverse…) = | 1 cos(a) sin(a) |
| 0 sin(a) cos(a)| | 1 -sin(a) cos(a) |
| 1 0 0 | |0| | 0 |
y’’ = | 1 cos(a) sin(a) | * |1| = | cos(a)|
| 1 -sin(a) cos(a) | |0| |-sin(a)|

Now we have the y_axis_turned (=y’’)
=>
glRotatef(angle_x, 1.0,0.0,0.0);
glRotatef(angl_y, 0, cos(M_PIangle_x/180), -sin(M_PIangle_x/180);

glCallList…

The interesting thing is that now I’ve calculated the rotated y axis
but then my x-axis rotates
=>
same result as
glRotatef(angl_y, 0.0, 1.0, 0.0);
glRotatef(angle_x, 1.0,0.0,0.0))

Ok now perhaps I’ve to calcluate the vector for my new x axis.
| cos(a) 0 -sin(a) |
My = | 0 1 0 | => My’(invers, transpon
| sin(a) 0 cos(a) |

``````   | cos(a)     0   sin(a) |
``````

My’ = | 0 1 0 |
|-sin(a) 0 cos(a) |

``````   | cos(a)     0   sin(a) | |1| |cos(a) |
``````

x’’ = | 0 1 0 |*|0|=| 0 |
|-sin(a) 0 cos(a) | |0| |-sin(a)|

But the next things doesn’t work
glRotatef(angle_y, 0.0, 1.0, 0.0);
glRotatef(angle_x, cos(M_PIangle_y/180),0.0,-sin(M_PIangle_y/180))
or
glRotatef(angl_y, 0, cos(M_PIangle_x/180), -sin(M_PIangle_x/180);
glRotatef(angle_x, cos(M_PIangle_y/180),0.0,-sin(M_PIangle_y/180));
doesn’t work.
What’s the problem?
some testprogramm files.
Bye
Roland

Originally posted by DFrey:
[b]In my example, Mx, Mx’, and My’’ are rotation matrices. Of those, you only need to calculate Mx’. And Mx’ != -Mx, rather Mx’ = transpose of Mx. (transpose since for rotation matrices it is equal to the inverse). And then at that, since you are only multiplying the Y unit vector by that inverse matrix, you really only need to calculate one column of the matrix.

in pseudoish code:

y_axis_turned=Vector(0,1,0).Rotate(-angle_x, Vector(1,0,0))
glrotate(angle_x, Vector(1,0,0))
glrotate(angle_y, y_axis_turned)

[This message has been edited by DFrey (edited 02-26-2002).][/b]