我一直在研究 game engine最近达到了我可以轻松创建一个 Camera 类来管理 View 矩阵(或允许轻松切换到另一个)的地步。我在概念上知道它必须做什么,但我遇到的问题是弄清楚如何围绕局部原点旋转(对于 View 矩阵,它与乘以旋转矩阵的平移矩阵相同)。
我知道在直接模式下,你会
glTranslatef(x, y, z); //move back to origin
glRotatef(angle, x_rot, y_rot, z_rot); //turn using a quaternion
glTranslatef(-x, -y, -z); //move back to original location
但我不确定这将如何转化为更现代的应用程序。你会做本质上相同的事情,让平移矩阵回到原点,旋转,然后平移回来吗?对于要旋转的每个对象?从我目前测试过的情况来看,该方法适用于查看,但在 3D 空间中控制它很笨拙(我不确定如何不断调整旋转。将运动组件转换为单个 vec4,乘以旋转,应用于翻译,然后进行实际旋转?)
似乎有一种比我错过的三个或更多 4x4 矩阵乘法更有效的方法。
Here's the specific section在尝试了建议的解决方案之后。
最佳答案
您可以做与您发布的序列基本相同的事情,而无需在运行时进行全矩阵乘法。由于平移矩阵非常简单,您可以手动进行乘法运算。 R
是一个 3x3 旋转矩阵,p
是您想要旋转的位置,您可以通过以下方式构建 4x4 矩阵:
- 将
R
存储在4x4矩阵的旋转部分。 - 计算
p - R * p
,并将结果存储在4x4矩阵的平移部分。
这会将其简化为一个矩阵 * vector 乘法和一个 vector 减法。你可能想仔细检查我的数学,因为我只是在纸上推导出来的。
另一种方法是在 CPU 代码中将旋转和平移分开,根据需要更新它们,并且仅在更新制服时将它们组合成 4x4 矩阵。
由于您可以控制着色器代码,您甚至不必使用 4x4 矩阵来包含整个变换。例如,如果在旋转之前应用平移更方便,您可以将 mat3 旋转矩阵和 vec3 平移 vector 输入着色器,并将平移 vector 添加到与旋转矩阵相乘之前的位置。如果您更新其中一个比另一个更频繁,那么将两者分开也会有好处。
关于c++ - 在 OpenGL 4.0 中是否有围绕局部坐标(即从模型 View 矩阵)旋转的标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23319269/