opengl旋转问题

时间:2009-03-26 10:18:19

标签: opengl translation rotation axis

任何人都可以告诉我如何让我的模型在自己的中心旋转去重力而不是默认(0,0,0)轴吗?

我的轮换似乎只是左右不是360度..

1 个答案:

答案 0 :(得分:10)

如果要围绕其中心旋转对象,首先必须将其转换为原点,然后旋转并将其平移。由于转换矩阵会从右到左影响矢量,因此必须按相反的顺序对这些步骤进行编码。

这是一些伪代码,因为我不了解OpenGL例程:

PushMatrix();
LoadIdentity();  // Start with a fresh matrix
Translate();     // Move your object to its final destination
Rotate();        // Apply rotations
Draw();          // Draw your object using coordinates relative to the object center
PopMatrix();

这些矩阵得到应用:

v_t = (I * T * R) * v = (I * (T * (R * v)))

顺序是:轮换,翻译。


编辑:上述等式的解释。

转换旋转,缩放和平移会影响模型 - 视图矩阵。模型的每个3D点(矢量)乘以此矩阵以获得其在3D空间中的最终点,然后将其乘以投影矩阵以接收2D点(在2D屏幕上)。

忽略投影内容,由模型 - 视图矩阵转换的点是:

v_t = MV * v

将原始点v的含义乘以模型 - 视图 - 矩阵MV

在上面的代码中,我们使用了身份矩阵MV,翻译I和轮换T构建了R

MV = I * T * R

将所有内容放在一起,您会发现您的点v首先受到轮换R的影响,然后是翻译T,这样您的点在翻译之前就会被旋转,只是正如我们希望的那样:

v_t = MV * v = (I * T * R) * v = T * (R * v)

在Translate()之前调用Rotate()将导致:

v_t = (I * R * T) * v = R * (T * v)

这很糟糕:转换到3D中的某个点,然后围绕原点旋转,导致模型中出现一些奇怪的失真。