OpenGL translation before and after a rotation

余生颓废 提交于 2019-11-26 12:33:49

问题


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?


回答1:


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);

Scale the elbow

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

Move it to the right

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

Rotate the elbow

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

Move the rotated elbow to the right

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

Draw the shoulder cube

glutWireCube(1.0f);

Scale the shoulder

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

Move the arm (elbow and shoulder) to the right

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

Rotate the arm

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

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

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



来源:https://stackoverflow.com/questions/49236745/opengl-translation-before-and-after-a-rotation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!