Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 在3D空间中快速有效地存储方向?_Math_Opengl_3d_Rotation_Orientation - Fatal编程技术网

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

Math 在3D空间中快速有效地存储方向?,math,opengl,3d,rotation,orientation,Math,Opengl,3d,Rotation,Orientation,我最初在3D空间中存储了一个对象原点和方向,使用3个矢量表示对象原点、前进方向和向上方向 为了对modelview矩阵堆栈应用正确的变换,我使用这三个向量组合仿射变换矩阵 平移很简单,但是旋转是通过构造正确的旋转矩阵(取决于旋转角度和旋转轴)并将其应用于这3个向量来实现的 我对大量的对象使用这种方法,旋转/仿射矩阵组合会造成性能瓶颈 我想知道是否有更合理/有效的方法来存储方向 除了内存,还有什么阻止你存储整个4x4仿射矩阵 更好的是,如果数组被规格化,那么最下面的一行通常是[0,0,0,1],因

我最初在3D空间中存储了一个对象原点和方向,使用3个矢量表示对象原点、前进方向和向上方向

为了对modelview矩阵堆栈应用正确的变换,我使用这三个向量组合仿射变换矩阵

平移很简单,但是旋转是通过构造正确的旋转矩阵(取决于旋转角度和旋转轴)并将其应用于这3个向量来实现的

我对大量的对象使用这种方法,旋转/仿射矩阵组合会造成性能瓶颈


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

除了内存,还有什么阻止你存储整个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问题不够具体,无法说明哪些操作构成了瓶颈。对于某些类型的操作(例如,仅渲染),完整矩阵将是最有效的。对于其他情况(例如刚体物理模拟),可能需要四元数。