1

谁能告诉我如何让我的模型在自己的中心旋转而不是默认的(0,0,0)轴?

而且我的旋转似乎只是向左和向右而不是 360 度..

4

1 回答 1

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 中的某个点,然后围绕原点旋转,导致模型出现一些奇怪的失真。

于 2009-03-26T10:32:16.850 回答