2014-10-02 113 views
0

Initial PoseAfter rotationUnwanted affectThe wanted affect我在OpenGL中编写了一个简单的应用程序。我有一个模型,我想围绕其中心旋转(局部坐标),然后将其与本地坐标一起翻译。我做了两个场景, 旋转然后翻译,反之亦然。在第一种情况下,我得到的旋转是正确的,但是模型根据世界坐标而不是模型(局部)坐标进行平移。当我首先翻译时,我得到了翻译的权利,但轮换不在模型中心附近。 这里的代码,对象坐标上的旋转和平移

glPushMatrix(); 

// ignore this 
/*glRotatef(_zRoll, 0.0, 0.0, 1.0); 
glRotatef(_yTilt, 1.0, 0.0, 0.0); 
glRotatef(_xPan, 0.0, 1.0, 0.0);*/ 
glScalef(scale, scale, scale); 
glTranslatef(0.0, 0.0, -2.0); 
glTranslatef(_xTranslate, _yTranslate, _zTranslate); // The required translation 
// The required rotation 
glRotatef(_yangle, 0.0, 1.0, 0.0); 
glRotatef(_zangle, 0.0, 0.0, 1.0); 
glRotatef(_xangle, 1.0, 0.0, 0.0); 
glTranslatef(coord.x, coord.y, coord.z); // translate to the model center 

glCallList(aHelix); 

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 

glPopMatrix(); 

glutSwapBuffers(); 
+1

*插入关于弃用的固定功能管道的标准免责声明*,目前的方法是使用着色器并管理自己的变换矩阵 – 2014-10-02 09:35:57

+0

不清楚你想要做什么以及你的值是什么意思。几个插图或截图与评论会很好。从我能够理解的,你需要先翻译,然后旋转。 – keltar 2014-10-02 11:07:22

+0

@keltar我想要做的事情基本上是将模型与旋转方向一起移动(平移)。例如,如果我将模型向左旋转90度(围绕z轴),然后沿-x轴移动对象,模型应向下移动(根据模型(局部)坐标,而不是按照左移世界坐标 – jouzef19 2014-10-03 07:44:46

回答

0

我想我现在你要寻找的理解。我会试图重申你想要的,所以请纠正我,如果我错了。

让我们用下面的顶点坐标(列是顶点)一个简单的模型:

[3 2 3 4] 
[5 2 3 2] 
[0 0 0 0] 
[1 1 1 1] 

所以第一点是在x = 3,Y = 5,Z = 0。绘制这个模型,我们得到:

Original model

如果我们简单地旋转模型(在这种情况下,由43 °),然后在Y方向(上),说4个单位转换,我们得到这样的:

Model rotated then translated Y

该模型现已移动单元4在Y方向上,但在世界坐标系。据我了解,以上结果是你不要想要的。

相反,如果我们翻译在它旋转后指向的方向模型,我们得到这样的:

Model rotated then translated at angle

这一点,我相信,是你的DO想要什么。这是我使用的代码。

glTranslatef(3.0, 3.0, 0.0); 
glTranslatef(-2.728, 2.924, 0.0); 
glRotatef(43.0, 0.0, 0.0, 1.0); 
glTranslatef(-3.0, -3.0, 0.0); 

我首先将模型旋转43度,然后根据更新的局部Y方向进行平移。我通过使用向量[0 4 0 0]并使用与该模型相同的旋转矩阵旋转它来获得硬编码的平移向量。这不是以编程方式直接进行的(至少在固定管道中),并且随后的旋转会变得更糟。

事实证明,虽然,你通过[0 4 0 0]首先进行翻译得到同样的结果(你可以手动验证),其次是旋转:

glTranslatef(3.0, 3.0, 0.0); 
glRotatef(43.0, 0.0, 0.0, 1.0); 
glTranslatef(0.0, 4.0, 0.0); 
glTranslatef(-3.0, -3.0, 0.0); 

这里的第二个结果比较组代码:

Model translated then rotated

的问题是,如果你做任何随后转/平移,您协调SY干仍然搞砸了。为了解决这个问题,您需要确保您使用累加器来进行旋转和平移,并将它们一次全部应用到原始模型,而不是进行小的增量更改。因此,每按一次向上箭头键,为您的_yTranslate变量添加一些增量值,对于每次按下“旋转”按钮,从_zangle开始加上或减去某个值,依此类推。

+0

是的,你有我想要提供的想法。您的解决方案实际上就是我所做的,并且在某种程度上起作用。谢谢 – jouzef19 2014-10-07 06:53:23