c++ - 在 OpenGL 4.0 中是否有围绕局部坐标(即从模型 View 矩阵)旋转的标准方法?

标签 c++ matrix rotation opengl-4

我一直在研究 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 矩阵:

  1. R存储在4x4矩阵的旋转部分。
  2. 计算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/

相关文章:

Java:点旋转结果不准确

java - 逐列添加数字的格式问题 [Java]

arrays - 变量矩阵 NumPy 的值

jquery 为旋转的 div 设置动画

c++ - 在windows中获取文件大小

matlab删除矩阵计算中的for循环

java - 旋转 JLabel 并读取旋转值

c++ - 在 Linux 机器上从源代码构建 Qt-4.3.2

c++ - 错误:使用已删除的函数 boost::filesystem3::directory_iterator

c++ - 使用程序集调试资源中的字符串