《Real-Time Rendering 4th Edition》全文翻译 - 第4章 变换(中)4.3 ~ 4.4

越来越熟练了,也可能是上一节内容太繁杂了,对比下觉得比较轻松。

业余翻译,不足之处请多多指教!

实时渲染(第四版)Real-Time Rendering (Fourth Edition)

第4章 变换 Chapter 4 Transforms

4.3 四元数 Quaternions

四元数是复数的扩展,尽管它是威廉·罗恩·汉密尔顿爵士(Sir William Rowan Hamilton)于1843年发明的,但直到1985年,Shoemake [1633]才将它们引入计算机图形学领域。(1) 四元数用于表示旋转和方向。它们在几种方面都优于欧拉角和矩阵。任何三维定向都可以表示为围绕特定轴的单个旋转。当给出了该轴和角度表示后,四元数的平移很简单,而在任一方向上的欧拉角转换都十分有挑战性。四元数可用于稳定方向和恒定插值,而欧拉角无法很好地完成这些操作。

复数(complex number)具有实部和虚部。每个复数都由两个实数表示,其中第二个实数乘以 \sqrt{1}。同样,四元数有四个部分。前三个值与旋转轴密切相关,旋转角影响所有四个部分(有关更多信息,请参见第 4.3.2 节)。每个四元数由四个实数表示,每个实数与一个不同的部分相关联。由于四元数具有四个分量,因此我们选择将它们表示为向量,但是为了区分它们,我们在它们上加了一个帽子:\hat{\textbf{q}}。我们从四元数的一些数学背景开始,然后将其用于构建各种有用的变换。


作者注:

