旋转前后的OpenGL翻译

问题描述 投票:3回答:1

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

opengl coordinate-transformation opengl-compat
1个回答
4
投票

现在,我的问题是针对肘部。为什么在旋转之前和之后在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

旋转肘部

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

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

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

arm 10

© www.soinside.com 2019 - 2024. All rights reserved.