旋转前后的OpenGL翻译

4
以下是代码(摘自http://www.glprogramming.com/red/chapter03.html),关于如何绘制机器人的臂和肩膀,并通过用户输入对它们进行旋转:
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();

我理解绘制肩膀并旋转的代码。对于肩膀:首先,我们沿x轴向后平移一个单位,以便进行旋转时,它将以原点为支点旋转。然后,我们将其向前平移一个单位(沿x轴)。这个变换将应用于已缩放的立方体。
现在,我的问题是关于肘部的。为什么在旋转之前和之后都有向前沿x轴平移的变换?

首先,感谢您的回复。我现在明白了。但我的问题是,为什么我们要先沿着轴向前移动肘部一个单位(在旋转之前)。为什么我们不像肩膀那样先将肘部向左移动一个单位呢? - Favn Hghksd
1个回答

7
现在,我的问题是关于肘部的。为什么在旋转之前和之后都有一个x轴上的前向平移?
如果您想想象矩阵操作如何改变模型,那么您需要按相反的顺序“阅读”这些操作。这是因为矩阵堆栈中的当前矩阵会与新操作指定的矩阵相乘,而且这些矩阵按列主序存储(固定功能管道)。
从肘部立方体开始。
glutWireCube(1.0f);

arm 01

缩放肘部

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

arm 02

将其向右移动

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

arm 03

旋转肘部


注:本文涉及IT技术相关内容。
glRotatef(45.0f, 0.0f, 0.0f, 1.0f);

arm 04

将旋转的肘部向右移动

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

arm 05

画出肩膀的立方体

glutWireCube(1.0f);

arm 06

调整肩部比例

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

arm 07

将手臂(肘部和肩膀)向右移动

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

arm 08

旋转手臂

注:该图片为旋转手臂的示意图。
glRotatef(-15.0f, 0.0f, 0.0f, 1.0f);

arm 09

将手臂移动到最终位置(向左)


注:这里的“arm”指的是机械臂。
glTranslatef(-1.0f, 0.0f, 0.0f);

arm 10


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接