(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

我们从四元数的定义开始。

定义 四元数  \hat{\textbf{q}} 可以用以下所有等效的方式定义。
\\ \hat{\textbf{q}} = (\textbf{q}_{v},q_{w}) = iq_{x} + jq_{y} + kq_{z} +q_{w} = \textbf{q}_{v} +q_{w}\;, \\ \textbf{q}_{v}=iq_{x}+jq_{y}+kq_{z}=(q_{x},q_{y},q_{z})\;,\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(4.31) \\ i^{2}=j^{2}=k_{2}=-1,\;jk=-kj=i,\;ki=-ik=j,\;ij=-ji=k.
变量   q_{w}  被称为四元数  \hat{\textbf{q}} 的实部(real  part)。虚部( imaginary part)\textbf{q}_{v}ij 和  k 称为虚单位( imaginary units)
对于虚部 \hat{\textbf{q}},我们可以使用所有法向向量运算,例如加法,缩放,点积,叉积等等。使用四元数的定义,得出两个四元数  \hat{\textbf{q}} 和  \hat{\textbf{r}} 之间的乘法运算,如下所示。注意,虚部的乘法是不可交换的。
 
乘法(Multiplication):
\\ \hat{\textbf{q}}\hat{\textbf{r}}=(iq_{x}+jq_{y}+kq_{z}+q_{w})(ir_{x}+jr_{y}+kr_{z}+r_{w}) \\ =i(q_{y}r_{z}-q_{z}r_{y}+r_{w}q_{x}+q_{w}r_{x}) \\ \;\;\;\;+j(q_{z}r_{x}-q_{x}r_{z}+r_{w}q_{y}+q_{w}r_{y})\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(4.32) \\ \;\;\;\;+k(q_{x}r_{y}-q_{y}r_{x}+r_{w}q_{z}+q_{w}r_{z}) \\ \;\;\;\;+q_{w}r_{w}-q_{x}r_{x}-q_{y}r_{y}-q_{z}r_{z} \\ =(\textbf{q}_{v}\times \textbf{r}_{v} + r_{w}\textbf{q}_{v}+ q_{w}\textbf{r}_{v},\;\;q_{w}r_{w}-\textbf{q}_{v}\cdot \textbf{r}_{v}).
 
从该方程式可以看出,我们使用叉积和点积来计算两个四元数的乘法。
除了四元数的定义外,还需要加法,共轭,范数和恒等式的定义:
 
加法(Addition):
\hat{\textbf{q}}+\hat{\textbf{r}}=(\textbf{q}_{v},q_{w})+(\textbf{r}_{v},r_{w})=(\textbf{q}_{v}+\textbf{r}_{v},q_{w}+r_{w}).
 
共轭(Conjugate):
\hat{\textbf{q}^{*}}=(\textbf{q}_{v},q_{w})^{*}=(-\textbf{q}_{v},q_{w}).
 
归一化(Norm):
\\ n(\hat{\textbf{q}})=\sqrt{\hat{\textbf{q}}\hat{\textbf{q}}^{*}}=\sqrt{\hat{\textbf{q}}^{*}\hat{\textbf{q}}}=\sqrt{\textbf{q}_{v}\cdot \textbf{q}_{v}+q_{w}^{2}};\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(4.33) \\ =\sqrt{q_{x}^{2}+q_{y}^{2}+q_{z}^{2}+q_{w}^{2}}. \\
 
恒等式(Identity):
\hat{\textbf{i}}=(\textbf{0},1).
 
当简化 n(\hat{\textbf{q}})=\sqrt{\hat{\textbf{q}}\hat{\textbf{q}}^{*}} 时(如上所示),虚部将抵消,仅保留实部。归一化有时表示为 \left \| \hat{\textbf{q}} \right \|=n(\hat{\textbf{q}})  [1105]。上面的结果是,可以导出由 \hat{\textbf{q}}^{-1} 表示的乘法逆。方程  \hat{\textbf{q}}^{-1}\hat{\textbf{q}}=\hat{\textbf{q}}\hat{\textbf{q}}^{-1}=1 对于逆必须成立(对于乘法逆来说是常见的)。我们从归一化的定义中得出一个公式:
n(\hat{\textbf{q}})^{2}=\hat{\textbf{q}}\hat{\textbf{q}}^{*}\Leftrightarrow \frac{\hat{\textbf{q}}\hat{\textbf{q}}^{*}}{n(\hat{\textbf{q}})^{2}}=1.\;\;\;\;\;\;\;\;\;\;(4.34)
这给出了乘法逆,如下所示:
 
 
逆(Inverse): \hat{\textbf{q}}^{-1}=\frac{1}{n(\hat{\textbf{q}})^{2}}\hat{\textbf{q}}^{*}.\;\;\;\;\;\;\;\;\;\;(4.35)
 
逆公式使用标量乘法,它是从公式 4.3.1 中的乘法得出的运算: s\hat{\textbf{q}}=(\textbf{0},s)(\textbf{q}_{v},q_{w})=(s\textbf{q}_{v},sq_{w})\hat{\textbf{q}}s=(\textbf{q}_{v},\;q_{w})(\textbf{0},\;s)=(s\textbf{q}_{v},\;sq_{w}),这意味着标量乘法是可交换的: s\hat{\textbf{q}}=\hat{\textbf{q}}s=(s\textbf{q}_{v},sq_{w}).
我们可以从定义中轻松得出以下规则集合:
 
共轭规则(Conjugate rules):
\\ (\hat{\textbf{q}}^{*})^{*}=\hat{\textbf{q}}, \\ (\hat{\textbf{q}}+\hat{\textbf{r}})^{*}=\hat{\textbf{q}}^{*}+\hat{\textbf{r}}^{*},\;\;\;\;\;\;\;\;\;\;(4.36) \\ (\hat{\textbf{q}}\hat{\textbf{r}})^{*}=\hat{\textbf{r}}^{*}\hat{\textbf{q}}^{*}.
 
归一化规则(Norm rules):
\\ n(\hat{\textbf{q}}^{*})=n(\hat{\textbf{q}}),\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(4.37) \\ n(\hat{\textbf{q}}\hat{\textbf{r}})=n(\hat{\textbf{q}})n(\hat{\textbf{r}}). \\
 
乘法定律(Laws of Multiplication)(包含以下两个):
 
线性度(Linearity):
\\ \hat{\textbf{p}}(s\hat{\textbf{q}}+t\hat{\textbf{r}})=s\hat{\textbf{p}}\hat{\textbf{q}}+t\hat{\textbf{p}}\hat{\textbf{r}},\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(4.38) \\ (s\hat{\textbf{p}}+t\hat{\textbf{q}})\hat{\textbf{r}}=s\hat{\textbf{p}}\hat{\textbf{r}}+t\hat{\textbf{q}}\hat{\textbf{r}}.

关联性(Associativity):
\hat{\textbf{p}}(\hat{\textbf{q}}\hat{\textbf{r}})=(\hat{\textbf{p}}\hat{\textbf{q}})\hat{\textbf{r}}.
 
单位四元数 \hat{\textbf{q}}=(\textbf{q}_{v},q_{w}) 使得 n(\hat{\textbf{q}})=1。由此可以得出  \hat{\textbf{q}} 可写为
\hat{\textbf{q}}=(sin\;\phi\textbf{u}_{q},cos\;\phi)=sin\;\phi\textbf{u}_{q}+cos\;\phi,\;\;\;\;\;\;\;\;\;\;(4.39)
对于某些三维向量 \textbf{u}_{q},例如  \left \| \textbf{u}_{q} \right \|=1,因为
\\ n(\hat{\textbf{q}})=n(sin\;\phi\textbf{u}_{q}, cos\;\phi)=\sqrt{sin^{2}\;\phi(\textbf{u}_{q}\cdot \textbf{u}_{q})+cos^{2}\;\phi}\;\;\;\;\;\;\;\; \\ =\sqrt{sin^{2}\;\phi+cos^{2}\;\phi}=1\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(4.40)
当且仅当   \textbf{u}_{q}\cdot \textbf{u}_{q}=1=\left \| \textbf{u}_{q} \right \|^{2} 。如在下一节中将看到的,单位四元数非常适合以最有效的方式创建旋转和方向。但在此之前,将为单元四元数引入一些额外的操作。
对于复数,可以将二维单位向量写为 cos\;\phi+isin\;\phi=e^{i\phi} 。四元数的等效项是
\hat{\textbf{q}}=sin\;\phi\textbf{u}_{q}+cos\;\phi=e^{\phi\textbf{u}_{q}}.\;\;\;\;\;\;\;\;(4.41)
单位四元数的对数和幂函数来自公式 4.41:
 
对数:log(\hat{\textbf{q}})=log(e^{\phi\textbf{u}_{q}})=\phi\textbf{u}_{q},
                                                                (4.42)
幂:\hat{\textbf{q}}^{t}=(sin\;\phi\textbf{u}_{q}+cos\;\phi)^{t}=e^{\phi t\textbf{u}_{q}}=sin(\phi t)\textbf{u}_{q}+cos(\phi t).

引用:

[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。由单位四元数  \hat{\textbf{q}}=(sin\;\phi\textbf{u}_{q},cos\;\phi).  表示的旋转变换的图示。变换围绕轴 \textbf{u}_{q} 旋转 2\phi 弧度。

现在,我们将研究四元数集的子类,即单位长度的子类,称为单位四元数( unit quaternions)。关于单元四元数的最重要事实是,它们可以表示任何三维旋转,并且这种表示极其紧凑和简单。
现在,我们将说明使单元四元数对旋转和定向如此有用的原因。首先,将一个点或向量的四个坐标 \textbf{p}=(p_{x}\;p_{y}\;p_{z}\;p_{w})^{T} 放入四元数 \hat{\textbf{p}} \hat\textbf{p} 的分量中,并假设我们有一个单位四元数 \hat{\textbf{q}}=(sin\;\phi\textbf{u}_{q},cos\;\phi) 。可以证明:
\hat{\textbf{q}}\hat{\textbf{p}}\hat{\textbf{q}}^{-1}\;\;\;\;\;\;\;\;\;\;(4.43)
绕轴  \textbf{u}_{q} 旋转 \hat{\textbf{p}}(并因此旋转点 \textbf{p}),旋转角度为  2\phi。注意,由于 \hat{\textbf{q}} 是单位四元数,因此 \hat{\textbf{q}}^{-1}=\hat{\textbf{q}}^{*}。见图 4.9。

 \hat{\textbf{q}} 的任何非零实数倍也表示相同的变换,这意味着 \hat{\textbf{q}}-\hat{\textbf{q}} 表示相同的旋转。也就是说,取反轴 \textbf{u}_{q} 和实部 q_{w},将生成一个四元数,该四元数的旋转与原始四元数的旋转完全相同。这也意味着从矩阵中提取四元数可以返回 \hat{\textbf{q}}-\hat{\textbf{q}}

给定两个单位四元数 \hat{\textbf{q}}\hat{\textbf{r}},首先将 \hat{\textbf{q}} 然后应用于四元数 \hat{\textbf{p}}(可以解释为点 \textbf{p})的连接由式 4.44 给出:

\hat{\textbf{r}}(\hat{\textbf{q}}\hat{\textbf{p}}\hat{\textbf{q}}^{*})\hat{\textbf{r}}^{*}=(\hat{\textbf{r}}\hat{\textbf{q}})\hat{\textbf{q}}(\hat{\textbf{r}}\hat{\textbf{q}})^{*}=\hat{\textbf{c}}\hat{\textbf{p}}\hat{\textbf{c}}^{*}.\;\;\;\;\;\;\;\;\;\;(4.44)

在此,\hat{\textbf{c}}=\hat{\textbf{r}}\hat{\textbf{q}} 是表示单元四元数 \hat{\textbf{q}} 和 \hat{\textbf{r}} 的级联的单元四元数。

 

矩阵转换(Matrix Conversion)

由于通常需要组合几个不同的变换,并且大多数变换都是矩阵形式,因此需要一种将公式4.43转换为矩阵的方法。四元数 \hat{\textbf{q}} 可以转换成矩阵 \textbf{M}^{q},如公式 4.45 [1633,1634]所示:

\textbf{M}^{q}=\begin{pmatrix} 1-s(q_{y}^{2}+q_{z}^{2}) & s(q_{x}q_{y}-q_{w}q_{z}) & s(q_{x}q_{z}+q_{w}q_{y}) & 0 \\ s(q_{x}q_{y}+q_{w}q_{z}) & 1-s(q_{x}^{2}+q_{z}^{2}) & s(q_{y}q_{z}-q_{w}q_{x}) & 0 \\ s(q_{x}q_{z}-q_{w}q_{y}) & s(q_{y}q_{z}+q_{w}q_{x}) & 1-s(q_{x}^{2}+q_{y}^{2}) & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}.\;\;\;\;\;\;\;\;(4.45)

在此,标量为 s=2/(n(\hat{\textbf{q}}))。对于单元四元数,这简化为

\textbf{M}^{q}=\begin{pmatrix} 1-2(q_{y}^{2}+q_{z}^{2}) & 2(q_{x}q_{y}-q_{w}q_{z}) & 2(q_{x}q_{z}+q_{w}q_{y}) & 0 \\ 2(q_{x}q_{y}+q_{w}q_{z}) & 1-2(q_{x}^{2}+q_{z}^{2}) & 2(q_{y}q_{z}-q_{w}q_{x}) & 0 \\ 2(q_{x}q_{z}-q_{w}q_{y}) & 2(q_{y}q_{z}+q_{w}q_{x}) & 1-2(q_{x}^{2}+q_{y}^{2}) & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}.\;\;\;\;\;\;\;\;(4.46)

