0

初始姿势 旋转后不需要的影响 想要的影响我正在用 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();
4

1 回答 1

0

我想我现在明白你在找什么了。我会尝试重申你想要的,所以如果我弄错了,请纠正我。

让我们采用具有以下顶点坐标(列是顶点)的简单模型:

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

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

原始型号

如果我们简单地旋转模型(在本例中为 43°),然后在 Y 方向(向上)平移它,比如 4 个单位,我们得到:

模型旋转然后平移 Y

模型现在在 Y 方向移动了 4 个单位,但在世界坐标系中。据我了解,上面的结果是您想要的。

相反,如果我们在旋转之后将模型平移到它指向的方向,我们会得到:

模型旋转然后平移

我相信,这就是你想要的。这是我使用的代码。

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]并使用与模型相同的 43° 旋转矩阵对其进行旋转来获得硬编码的平移向量。以编程方式执行此操作并不简单(至少在固定管道中),并且在随后的轮换中会变得更糟。

但事实证明,通过[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);  

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

模型平移然后旋转

问题是,如果您进行任何后续旋转/平移,您的坐标系仍然会一团糟。为了解决这个问题,您需要确保使用累加器进行旋转和平移,并将它们一次全部应用于原始模型,而不是进行小的增量更改。因此,每次按下向上箭头键,为_yTranslate变量添加一些增量值,每次按下“旋转”按钮,从 中添加或减去一些值_zangle,依此类推。

于 2014-10-06T01:12:22.170 回答