旋转前后的 OpenGL 平移

标签 opengl coordinate-transformation opengl-compat

以下是关于如何绘制机器人的 ARM 和肩膀并通过一些用户输入旋转它们的代码(取自 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 轴上都有向前平移?

最佳答案

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



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

从肘部立方体开始
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

转动肘部
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

将 ARM (肘部和肩部)向右移动
glTranslatef(1.0f, 0.0f, 0.0f);

arm 08

旋转 ARM
glRotatef(-15.0f, 0.0f, 0.0f, 1.0f);

arm 09

将 ARM 移动到最终位置(向左)
glTranslatef(-1.0f, 0.0f, 0.0f);

arm 10

关于旋转前后的 OpenGL 平移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49236745/

相关文章:

c++ - 当我在 OpenGL 中按下一个键时无法绘制六棱柱

opengl - 绑定(bind) OpenGL 纹理采样器

OpenGL NDC 和坐标

java - 理解 Java 代码背后的数学 : 2D Binary Space Partitioning

python坐标变换/插值可能吗?

c++ - glPushMatrix() glPopMatrix() 不起作用

c++ - OpenGL不考虑GL_DIFFUSE位置光的距离

c++ - 尝试使用 C++ 将着色器应用于 OpenGL 中的顶点数组的问题

opengl - 如何在片段着色器中进行自定义模板测试

c++ - 对三角形缠绕和变换感到困惑