越来越熟练了,也可能是上一节内容太繁杂了,对比下觉得比较轻松。
业余翻译,不足之处请多多指教!
实时渲染(第四版)Real-Time Rendering (Fourth Edition)
第4章 变换 Chapter 4 Transforms
4.3 四元数 Quaternions
四元数是复数的扩展,尽管它是威廉·罗恩·汉密尔顿爵士(Sir William Rowan Hamilton)于1843年发明的,但直到1985年,Shoemake [1633]才将它们引入计算机图形学领域。(1) 四元数用于表示旋转和方向。它们在几种方面都优于欧拉角和矩阵。任何三维定向都可以表示为围绕特定轴的单个旋转。当给出了该轴和角度表示后,四元数的平移很简单,而在任一方向上的欧拉角转换都十分有挑战性。四元数可用于稳定方向和恒定插值,而欧拉角无法很好地完成这些操作。
复数(complex number)具有实部和虚部。每个复数都由两个实数表示,其中第二个实数乘以 。同样,四元数有四个部分。前三个值与旋转轴密切相关,旋转角影响所有四个部分(有关更多信息,请参见第 4.3.2 节)。每个四元数由四个实数表示,每个实数与一个不同的部分相关联。由于四元数具有四个分量,因此我们选择将它们表示为向量,但是为了区分它们,我们在它们上加了一个帽子:。我们从四元数的一些数学背景开始,然后将其用于构建各种有用的变换。
作者注:
(1) 公正地说,Robinson [1502]在 1958 年就将四元数用于刚体模拟。
引用:
[1633] Shoemake, Ken, “Animating Rotation with Quaternion Curves,” Computer Graphics (SIGGRAPH ’85 Proceedings), vol. 19, no. 3, pp. 245–254, July 1985. Cited on p. 73, 76, 80, 82
[1502] Robinson, Alfred C., “On the Use of Quaternions in Simulation of Rigid-Body Motion,”Technical Report 58-17, Wright Air Development Center, Dec. 1958. Cited on p. 76
4.3.1 数学背景 Mathematical Background
我们从四元数的定义开始。
除了四元数的定义外,还需要加法,共轭,范数和恒等式的定义:
关联性(Associativity):
引用:
[1105] Maillot, Patrick-Giles, “Using Quaternions for Coding 3D Transformations,” in Andrew S.Glassner, ed., Graphics Gems, Academic Press, pp. 498–515, 1990. Cited on p. 77
4.3.2 四元数变换 Quaternion Transforms
图 4.9。由单位四元数 表示的旋转变换的图示。变换围绕轴 旋转 弧度。
的任何非零实数倍也表示相同的变换,这意味着 和 表示相同的旋转。也就是说,取反轴 和实部 ,将生成一个四元数,该四元数的旋转与原始四元数的旋转完全相同。这也意味着从矩阵中提取四元数可以返回 或 。
给定两个单位四元数 和 ,首先将 然后应用于四元数 (可以解释为点 )的连接由式 4.44 给出:
在此, 是表示单元四元数 和 的级联的单元四元数。
矩阵转换(Matrix Conversion)
由于通常需要组合几个不同的变换,并且大多数变换都是矩阵形式,因此需要一种将公式4.43转换为矩阵的方法。四元数 可以转换成矩阵 ,如公式 4.45 [1633,1634]所示:
在此,标量为 。对于单元四元数,这简化为
一旦构建了四元数,就无需计算三角函数(trigonometric functions),因此转换过程实际上是有效的。
从正交矩阵 到单位四元数 的反向转换要复杂得多。此过程的关键是公式 4.46 中的矩阵具有以下差异:
这些等式的含义是,如果 是已知的,则可以计算向量 的值,从而得出 。的踪迹由下式计算
此结果将对单位四元数产生以下转换:
为了具有数值稳定的例程 [1634],应该避免小数除法。因此,首先设置 ,由此得出
这又意味着 和 中的最大值确定 和 中的哪个最大。如果 最大,则使用公式 4.49 得出四元数。否则,我们注意到以下情况成立:
然后,使用上述方程式的适当公式来计算 和 的最大值,然后使用公式 4.47 计算 剩下的部分。Sch¨uler[1588]提出了一种无分支但使用四个平方根的变体。
引用:
[1633] Shoemake, Ken, “Animating Rotation with Quaternion Curves,” Computer Graphics (SIGGRAPH ’85 Proceedings), vol. 19, no. 3, pp. 245–254, July 1985. Cited on p. 73, 76, 80, 82
[1634] Shoemake, Ken, “Quaternions and 4 × 4 Matrices,” in James Arvo, ed., Graphics Gems II, Academic Press, pp. 351–354, 1991. Cited on p. 80
作者注:
(2) 当且仅当 和 不相反时。
(3) Shoemake [1633]给出了另一个推导。
引用:
[325] Dam, Erik B., Martin Koch, and Martin Lillholm, “Quaternions, Interpolation and Animation,” Technical Report DIKU-TR-98/5, Department of Computer Science, University of Copenhagen, July 1998. Cited on p. 81
[229] do Carmo, Manfred P., Differential Geometry of Curves and Surfaces, Prentice-Hall, Inc., 1976. Cited on p. 81
[1114] Malyshau, Dzmitry, “A Quaternion-Based Rendering Pipeline,” in Wolfgang Engel, ed., GPU Pro3 , CRC Press, pp. 265–273, 2012. Cited on p. 82, 210, 715
[1039] Li, Xin, “To Slerp, or Not to Slerp,” Game Developer, vol. 13, no. 7, pp. 17–23, Aug. 2006. Cited on p. 82
[1040] Li, Xin, “iSlerp: An Incremental Approach of Slerp,” journal of graphics tools, vol. 12, no. 1, pp. 1–6, 2007. Cited on p. 82
[406] Eberly, David, “A Fast and Accurate Algorithm for Computing SLERP,” Journal of Graphics, GPU, and Game Tools, vol. 15, no. 3, pp. 161–176, 2011. Cited on p. 82
[404] Eberly, David, 3D Game Engine Design: A Practical Approach to Real-Time Computer Graphics, Second Edition, Morgan Kaufmann, 2006. Cited on p. 82, 772, 829, 950, 951, 959, 976, 990
当 和 指向几乎相同的方向时,以这种方式直接生成四元数(相对于叉积 的归一化)避免了数值不稳定 [1197]。当 和 指向相反的方向时,这两种方法都会出现稳定性问题,因为它们会被零除。当检测到这种特殊情况时,可以使用任何垂直于 的旋转轴旋转到 。
有时我们需要从 到 旋转的矩阵表示。在对公式 4.46 进行一些代数和三角简化之后,旋转矩阵变为 [1233]
在此等式中,我们使用了以下中间计算(intermediate calculations):
可以看出,由于简化,所有平方根和三角函数都消失了,因此这是创建矩阵的有效方法。请注意,公式 4.57 的结构类似于公式 4.30 的结构,并请注意,后一种形式是怎样做到不需要三角函数。
请注意,当 和 平行或接近平行时必须小心,因为 。如果 ,那么我们可以返回单位矩阵。但是,如果,那么我们可以绕任何轴旋转 弧度。该轴可以作为 与不平行于 的任何其他向量之间的叉积找到(第4.2.4节)。莫勒和休斯使用 Householder 矩阵以不同的方式处理这种特殊情况 [1233]。
引用:
[1197] Melax, Stan, “The Shortest Arc Quaternion,” in Mark DeLoura, ed., Game Programming Gems, Charles River Media, pp. 214–218, 2000. Cited on p. 83
[1233] M¨oller, Tomas, and John F. Hughes, “Efficiently Building a Matrix to Rotate One Vector to Another,” journal of graphics tools, vol. 4, no. 4, pp. 1–4, 1999. Also collected in [112]. Cited on p. 83, 84
4.4 顶点混合 Vertex Blending
想象一下,数字角色的手臂使用前臂和上臂两部分进行动画处理,如图 4.11 左侧所示。该模型可以使用刚体变换进行动画处理(第 4.1.6 节)。但是,这两个部分之间的关节将不会像真正的肘部。这是因为使用了两个单独的对象,因此,关节由来自这两个单独的对象的重叠部分组成。显然,最好只使用一个对象。但是,静态模型零件无法解决使接头具有柔性的问题。
顶点混合(Vertex blending)是解决此问题的一种流行解决方案 [1037,1903]。该技术还有其他几个名称,例如线性混合蒙皮(linear-blend skinning),包络(enveloping)或骨架子空间变形(skeleton-subspace deformation)。虽然此处介绍的算法的确切来源尚不清楚,但定义骨骼并使蒙皮对变化做出反应是计算机动画中的一个古老概念 [1100]。在最简单的形式中,前臂和上臂像以前一样分别进行动画处理,但是在关节处,两个部分通过有弹性的“蒙皮”相连。因此,该弹性部件将具有一组由前臂矩阵转换的顶点和另一组由上臂矩阵转换的顶点。与每个三角形使用单个矩阵相反,这导致三角形的顶点可以通过不同的矩阵进行变换。见图 4.11。
图4.11。手臂由前臂和上臂组成,使用左侧的两个独立对象的刚体变换进行动画处理。肘部看起来不现实。在右侧,对一个对象使用顶点混合。最右边的手臂说明了当简单的蒙皮将两个部分直接覆盖以覆盖肘部时发生的情况。最右边的手臂说明了使用顶点混合时发生的情况,并且某些顶点以不同的权重进行了混合:(2/3,1/3)表示顶点对上臂的变换的权重为2/3,对前臂的变换的权重为。1/3。该图在最右边的插图中还显示了顶点混合的缺点。在这里,可以看到肘部内部的折叠。使用更多的骨骼和更精心选择的权重可以达到更好的效果。
通过进一步执行这一步骤,可以使单个顶点可以通过几种不同的矩阵进行变换,并将得到的位置加权并混合到一起。这是通过为动画对象设置骨骼来完成的,其中每个骨骼的变换可能会通过用户定义的权重影响每个顶点。由于整个手臂可能是“弹性的”,即所有顶点可能受到多个矩阵的影响,因此整个网格(mesh)通常称为(骨骼上的)蒙皮(skin)。见图 4.12。许多商业建模系统都具有相同的骨架骨骼建模功能。尽管名称如此,骨骼并不一定必须是刚性的。例如,Mohr 和 Gleicher [1230]提出了添加附加关节以实现诸如肌肉隆起等效果的想法。James 和 Twigg [813]讨论了使用可以挤压和拉伸的骨骼的动画蒙皮。
在数学上,这用公式 4.59 表示,其中 是原始顶点,而 是变换后的顶点,其位置取决于时间 :
有 个骨骼影响 的位置,这在世界坐标中表示出来。值 是顶点 的骨骼 的权重。 矩阵从初始骨骼的坐标系转换为世界坐标。通常,骨骼的控制关节位于其坐标系的原点。例如,前臂骨骼将其肘关节移动到原点,而动画旋转矩阵将手臂的这一部分绕关节移动。 矩阵是第 个骨骼的世界变换,会随着时间变化以对对象进行动画处理,并且通常是多个矩阵的串联,例如以前的骨骼变换的层次结构和局部动画矩阵。
Woodland [1903]深入讨论了一种维护和更新 矩阵动画函数的方法。每个骨骼都将一个顶点转换到相对于其自己的参照系的位置,并从一组计算点中插值最终位置。在一些蒙皮讨论中未明确显示矩阵 ,而是将其视为 的一部分。我们在这里介绍它是因为它是有用的矩阵,并且几乎总是矩阵级联过程的一部分。
在实践中,对于动画的每一帧,为每个骨骼连接矩阵 和 ,并且每个结果矩阵都用于变换顶点。顶点 由不同骨骼的级联矩阵转换,然后使用权重 进行混合,因此称为顶点混合(vertex blending)。权重是非负的,并且总和为1,因此发生的事情是将顶点转换到几个位置,然后在其中进行插值。这样,对于所有的 ,变换后的点 将位于点集 (固定的 )的凸包中。通常也可以使用公式 4.59 转换法线。根据所使用的变换(例如,如果骨骼被拉伸或压扁了很多),可能需要对 的逆进行转置,如第 4.1.7 节中所述。
顶点混合非常适合在 GPU 上使用。网格中的顶点集可以放置在静态缓冲区中,该缓冲区会一次发送到 GPU 并重新使用。在每个框架中,只有骨骼矩阵会发生变化,而顶点着色器会计算它们对存储的网格的影响。这样,可以最大程度地减少在 CPU 上处理和从 CPU 传输的数据量,从而使 GPU 可以有效地渲染网格。如果可以将模型的整个骨矩阵一起使用,则是最简单的。否则,必须拆分模型并复制一些骨骼。或者,可以将骨骼变换存储在顶点访问的纹理中,从而避免达到寄存器存储限制。通过使用四元数表示旋转,每个变换可以仅存储在两个纹理中 [1639]。如果可用,无序访问视图存储将允许重新使用蒙皮结果 [146]。
我们可以指定超出 范围或不等于 1 的权重集。但是,这仅在使用某些其他混合算法(例如变形目标,morph targets)(第4.5节)时才有意义。
基本顶点融合的一个缺点是可能发生不必要的折叠,扭曲和自相交 [1037]。见图 4.13。更好的解决方案是使用双季铵盐 [872,873]。这种执行蒙皮的技术有助于保持原始变换的刚度,因此避免了四肢的“糖果包裹”扭曲。计算量不到线性蒙皮混合的成本的 1.5 倍,并且效果很好,这导致该技术的快速采用。然而,双四元数蒙皮会导致鼓起效果,Le 和 Hodgins [1001]提出了旋转中心蒙皮作为更好的选择。他们基于这样的假设:局部变换应该是刚体,并且具有相似权重 的顶点应该具有相似的变换形式。预先为每个顶点计算旋转中心,同时施加正交(刚体)约束以防止肘关节塌陷和糖果包装纸扭曲伪像(candy wrapper twist artifacts)。在运行时,该算法类似于线性混合蒙皮,因为 GPU 在旋转中心执行线性混合蒙皮,随后执行四元数混合步骤。
图4.13。左侧显示了使用线性混合蒙皮时关节处的问题。在右侧,使用双四元数混合可以改善外观。(图片由Ladislav Kavan等人提供,Paul Steed [1693]提供模型。)
引用:
[1037] Lewis, J. P., Matt Cordner, and Nickson Fong, “Pose Space Deformation: A Unified Approach to Shape Interpolation and Skeleton-Driven Deformation,” in SIGGRAPH ’00: Proceedings of the 27th Annual Conference on Computer Graphics and Interactive Techniques, ACM Press/Addison-Wesley Publishing Co., pp. 165–172, July 2000. Cited on p. 84, 87, 90, 102
[1903] Woodland, Ryan, “Filling the Gaps—Advanced Animation Using Stitching and Skinning,” in Mark DeLoura, ed., Game Programming Gems, Charles River Media, pp. 476–483, 2000. Cited on p. 84, 85
[1100] Magnenat-Thalmann, Nadia, Richard Laperri`ere, and Daniel Thalmann, “Joint-Dependent Local Deformations for Hand Animation and Object Grasping,” in Graphics Interface ’88, Canadian Human-Computer Communications Society, pp. 26–33, June 1988. Cited on p. 85
[1230] Mohr, Alex, and Michael Gleicher, “Building Efficient, Accurate Character Skins from Examples,” ACM Transactions on Graphics (SIGGRAPH 2003), vol. 22, no. 3, pp. 562–568, 2003. Cited on p. 85
[813] James, Doug L., and Christopher D. Twigg, “Skinning Mesh Animations,” ACM Transactions on Graphics, vol. 23, no. 3, pp. 399–407, Aug. 2004. Cited on p. 85
[1903] Woodland, Ryan, “Filling the Gaps—Advanced Animation Using Stitching and Skinning,” in Mark DeLoura, ed., Game Programming Gems, Charles River Media, pp. 476–483, 2000. Cited on p. 84, 85
[1639] Sikachev, Peter, Vladimir Egorov, and Sergey Makeev, “Quaternions Revisited,” in Wolfgang Engel, ed., GPU Pro5, CRC Press, pp. 361–374, 2014. Cited on p. 87, 210, 715
[146] Bilodeau, Bill, “Vertex Shader Tricks: New Ways to Use the Vertex Shader to Improve Performance,” Game Developers Conference, Mar. 2014. Cited on p. 51, 87, 514, 568, 571, 798
[1037] Lewis, J. P., Matt Cordner, and Nickson Fong, “Pose Space Deformation: A Unified Approach to Shape Interpolation and Skeleton-Driven Deformation,” in SIGGRAPH ’00: Proceedings of the 27th Annual Conference on Computer Graphics and Interactive Techniques, ACM Press/Addison-Wesley Publishing Co., pp. 165–172, July 2000. Cited on p. 84, 87, 90, 102
[872] Kavan, Ladislav, Steven Collins, Jiˇr´ı Z´ara, and Carol O’Sullivan, “Skinning with Dual Quaternions,” in Proceedings of the 2007 Symposium on Interactive 3D Graphics and Games, ACM, pp. 39–46, Apr.–May 2007. Cited on p. 87
[873] Kavan, Ladislav, Steven Collins, Jiˇr´ı Z´ara, and Carol O’Sullivan, “Geometric Skinning with Approximate Dual Quaternion Blending,” ACM Transactions on Graphics, vol. 27, no. 4, pp. 105:1–105:23, 2008. Cited on p. 87
[1001] Le, Binh Huy, and Jessica K. Hodgins, “Real-Time Skeletal Skinning with Optimized Centers of Rotation,” ACM Transactions on Graphics, vol. 35, no. 4, pp. 37:1–37:10, 2016. Cited on p. 87