I've created an object that has about 7+ parts to it including its body and smaller parts that 'attach' to it in different places. My goal is to rotate the entire object. I tried to simply call glRotatef(angle, 0, 1, 0)
before constructing the entire object, but I realize that this seems to rotate 'everything' around the origin, no matter the translation. The following code was an attempt to rotate the body itself and rotate the attached parts to it.
// glRotatef(angle, 0, 1, 0); //old way of rotating the object
// body
glPushMatrix();
// movement
glTranslatef(subx, suby + y, subz);
//rotating the body itself
glRotatef(angle, 0, 1, 0);
// starting position of the body
glScalef(9.0, 1.75, 1.75);
glTranslatef(-subx, -suby, -subz);
glTranslatef(subx, suby, subz);
glutSolidSphere(1.0, 50, 50);
glPopMatrix();
// attached part
glPushMatrix();
// movement
glTranslatef(rot1x, rot1y + y, rot1z);
// attempting to rotate the part while 'attached to' the body
glRotatef(angle, 0, 1, 0);
//placing the part on the object in starting position
glRotatef(rot1angle, rot1xrot, rot1yrot, rot1zrot);
glTranslatef(-rot1x, -rot1y, -rot1z);
glTranslatef(rot1x, rot1y, rot1z);
gluPartialDisk(gluNewQuadric(), 0, 1, 50, 1, 0, 100.0);
glPopMatrix();
I can't seem to wrap my head around what needs to happen in order for the smaller parts of the object to rotate properly with the object's body (a fixed point?). Thanks for your help.
The operations on the matrix stack are based on one another. The reference system of each operation is the current transformation. If you want to transform a object which consists of a bunch of objects, then you have to know the relative position of each sub object to a reference position of the object union. Then you have to do the following steps:
glTranslate
).glRotate
)See the documentation of
glTranslate
:and see the documentation of
glRotate
:Note, the translation matrix looks like this:
And the rotation matrix around Y-Axis looks like this:
A matrix multiplication works like this:
The result of
translate * rotate
is this:Note, the result of
rotate * translate
would be:you are missing
glMatrixMode
callsIf you are using only
GL_MODELVIEW
than it works (if lastly set active) but when your code grows longer and you add other calls you might broke this and suddenly your code will not work as expected (and very hard to debug). Therefore it is better to addglMatrixMode(GL_MODELVIEW);
before any transformation chunk of code.You are
push/pop
ing wronglyYour objects are nested so the matrices must be nested too. That means any part attached to owner part must start with the owners part matrix. So you need to have some hierarchy of the parts (assembly order) so you know what parts are attached to which ones and where.
so You should have a list of parts connected to any part ... Something like:
so any
part[i], i=<0,noOfObj-1>
has children partspart[i][0,1,2...,part[i].num-1]
connected to it (wherenum
is size of the list). Andpart[0]
is the main part. That changes things a bit but simple recursion helps:Now beware that
subPosX/Y/Z
positions must be in parent part coordinate system. Also This will not work for cyclicly nested objects (loops) as that would lead to infinite loop causing stack overflow.