一旦构建了四元数,就无需计算三角函数(trigonometric functions),因此转换过程实际上是有效的。

从正交矩阵 \textbf{M}^{q} 到单位四元数 \hat{\textbf{q}} 的反向转换要复杂得多。此过程的关键是公式 4.46 中的矩阵具有以下差异:

\\ \\m_{21}^{q}-m_{12}^{q}=4q_{w}q_{x}, \\m_{02}^{q}-m_{20}^{q}=4q_{w}q_{y},\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(4.47) \\m_{10}^{q}-m_{01}^{q}=4q_{w}q_{z}.

这些等式的含义是,如果 q_{w} 是已知的,则可以计算向量 \textbf{v}_{q} 的值,从而得出 \hat{\textbf{q}}。的踪迹由下式计算

\\ tr(\textbf{M}^{q})=4-2s(q_{x}^{2}+q_{y}^{2}+q_{z}^{2})=4\left ( 1-\frac{q_{x}^{2}+q_{y}^{2}+q_{z}^{2}}{q_{x}^{2}+q_{y}^{2}+q_{z}^{2}+q_{w}^{2}} \right ) \;\;\;\;\;\;\;\;\;\;(4.48) \\ =\frac{4q_{w}^{2}}{q_{x}^{2}+q_{y}^{2}+q_{z}^{2}+q_{w}^{2}}=\frac{4q_{w}^{2}}{n(\hat{\textbf{q}})^{2}}. \\

