2012-10-30 278 views
0

我想在原点旋转之后翻译在世界空间中的对象。问题是,在我旋转一个物体的同时,它的局部坐标系也旋转了,所以它的轴不再与世界坐标轴平行。因此,例如,如果我需要将对象绕y轴旋转后将对象转换为点(3,0,5),我将无法做到这一点,因为对象的局部坐标系不是与世界坐标系相同。例如:OpenGL的 - 翻译后旋转

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 

我如何克服这个问题?

回答

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乘以(就像矩阵)从右到左到你组成矩阵的堆叠modelview的。

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

+0

感谢您的回复。但是我仍然没有看到如何在旋转后将对象自由转换为特定的坐标。 – Darius

+0

@ user1136506:首先旋转对象,然后翻译它。而且由于矩阵是正确的联合,转换为在执行glTranslate之前调用glRotate。 – datenwolf

+0

我得到它的工作。我有错误的想法,但清理了很多东西,谢谢! – Darius

-1

的OpenGL声明GPU以相反的顺序执行。

所以先翻译,然后旋转。

+1

OpenGL语句不会直接转换为GPU操作。实际上,历史上只有一个“GPU”并且OpenGL矩阵操作也从未在那一个上执行过。矩阵行为的方式是,因为它们是矩阵。而且它们不以相反的顺序“运行”。 – datenwolf