noo*_*b88 1 opengl axis translation rotation
任何人都可以告诉我如何让我的模型在自己的中心旋转去重力而不是默认(0,0,0)轴吗?
而我的轮换似乎只是左右不是360度..
Fer*_*yer 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();
Run Code Online (Sandbox Code Playgroud)
这些矩阵得到应用:
v_t = (I * T * R) * v = (I * (T * (R * v)))
Run Code Online (Sandbox Code Playgroud)
所以顺序是:轮换,翻译.
编辑:上述等式的解释.
转换的旋转,缩放和平移会影响模型 - 视图 - 矩阵.模型的每个3D点(矢量)乘以此矩阵以获得其在3D空间中的最终点,然后将其乘以投影矩阵以接收2D点(在2D屏幕上).
忽略投影内容,由模型视图矩阵转换的点是:
v_t = MV * v
Run Code Online (Sandbox Code Playgroud)
表示原点v,乘以模型 - 视图 - 矩阵MV.
在上面的代码中,我们MV通过单位矩阵I,翻译T和轮换构建R:
MV = I * T * R
Run Code Online (Sandbox Code Playgroud)
将所有内容放在一起,您会看到您的点v首先受到旋转的影响R,然后是翻译T,这样您的点在翻译之前就会被旋转,就像我们希望的那样:
v_t = MV * v = (I * T * R) * v = T * (R * v)
Run Code Online (Sandbox Code Playgroud)
在Translate()之前调用Rotate()将导致:
v_t = (I * R * T) * v = R * (T * v)
Run Code Online (Sandbox Code Playgroud)
这将是坏事:转换到3D中的某个点,然后围绕原点旋转,导致模型中的一些奇怪的失真.
| 归档时间: |
|
| 查看次数: |
7680 次 |
| 最近记录: |