什么时候应使用四元数来表示3D中的旋转和缩放?


13

四元数(复数的二维扩展)可用于表示3D向量的旋转和缩放,并且将四元数应用于3D向量涉及两个四元数乘法,因此与通过相应变换矩阵进行乘法运算相比,所需运算更少。但是,通常改用线性和仿射变换矩阵,尤其是在着色器代码中。

(由于速度,稳定性等原因)什么时候使用四元数来表示三维缩放和旋转,而不是使用相应的转换矩阵,是否合适且更可取?


Answers:


8

我想从误解入手:

现代GPU(相当长一段时间以来一直是NVIDIA,而自从Southern Islands以来一直是AMD)并没有真正地在硬件中真正支持矢量/矩阵运算。它们是沿不同方向的向量体系结构:向量的每个分量(x,y,z)通常具有32或64值,其中包含泳道中每个元素的值。因此3D点积通常不是指令,它是一个乘法和两个乘法加法。

此外,对基本运算(例如乘加)进行计数,通过四元数转换向量比通过矩阵转换向量更昂贵。用3x3矩阵变换向量是3个乘法和6个乘法加法,用四元数变换向量是两个四元数乘法,每个四元数乘法包括4个乘法和12个乘法加法。(您可能会比更幼稚-这是一种更快的方法 -但它仍然不如将向量乘以矩阵便宜。)

然而,并非总是通过简单地计算其执行的ALU操作的数量来确定性能。四元数比等效矩阵需要更少的空间(假设您仅在进行纯旋转/缩放),这意味着更少的存储空间和更少的内存流量。这在动画中通常很重要(通常在显示四元数的插值特性时也很方便)。

除此之外:

  • 矩阵使用更多空间,因为它们支持更多操作。3x3矩阵可以包含不均匀的比例,偏斜,反射和正交投影。
  • 可以自然地将矩阵视为基础向量,并可以轻松地从这些向量构建矩阵。
  • 一个四元数与另一个四元数相乘(组成两个旋转)的操作要比一个矩阵与另一个四元数相乘的操作少。

有趣的是,在Intel Haswell GPU上,ARBfp的DP3指令实现为3乘2加,请参阅INTEL_DEBUG=fsIntel Linux驱动程序的输出:paste.ubuntu.com/23150494。不确定是驱动不良还是硬件确实没有特殊的矢量mul指令。
Ruslan'9

@Ruslan很可能硬件没有特殊的矢量mul指令。尽管它们确实更准确,但它们是在体系结构的SIMD宽度(通道)上矢量化的,而不是在vec3 / vec4维度上矢量化的。
John Calsbeek

4

(在这里,我无情地从joojaa和棘轮怪胎的答案中借来了很多信息,并附带了一些我自己的笔记。)

矩阵优势

  • 非均匀缩放和旋转,偏斜,投影
  • 翻译(除非使用双四元数)
  • 本机硬件支持
  • 四元数通常需要先验函数来构造
  • 更容易理解

四元数的优势

  • 转换向量需要较少的运算(或不-参见约翰的答案)
  • 通过另一个quat进行转换需要更少的操作
  • 四元数占据4个浮点数(如果是对偶则为8个),而矩阵占据9-16个浮点数

如果您只知道要进行统一的刚体变换,那么就存储空间而言,矢量/ quat对通常是3x4矩阵的坚实优势(矢量/ quat:7或8个浮点数,而mat3x4:12个浮点数)和处理速度。如果四元数仍然是您不可思议的巫毒,请尝试在其上使用此网络系列


3

矩阵比四元数提供更多的可能变换,它可以偏斜,镜像和非均匀缩放矩阵。没有任何内容表明,如果不需要其他转换功能,则无法使引擎仅执行基于四元数的转换。

当您需要构建知道基向量的空间时,矩阵非常方便。例如在投影成正交时。在矩阵空间中进行透视变换也很容易。当涉及投影时,矩阵是优越的。

通常以某种方式使用矩阵,因为它们代表最常见的面额,并且掌握和理解起来并不复杂。标准化的好处远远超过了从自定义工作流程中获得的好处。它众所周知的如何做矩阵运算。qua并不是uni中最容易立即介绍的东西。只是问周围有多少人知道如何反转四元数,而没有找到很多不知道如何反转矩阵的高等教育学生。

请注意,图形卡还具有用于矩阵操作的专用管道。


我实际上一直在考虑这一点。Ive还开玩笑地问,除了可以使用矩阵和quat层次结构之外,还可以使用什么其他方法对管道进行建模。
joojaa 2015年

3

四元数只能表示均匀的缩放和旋转,因此如果需要其他任何内容,则需要添加一些内容来表示。

可以使用一个附加的vec3(或使用双四元数)完成翻译。但是,用mat4可以更好地表示不均匀的缩放和收缩。投影变换(本质上是非均匀缩放以及交换z和w)不能用四元数表示。

插值时,四元数具有主要优势。使用四元数最容易计算出slerp。

GPU并未内置应用四元数(或双四元数)的功能,因此您需要使用矢量运算来实现。大多数四元数库都假定您不会使用四元数来表示比例,因此需要注意这一点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.