旋转前后的 OpenGL 平移
OpenGL translation before and after a rotation
以下代码(摘自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?
如果您想想象矩阵运算如何改变模型,那么您需要 "read" 以相反的顺序进行运算。
这是因为矩阵堆栈的当前矩阵乘以新操作指定的矩阵并且矩阵以column-major顺序存储(固定功能管道)。
从肘部立方体开始
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);
以下代码(摘自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?
如果您想想象矩阵运算如何改变模型,那么您需要 "read" 以相反的顺序进行运算。 这是因为矩阵堆栈的当前矩阵乘以新操作指定的矩阵并且矩阵以column-major顺序存储(固定功能管道)。
从肘部立方体开始
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);