Math 在3D空间中快速有效地存储方向?
我最初在3D空间中存储了一个对象原点和方向,使用3个矢量表示对象原点、前进方向和向上方向 为了对modelview矩阵堆栈应用正确的变换,我使用这三个向量组合仿射变换矩阵 平移很简单,但是旋转是通过构造正确的旋转矩阵(取决于旋转角度和旋转轴)并将其应用于这3个向量来实现的 我对大量的对象使用这种方法,旋转/仿射矩阵组合会造成性能瓶颈Math 在3D空间中快速有效地存储方向?,math,opengl,3d,rotation,orientation,Math,Opengl,3d,Rotation,Orientation,我最初在3D空间中存储了一个对象原点和方向,使用3个矢量表示对象原点、前进方向和向上方向 为了对modelview矩阵堆栈应用正确的变换,我使用这三个向量组合仿射变换矩阵 平移很简单,但是旋转是通过构造正确的旋转矩阵(取决于旋转角度和旋转轴)并将其应用于这3个向量来实现的 我对大量的对象使用这种方法,旋转/仿射矩阵组合会造成性能瓶颈 我想知道是否有更合理/有效的方法来存储方向 除了内存,还有什么阻止你存储整个4x4仿射矩阵 更好的是,如果数组被规格化,那么最下面的一行通常是[0,0,0,1],因
我想知道是否有更合理/有效的方法来存储方向 除了内存,还有什么阻止你存储整个4x4仿射矩阵 更好的是,如果数组被规格化,那么最下面的一行通常是
[0,0,0,1]
,因此您只需要存储最上面的三行
我最初在3D空间中存储了一个对象原点和方向,使用3个矢量表示对象原点、前进方向和向上方向
或者换句话说,您正在存储一个3×3的矩阵。OpenGL使用的矩阵是相同的,虽然它们是4×4,但唯一的区别是,元素4,4总是1,元素0…3,4都是0,第一列0,0…3是向前和向上的叉积,通常称为右
这实际上是表示三维空间中对象放置的最简洁、最直接的方法。通过执行单个矩阵乘法,可以应用任何类型的变换
另一种方法是使用四元数和偏移向量。但是,如果希望对象是可平移的,则必须将四元数转换为矩阵(或者可以为变换层次结构链接许多平移/旋转对,但使用矩阵实际上会减少开销).在当前GPGPU上,四元数变换可能比矩阵更快,而当前GPGPU对全局内存的访问比对本地内存的访问慢得多。 据我所知,计算量是原来的两倍,但所需内存不足一半
渲染将顶点着色器存储为本地内存,这里唯一合理的方法是使用矩阵 四元数可能是存储方向的最自然/最有效的方法(在所有方面都应该比正向/向上向量更好)。一个四元数需要存储4个值,需要10次乘法和15次加法——不需要除法或超越函数
如果你特别需要空间,你可能只需要3个值就可以了,因为你可以从剩下的3个值生成一个单位四元数的第一个元素。这将需要额外的3次乘法、3次加法和一个平方根(这也有点棘手,因为您需要确保第一个元素是非负的…我不能相信我忽略了lol,谢谢。你能想出一种更有效的方法来应用旋转,而不必组成4x4旋转矩阵并将其相乘吗?可能不会。如果您只是编写旋转,您可以直接乘以四元数,但如果您包括平移(对于答案中所述的4x3仿射矩阵变换),您实际上是在生成3x3旋转矩阵,在处理翻译部分时…+1问题不够具体,无法说明哪些操作构成了瓶颈。对于某些类型的操作(例如,仅渲染),完整矩阵将是最有效的。对于其他情况(例如刚体物理模拟),可能需要四元数。