快速有效地在3D空间中存储方向?

时间:2012-05-08 18:02:23

标签: math opengl 3d rotation orientation

我最初使用3个向量存储了3D空间中的对象原点和方向,这些向量表示对象的原点,向前和向上方向。

要应用于正确转换到模型视图矩阵堆栈,我使用这三个向量组成仿射变换矩阵。

平移是微不足道的,但是通过构造正确的旋转矩阵(取决于角度和旋转轴)并将其应用于这3个向量来应用旋转。

我正在将这种方法用于大量对象,而旋转/仿射矩阵组合正在造成性能瓶颈。

我想知道是否有更合理/有效的方式存储方向?

4 个答案:

答案 0 :(得分:5)

  

我最初使用3个向量存储了3D空间中的对象原点和方向,这些向量表示对象的原点,向前和向上方向。

或换句话说:您正在存储3×3矩阵。 OpenGL使用的矩阵是相同的,虽然它们是4×4,但唯一的区别是,元素4,4总是1,元素0 ... 3,4都是0,并且第一列0,0 ... 3是向前和向上的叉积,通常称为 right

这实际上是表示3D空间中对象放置的最简洁且可直接访问的方式。您可以通过执行单个矩阵乘法来应用任何类型的变换。

另一种方法是使用四元数和偏移矢量。但是如果你想让你的对象可以翻译,那么四元数必须变成一个矩阵(或者你可以为转换层次链接大量的平移/旋转配对,但使用矩阵实际上会减少开销)。

答案 1 :(得分:4)

除了记忆之外,是什么阻止你存储整个4x4仿射矩阵?

更好的是,ISTR如果数组规范化,则底行通常 [0, 0, 0, 1],因此您只需存储前三行。

答案 2 :(得分:1)

当前GPGPU上的四元数转换可能比Matrix更快,其中全局内存的访问速度比本地内存慢得多。 根据{{​​3}},你计算了两倍,但需要获取的内存少于一半。

渲染将顶点着色器制服存储为本地存储器,这里唯一合理的是使用矩阵。

答案 3 :(得分:1)

四元数可能是存储方向的最自然/最有效的方式(它应该在所有方面都比向前/向上向量更好)。四元数将需要存储4个值,并且需要10次乘法和15次加法convert to a 3x3 rotation matrix - 不需要任何除法或超越函数。

如果你特别想要空间,你可能只需要3个值,因为你可以从其余三个值中稳健地生成单位四元数的第一个元素。这将需要额外的3次乘法,3次加法和一个平方根(它也有点棘手,因为你需要确保第一个元素是非负的......)