旋转前后的 OpenGL 平移

Posted

技术标签:

【中文标题】旋转前后的 OpenGL 平移【英文标题】:OpenGL translation before and after a rotation 【发布时间】:2018-03-12 13:43:46 【问题描述】:

以下代码(取自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轴都向前平移?

【问题讨论】:

首先,感谢您的回复。我现在明白了。但我的问题是,为什么我们首先将肘部沿轴向前移动一个单位(在旋转之前)。为什么我们没有像肩膀一样将肘部第一个单位向左移动? 【参考方案1】:

现在,我的问题是关于肘部的。为什么旋转前后x轴上都有向前平移?

如果您想想象矩阵运算如何改变模型,那么您需要以相反的顺序“读取”这些运算。 这是因为矩阵堆栈的当前矩阵乘以新操作指定的矩阵,并且矩阵以列优先顺序存储(固定函数管道)。

从肘部立方体开始

glutWireCube(1.0f);

缩放肘部

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

向右移动

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

转动肘部

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

将旋转的肘部向右移动

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

绘制肩部立方体

glutWireCube(1.0f);

调整肩膀

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

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

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

旋转手臂

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

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

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

【讨论】:

以上是关于旋转前后的 OpenGL 平移的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 平移和旋转同时进行

OpenGL:组合平移/旋转/缩放矩阵或将它们分开?

使用 OpenGL 固定功能旋转和平移 2D 图像

OpenGL旋转和平移

OpenGL旋转和平移问题

OpenGL ES平移矩阵和旋转矩阵的左乘与右乘效果