Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenGL translation before and after a rotation

The following is code (taken from http://www.glprogramming.com/red/chapter03.html) regarding how to draw a robot's arm and shoulder and rotating them by some user input:

glPushMatrix();
    glTranslatef (-1.0, 0.0, 0.0);
    glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
    glTranslatef (1.0, 0.0, 0.0);
    glPushMatrix();
        glScalef (2.0, 0.4, 1.0);
        glutWireCube (1.0);
    glPopMatrix();

    glTranslatef (1.0, 0.0, 0.0);
    glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
    glTranslatef (1.0, 0.0, 0.0);
    glPushMatrix();
        glScalef (2.0, 0.4, 1.0);
        glutWireCube (1.0);
    glPopMatrix();
glPopMatrix();  

glutSwapBuffers();

I understand the code for drawing the shoulder and rotating it. For the shoulder: first we translate it one unit back along the x-axis so that when we do the rotation, it rotates along the origin as a pivot. Then we translate it back (forward one unit on the x-axis). This transformation will be applied to the cube that has been scaled.

Now, my question is for the elbow. Why is there a translation forward on the x-axis both before and after the rotate?

like image 740
Favn Hghksd Avatar asked Nov 06 '25 16:11

Favn Hghksd


1 Answers

Now, my question is for the elbow. Why is there a translation forward on the x-axis both before and after the rotate?

If you want to imagine how the matrix operations change the model, then you need to "read" the operations in the reverse order. This is, because the current matrix of the matrix stack is multiplied by the matrix which is specified by the new operation and the matrices are stored in column-major order (fixed function pipeline).

Start with the elbow cube

glutWireCube(1.0f);

arm 01

Scale the elbow

glPushMatrix();
glScalef(2.0f, 0.4f, 1.0f);
glutWireCube(1.0f);
glPopMatrix();

arm 02

Move it to the right

glTranslatef(1.0f, 0.0f, 0.0f);

arm 03

Rotate the elbow

glRotatef(45.0f, 0.0f, 0.0f, 1.0f);

arm 04

Move the rotated elbow to the right

glTranslatef(1.0f, 0.0f, 0.0f);

arm 05

Draw the shoulder cube

glutWireCube(1.0f);

arm 06

Scale the shoulder

glPushMatrix();
glScalef(2.0f, 0.4f, 1.0f);
glutWireCube(1.0f);
glPopMatrix();

arm 07

Move the arm (elbow and shoulder) to the right

glTranslatef(1.0f, 0.0f, 0.0f);

arm 08

Rotate the arm

glRotatef(-15.0f, 0.0f, 0.0f, 1.0f);

arm 09

Move the arm to its final position (to the left)

glTranslatef(-1.0f, 0.0f, 0.0f);

arm 10

like image 124
Rabbid76 Avatar answered Nov 09 '25 10:11

Rabbid76



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!