我试图在原点旋转它后转换世界空间中的对象。问题是,当我在原点处旋转对象后,它的局部坐标系也会旋转,因此它的轴不再与世界坐标轴平行。因此,例如,如果我需要在围绕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
我怎样才能克服这个?
答案 0 :(得分: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”,并且仅使用该4×4数字方案来变换v。 OpenGL不会“重新执行”所有矩阵乘法步骤。
答案 1 :(得分:-1)
opengl语句以相反的顺序在GPU上运行。
首先翻译然后旋转。