1

我试图在原点旋转对象后在世界空间中平移对象。问题是,当我在原点旋转一个对象后,它的局部坐标系也会旋转,所以它的轴不再与世界坐标轴平行。因此,例如,如果我需要在围绕 y 轴旋转对象后将对象平移到点 (3, 0, 5),我将无法执行此操作,因为对象的局部坐标系不是与世界坐标系相同。例如:

glRotatef(45, 0.0, 1.0, 0.0);
glTranslatef(3.0, 0.0, 5.0);
glutSolidCube(1);               // This won't be at (3,0,5) like how I need it

我该如何克服呢?

4

2 回答 2

2

这与其说是 OpenGL 的属性,不如说是矩阵数学。

当您将顶点发送到 OpenGL 固定函数管道时,它会被矩阵模型视图和投影转换,即

 v_eye = MODELVIEW · v
v_clip = PROJECTION · v_eye

现在模型视图矩阵由所有这些子变换组成。而且它们是不可交换的,即操作顺序很重要。例如

MODELVIEW = T_0 · R_0 · R_1 · T_1 · S_1 · R_2

现在您可以将上面的 v_eye 计算重写为

v_eye = T_0 · ( R_0 · ( R_1 · (T_1 · (S_1 · (R_2 · v)))))

如您所见,v 从右到左乘以(就像矩阵一样)到您组成模型视图的矩阵堆栈上。

然而,在 OpenGL 中发生的事情是,计算一个矩阵“MODELVIEW”,并且 v 仅使用 4×4 数字方案进行转换。OpenGL 不会“重新执行”所有矩阵乘法步骤。

于 2012-10-30T07:59:50.383 回答
-1

opengl 语句以相反的顺序在 GPU 上运行。

所以先翻译再旋转。

于 2012-10-30T07:05:29.757 回答