谁能告诉我如何让我的模型在自己的中心旋转而不是默认的(0,0,0)轴?
而且我的旋转似乎只是向左和向右而不是 360 度..
如果要围绕其中心旋转对象,首先必须将其平移到原点,然后旋转并将其平移回来。由于变换矩阵从右到左影响您的向量,因此您必须以相反的顺序对这些步骤进行编码。
这是一些伪代码,因为我不知道 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 中的某个点,然后围绕原点旋转,导致模型出现一些奇怪的失真。