此结果将对单位四元数产生以下转换:

q_{w}=\frac{1}{2}\sqrt{tr(\textbf{M}^{q})},      q_{x}=\frac{m_{21}^{q}-m_{12}^{q}}{4q_{w}},

q_{y}=\frac{m_{02}^{q}-m_{20}^{q}}{4q_{w}},      q_{z}=\frac{m_{10}^{q}-m_{01}^{q}}{4q_{w}}.\;\;\;\;\;\;\;\;\;\;(4.49)

为了具有数值稳定的例程 [1634],应该避免小数除法。因此,首先设置  t=q_{w}^{2}-q_{x}^{2}-q_{y}^{2}-q_{z}^{2},由此得出

\\m_{00}=t+2q_{x}^{2}, \\m_{11}=t+2q_{y}^{2}, \\m_{22}=t+2q_{z}^{2},\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(4.50) \\u=m_{00}+m_{11}+m_{22}=t+2q_{w}^{2},

这又意味着 m_{00},\;m_{11},\;m_{22} 和 u 中的最大值确定 q_{x},\;q_{y},\;q_{z}, 和  q_{w} 中的哪个最大。如果 q_{w} 最大,则使用公式 4.49 得出四元数。否则,我们注意到以下情况成立:

\\4q_{x}^{2}=+m_{00}-m_{11}-m_{22}+m_{33}, \\4q_{y}^{2}=+m_{00}-m_{11}-m_{22}+m_{33}, \\4q_{z}^{2}=+m_{00}-m_{11}-m_{22}+m_{33},\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(4.51) \\4q_{w}^{2}=tr(\textbf{M}^{q}).

然后,使用上述方程式的适当公式来计算 q_{x},\;q_{y} 和 q_{z} 的最大值,然后使用公式 4.47 计算 \hat{\textbf{q}} 剩下的部分。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

 

球面线性插值(Spherical Linear Interpolation)
 
球面线性插值是一种操作,即在给定两个单元四元数  \hat{\textbf{q}} 和  \hat{\textbf{r}} 以及参数 t\;\epsilon \;[0,1] 的情况下,计算插值四元数。例如,这对于动画对象很有用。插值相机的方向没有用,因为插值期间相机的“向上”向量可能会倾斜,通常是一种干扰效果。
该运算的代数形式由下面的复合四元数  \hat{\textbf{s}} 表示:
\hat{\textbf{s}}(\hat{\textbf{q}},\hat{\textbf{r}},t)=(\hat{\textbf{r}}\hat{\textbf{q}}^{-1})^{t}\hat{\textbf{q}}.\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(4.52)
但是,对于软件实现,以下形式更合适:(下边的 slerp 代表球面线性插值  spherical linear interpolation
\hat{\textbf{s}}(\hat{\textbf{q}},\hat{\textbf{r}},t)=slerp(\hat{\textbf{q}},\hat{\textbf{r}},t)=\frac{sin(\phi(1-t))}{sin\;\phi}\hat{\textbf{q}}+\frac{sin(\phi t)}{sin(\phi)}\hat{\textbf{r}}.\;\;\;\;\;\;\;\;\;\;(4.53)
为了计算该方程式所需的  \phi,可以使用以下事实: cos\;\phi=q_{x}r_{x}+q_{y}r_{y}+q_{z}r_{z}+q_{w}r_{w}  [325]。对于 t\;\epsilon \;[0,1],slerp 函数计算(唯一 (2))内插四元数,它们共同构成从 \hat{\textbf{q}}(t=0) 到  \hat{\textbf{r}}(t=1) 的二维单位球面上的最短弧。圆弧位于由 \hat{\textbf{q}}\hat{\textbf{r}}  和原点之间的平面与三维单位球面的交点形成的圆上。如图 4.10 所示。计算出的旋转四元数以固定速度绕固定轴旋转。这样的曲线具有恒定速度,因此加速度为零,称为测地曲线( geodesic  curve)  [229]。球体上的大圆是通过原点和球体的平面相交而生成的,这种圆的一部分称为大圆弧( great arc)。
图4.10。单位四元数表示为单位球面上的点。slerp函数用于在四元数之间进行插值,并且插值路径是球面上的大弧。请注意,从 \hat{\textbf{q}}_{1} 到  \hat{\textbf{q}}_{2} 进行插值,以及从 \hat{\textbf{q}}_{1} 到  \hat{\textbf{q}}_{3} 到  \hat{\textbf{q}}_{2} 进行插值,即使它们到达相同的方向,也是不一样的。
 
slerp 函数非常适合在两个方向之间进行插值,并且表现良好(固定轴,恒定速度)。使用多个欧拉角插值时则不是这种情况。
实际上,直接计算一个 slerp 是昂贵的操作,因为它涉及调用三角函数(trigonometric functions)。Malyshau [1114]讨论了将四元数集成到渲染管线中的问题。他指出,如果不使用 slerp 而是简单地在像素着色器中对四元数进行归一化,则 90 度角的三角形方向误差最大为 4 度。栅格化三角形时,此错误率可以接受。Li [1039,1040]提供了更快的增量方法(incremental methods)来计算不牺牲任何准确性的 slerps。Eberly [406]提出了一种仅使用加法和乘法来计算视力的快速技术。
当方向大于两个时,我们称   \hat{\textbf{q}}_{0},\hat{\textbf{q}}_{1},...,\hat{\textbf{q}}_{n-1}  可用,我们想从 \hat{\textbf{q}}_{0} 到  \hat{\textbf{q}}_{1} 再到  \hat{\textbf{q}}_{2} 进行插值,依此类推,直到  \hat{\textbf{q}}_{n-1} 为止,此时 slerp 可以直接使用。现在,当我们称 \hat{\textbf{q}}_{i} 时,我们将使用 \hat{\textbf{q}}_{i-1} 和  \hat{\textbf{q}}_{i} 作为 slerp 的参数。通过  \hat{\textbf{q}}_{i} 之后,我们将使用  \hat{\textbf{q}}_{i} 和  \hat{\textbf{q}}_{i+1} 作为 slerp 的参数。这将导致突然的抽搐现象出现在方向插值中,如图 4.10 所示。这类似于线性插补点时发生的情况。请参阅第 720 页的图 17.3 的右上部分。某些读者在阅读了第 17 章中的样条线(splines)后,可能希望重新阅读以下段落。
一种更好的插值方法是使用某种样条线。我们在qˆi和qˆi + 1之间引入四元数aˆi和aˆi + 1。可以在四元数qˆi,aˆi,aˆi + 1和qˆi + 1的集合内定义球形三次插值。令人惊讶的是,这些额外的四元数的计算如下 [404]  (3) 所示:
 
\hat{\textbf{a}}_{i}=\hat{\textbf{q}}_{i}\;\textrm{exp}\left [ -\frac{\textrm{log}(\hat{\textbf{q}}_{i}^{-1}\hat{\textbf{q}}_{i-1})+\textrm{log}(\hat{\textbf{q}}_{i}^{-1}\hat{\textbf{q}}_{i+1})}{4} \right ].\;\;\;\;\;\;\;\;\;\;(4.54)
\hat{\textbf{q}}_{i} 和  \hat{\textbf{a}}_{i} 将用于使用光滑三次样条球面插值四元数,如公式 4.55 所示:
\\ \textrm{squad}(\hat{\textbf{q}}_{i},\hat{\textbf{q}}_{i+1},\hat{\textbf{a}}_{i},\hat{\textbf{a}}_{i+1},t)= \\ \textrm{slerp}(\textrm{slerp}(\hat{\textbf{q}}_{i}+\hat{\textbf{q}}_{i+1},t),\textrm{slerp}(\hat{\textbf{a}},\hat{\textbf{a}}_{i+1},t),2t(1-t)).\;\;\;\;\;\;\;\;\;\;(4.55) \\
从上面可以看出,squad 函数是通过使用 slerp 的重复球面插值法构建的(有关点的重复线性插值的信息,请参见第 17.1.1 节)。插值将通过初始方向  \hat{\textbf{q}}_{i},i\epsilon [0,...,n-1] ,但不是通过  \hat{\textbf{a}}_{i} 来表示初始位置处的切线方向。

作者注:

(2) 当且仅当 \hat{\textbf{q}} 和 \hat{\textbf{r}} 不相反时。

(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

 

 
从一个向量旋转到另一个向量(Rotation from One Vector to Another)
 
常见的操作是通过最短路径从一个方向s转换到另一个方向t。四元数的数学极大地简化了此过程,并显示了四元数与该表示形式的密切关系。首先,将 \textbf{s}\textbf{t} 归一化。然后计算称为 \textbf{u} 的单位旋转轴,其计算公式为 \textbf{u}=(\textbf{s}\times \textbf{t})/\left \| \textbf{s}\times \textbf{t} \right \| 。接下来, e=\textbf{s}\cdot \textbf{t}=\textrm{cos}(2\phi) 和 \left \| \textbf{s}\times\textbf{t} \right \| =\textrm{sin}(2\phi) ,其中 2\phi 是 \textbf{s} 和  \textbf{t} 之间的角度。那么表示从 \textbf{s} 到  \textbf{t} 旋转的四元数为 \hat{\textbf{q}}=(\textrm{sin}\phi\textbf{u},\;\textrm{cos}\phi) 。实际上,使用半角关系和三角恒等式简化  \hat{\textbf{q}}=(\frac{\textrm{sin}\;\phi}{\textrm{sin}\;2\phi}(\textbf{s}\times \textbf{t}),\;\textrm{cos}\;\phi) ,得到 [1197]
 
\hat{\textbf{q}}=(\textbf{q}_{v},q_{w})=\left ( \frac{1}{\sqrt{2(1+e)}}(\textbf{s}\times \textbf{t}) ,\frac{\sqrt{2(1+e)}}{2} \right ).\;\;\;\;\;\;\;\;\;\;(4.56)

\textbf{s}\textbf{t} 指向几乎相同的方向时,以这种方式直接生成四元数(相对于叉积 \textbf{s}\times \textbf{t} 的归一化)避免了数值不稳定 [1197]。当 \textbf{s}\textbf{t} 指向相反的方向时,这两种方法都会出现稳定性问题,因为它们会被零除。当检测到这种特殊情况时,可以使用任何垂直于 \textbf{s} 的旋转轴旋转到 \textbf{t}

有时我们需要从 \textbf{s} 到 \textbf{t} 旋转的矩阵表示。在对公式 4.46 进行一些代数和三角简化之后,旋转矩阵变为 [1233]

\textbf{R}(\textbf{s},\textbf{t})=\begin{pmatrix} e+hv_{x}^{2} & hv_{x}v_{y}-v_{z} & hv_{x}v_{z}+v_{y} & 0 \\ hv_{x}v_{y}+v_{z} & e+hv_{y}^{2} & hv_{y}v_{z}-v_{x} & 0 \\ hv_{x}v_{z}-v_{y} & hv_{y}v_{z}+v_{x} & e+hv_{z}^{2} & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}.\;\;\;\;\;\;\;\;\;\;(4.57)

在此等式中,我们使用了以下中间计算(intermediate calculations):

\\ \textbf{v}=\textbf{s}\times\textbf{t}, \\ e=\textrm{cos}(2\phi)=\textbf{s}\cdot\textbf{t},\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(4.58) \\ h=\frac{1-\textrm{cos}(2\phi)}{\textrm{sin}^{2}(2\phi)}=\frac{1-e}{\textbf{v}\cdot\textbf{v}}=\frac{1}{1+e}.

可以看出,由于简化,所有平方根和三角函数都消失了,因此这是创建矩阵的有效方法。请注意,公式 4.57 的结构类似于公式 4.30 的结构,并请注意,后一种形式是怎样做到不需要三角函数。

请注意,当 \textbf{s} 和 \textbf{t} 平行或接近平行时必须小心,因为 \left \| \textbf{s} \times \textbf{t} \right \|\approx 0。如果 \phi\approx 0,那么我们可以返回单位矩阵。但是,如果2\phi \approx \pi,那么我们可以绕任何轴旋转 \pi 弧度。该轴可以作为 \textbf{s} 与不平行于 \textbf{s} 的任何其他向量之间的叉积找到(第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 表示,其中 \textbf{p} 是原始顶点,而 \textbf{u}(t) 是变换后的顶点,其位置取决于时间 \textbf{t}

\textbf{u}(t)=\sum^{n-1}_{i=0}w_{i}\textbf{B}_{i}(t)\textbf{M}_{i}^{-1}\textbf{p},\;\;\textrm{where}\;\;\sum ^{n-1}_{i=0}w_{i}=1,\;\;w_{i}\geq 0.\;\;\;\;\;\;\;\;(4.59)

有 n 个骨骼影响 \textbf{p} 的位置,这在世界坐标中表示出来。值 w_{i} 是顶点 \textbf{p} 的骨骼 i 的权重。\textbf{M}_{i} 矩阵从初始骨骼的坐标系转换为世界坐标。通常,骨骼的控制关节位于其坐标系的原点。例如,前臂骨骼将其肘关节移动到原点,而动画旋转矩阵将手臂的这一部分绕关节移动。\textbf{B}_{i}(t) 矩阵是第 i 个骨骼的世界变换,会随着时间变化以对对象进行动画处理,并且通常是多个矩阵的串联,例如以前的骨骼变换的层次结构和局部动画矩阵。

Woodland [1903]深入讨论了一种维护和更新 \textbf{B}_{i}(t) 矩阵动画函数的方法。每个骨骼都将一个顶点转换到相对于其自己的参照系的位置,并从一组计算点中插值最终位置。在一些蒙皮讨论中未明确显示矩阵 \textbf{M}_{i},而是将其视为 \textbf{B}_{i}(t) 的一部分。我们在这里介绍它是因为它是有用的矩阵,并且几乎总是矩阵级联过程的一部分。

在实践中,对于动画的每一帧,为每个骨骼连接矩阵 \textbf{B}_{i}(t) 和 \textbf{M}_{i}^{-1},并且每个结果矩阵都用于变换顶点。顶点 \textbf{p} 由不同骨骼的级联矩阵转换,然后使用权重 w_{i} 进行混合,因此称为顶点混合(vertex blending)。权重是非负的,并且总和为1,因此发生的事情是将顶点转换到几个位置,然后在其中进行插值。这样,对于所有的 i=0\;...\;n-1,变换后的点 \textbf{u} 将位于点集 \textbf{B}_{i}(t)\textbf{M}_{i}^{-1}\textbf{p} (固定的 t )的凸包中。通常也可以使用公式 4.59 转换法线。根据所使用的变换(例如,如果骨骼被拉伸或压扁了很多),可能需要对\textbf{B}_{i}(t)\textbf{M}_{i}^{-1} 的逆进行转置,如第 4.1.7 节中所述。

顶点混合非常适合在 GPU 上使用。网格中的顶点集可以放置在静态缓冲区中,该缓冲区会一次发送到 GPU 并重新使用。在每个框架中,只有骨骼矩阵会发生变化,而顶点着色器会计算它们对存储的网格的影响。这样,可以最大程度地减少在 CPU 上处理和从 CPU 传输的数据量,从而使 GPU 可以有效地渲染网格。如果可以将模型的整个骨矩阵一起使用,则是最简单的。否则,必须拆分模型并复制一些骨骼。或者,可以将骨骼变换存储在顶点访问的纹理中,从而避免达到寄存器存储限制。通过使用四元数表示旋转,每个变换可以仅存储在两个纹理中 [1639]。如果可用,无序访问视图存储将允许重新使用蒙皮结果 [146]

我们可以指定超出 [0,1] 范围或不等于 1 的权重集。但是,这仅在使用某些其他混合算法(例如变形目标,morph targets)(第4.5节)时才有意义。

基本顶点融合的一个缺点是可能发生不必要的折叠,扭曲和自相交 [1037]。见图 4.13。更好的解决方案是使用双季铵盐 [872,873]。这种执行蒙皮的技术有助于保持原始变换的刚度,因此避免了四肢的“糖果包裹”扭曲。计算量不到线性蒙皮混合的成本的 1.5 倍,并且效果很好,这导致该技术的快速采用。然而,双四元数蒙皮会导致鼓起效果,Le 和 Hodgins [1001]提出了旋转中心蒙皮作为更好的选择。他们基于这样的假设:局部变换应该是刚体,并且具有相似权重 w_{i} 的顶点应该具有相似的变换形式。预先为每个顶点计算旋转中心,同时施加正交(刚体)约束以防止肘关节塌陷和糖果包装纸扭曲伪像(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

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值