R = [ r 0 0 1 ] R = \left[ \begin{array}{lcr} r & 0\\ 0 & 1 \end{array} \right] R = [ r 0 0 1 ] ,
假设我们已有一个物体坐标系 “time=0,” o 0 ⃗ t = w ⃗ t R 0 \vec{\mathbf{o}0}^t = \vec{\mathbf{w}}^tR_0 o 0 t = w t R 0 ,和另一个物体坐标系“time=1",o ⃗ 1 t = w ⃗ t R 1 \vec{\mathbf{o}}^t_1 = \vec{\mathbf{w}}^t R_1 o 1 t = w t R 1 ,其中R 0 R_0 R 0 和R 1 R_1 R 1 是 4x4 旋转矩阵。假设我们希望找到一个坐标系序列o α ⃗ t \vec{\mathbf{o}\alpha}^t o α t ,其中α ∈ [ 0...1 ] \alpha \in [0...1] α ∈ [ 0...1 ] ,得到一个从o ⃗ 0 t \vec{\mathbf{o}}^t_0 o 0 t 到o ⃗ 1 t \vec{\mathbf{o}}^t_1 o 1 t 的自然旋转。
一个想法是定义R α : = ( 1 − α ) R 0 + ( α ) R 1 R\alpha:=(1-\alpha)R_0+(\alpha)R_1 R α := ( 1 − α ) R 0 + ( α ) R 1 并且设置o ⃗ t α = w ⃗ t R α \vec{\mathbf{o}}^t\alpha = \vec{\mathbf{w}}^tR\alpha o t α = w t R α 。这样做的问题在于,在对矩阵线性插值时,每个向量只是简单的沿着直线移动(如图 7.1)。此时,过渡的R α R\alpha R α 并非旋转矩阵,这明显是不可接受的。 此外(尤其是在 3D 中),想要设法找到一个与这一插值矩阵近似,并且能够抵消掉这种挤压效果的真正的旋转矩阵,也并不容易。
图7.1 :对于 R i R_i R i 矩阵进行线性插值,只能起到让向量沿着直线方向移动的效果,没有旋转运动
另一个不值得深究想法,是用某种方法将R 0 R_0 R 0 和R 1 R_1 R 1 提取为欧拉角的形式(如图 2.5)。可以用α \alpha α 对得到的三个标量进行线性插值。插值后的欧拉角可以用来对旋转进行过渡。这样做的结果是,得到的插值旋转序列无论在物理上还是几何上都不自然。例如,当基向量变化时它不具有不变性(invariant)(不变性在随后被定义)。
我们真正想做的是,首先创建一个过渡矩阵R 1 R 0 − 1 R_1R_0^{-1} R 1 R 0 − 1 。这个矩阵能够和任何旋转矩阵一样,被看做是沿着某个轴向 [ k x , k y , k z ] t [k_x, k_y, k_z]^t [ k x , k y , k z ] t 旋转了某个角度θ \theta θ 。我们现在想象一下我们有一个操作 ( R 1 R 0 − 1 ) α (R_1R_0^{-1})^\alpha ( R 1 R 0 − 1 ) α 可以给我们一个旋转。然后想要定义
o α ⃗ t = w ⃗ α t R α \vec{\mathbf{o}_\alpha}^t = \vec{\mathbf{w}}^t_\alpha R_\alpha o α t = w α t R α
就会很自然了。这样做我们可以得到一个坐标系序列,沿着某个轴向持续旋转,我们不断增加α,直到完成后续姿态。很明显,开始的时候有w ⃗ t ( R 1 R 0 − 1 ) 0 R 0 = w ⃗ t R 0 = o ⃗ 0 t \vec{\mathbf{w}}^t(R_1R_0^{-1})^0 R_0 = \vec{\mathbf{w}}^tR_0 = \vec{\mathbf{o}}^t_0 w t ( R 1 R 0 − 1 ) 0 R 0 = w t R 0 = o 0 t , 并且最终有 w ⃗ t ( R 1 R 0 − 1 ) 1 R 0 = w ⃗ t R 1 = o ⃗ 1 t \vec{\mathbf{w}}^t(R_1R_0^{-1})^1 R_0 = \vec{\mathbf{w}}^tR_1 = \vec{\mathbf{o}}^t_1 w t ( R 1 R 0 − 1 ) 1 R 0 = w t R 1 = o 1 t , 正如我们所期望的一样。
这里最关键的部分是以轴/角对的方式提取出过渡的旋转矩阵,例如R 1 R 0 − 1 R_1R_0^{-1} R 1 R 0 − 1 。四元数的理念是,始终跟踪记录轴和角的数据,因而就无需再进行这样的提取了。重要的是,以四元数表示旋转时,使用旋转矩阵时需要用到的必须操作,我们仍然能够继续使用。
在这里我们需要澄清一个细节。矩阵R 1 R 0 − 1 R_1R_0^{-1} R 1 R 0 − 1 实际上,可以被看做θ + n 2 π \theta+n2\pi θ + n 2 π 度的旋转,n n n 可以为任何整数。将这个旋转的影响看做对一个向量进行线性变换时,这个额外的2 π 2\pi 2 π 是无关的。但当定义一个指数操作符给我们“一个绕着单一轴逐渐旋转的坐标系序列,直到完成后续姿态”时,我们需要决定怎样通过给定的矩阵R 1 R 0 − 1 R_1R_0^{-1} R 1 R 0 − 1 选择n n n 的值。对插值来说,自然的选择是选择当 ∣ θ + n 2 π ∣ |\theta+n2\pi | ∣ θ + n 2 π ∣ 值最小时的n n n 。即意味着,对于这个n n n 来说,θ + n 2 π ∈ [ − π . . . π ] \theta+n2\pi \in [ -\pi... \pi ] θ + n 2 π ∈ [ − π ... π ] 。另外,这个选择是没有歧义的(unambiguous)(除了 θ = π + n 2 π \theta = \pi + n2\pi θ = π + n 2 π 时,此时我们需要在− π -\pi − π 和π \pi π 之间随意取值)。实际上,这个关于n n n 的选择在随后的 7.4 章中会提到。
假设我们有一个变化的世界坐标系w ⃗ ′ t \vec{\mathbf{w}}'^t w ′ t 例如w ⃗ t = w ⃗ ′ t R l \vec{\mathbf{w}}^t=\vec{\mathbf{w}}'^t Rl w t = w ′ t Rl ,其中R l R_l R l 是某个固定的“左”旋转矩阵。使用这个坐标系,我们可以重新表示我们原先的插值问题为在 o ⃗ 0 t : = w ⃗ ′ t R l R 0 \vec{\mathbf{o}}^t_0:=\vec{\mathbf{w}}'^t R_lR_0 o 0 t := w ′ t R l R 0 和 o ⃗ 1 t : = w ⃗ ′ t R l R 1 \vec{\mathbf{o}}^t_1:=\vec{\mathbf{w}}'^t R_lR_1 o 1 t := w ′ t R l R 1 之间插值。左不变性(left Invariance)就是说,如果这个表示方式的更换没有改变我们插值的结果:如果原始的插值是 o ⃗ t α = w ⃗ t R α \vec{\mathbf{o}}^t\alpha=\vec{\mathbf{w}}^t R\alpha o t α = w t R α , 而新方法表示的插值是 w ⃗ ′ t R l R α = w ⃗ t R α \vec{\mathbf{w}}'^tR_lR\alpha=\vec{\mathbf{w}}^t R\alpha w ′ t R l R α = w t R α ,即我们得到了刚好同样的 o ⃗ t α \vec{\mathbf{o}}^t\alpha o t α 。 换句话说,如果一个插值只取决于几何体上的物体坐标系 o ⃗ 0 t \vec{\mathbf{o}}^t_0 o 0 t 和o ⃗ 1 t \vec{\mathbf{o}}^t_1 o 1 t , 而与世界坐标系和R 0 R_0 R 0 以及R 1 R_1 R 1 的结果无关,那么插值过程具有左不变性。左不变性是一个十分自然的属性;只有很少的情况下插值与世界坐标系的选择是有关的。
图7.2 :当我们以 w ⃗ ′ t \vec{\mathbf{w}}'^t w ′ t 替代w ⃗ t \vec{\mathbf{w}}^t w t 时,如果一个插值不因此发生变化,则该插值就具有左不变性。(本图中的操作只涉及旋转,其中图像的位移是为了更方便我们观察它。)
我们可以看出等式(7.1)满足左不变性如下。仿射变换的“过渡”, 将坐标系o ⃗ 0 t \vec{\mathbf{o}}^t_0 o 0 t 映射到另外一个坐标系o ⃗ 1 t \vec{\mathbf{o}}^t_1 o 1 t 上,过程总是唯一的。 在本例中,因为我们的坐标系是右手系,正交,并且共用一个原点,这一变换肯定是旋转变换。同时,我们刚刚定义的指数操作符(也就是,保持轴向不变的同时变换角度)是一个隐性的几何体操作并且可以在不参照任何坐标系的情况下被描述。因此,这个插值过程不依赖于世界坐标系的选择并且具有左不变性。
相比之下,右不变性,表示即使我们改变所使用的物体坐标系,该物体的插值也会发生改变。 比如说,假设我们有一个“右”旋转矩阵R r Rr R r ,并且用它来定义新的物体坐标系,在 time=0 和 time=1 时分别为 o ⃗ 0 t R r \vec{\mathbf{o}}^t_0 R_r o 0 t R r 和o ⃗ 1 t R r \vec{\mathbf{o}}^t_1 R_r o 1 t R r 。 因为我们不希望物体本身的姿态发生改变,我们使用c ′ = R r − 1 c \mathbf{c}' = R_r^{-1}\mathbf{c} c ′ = R r − 1 c 为物体上的所有点重新指定合适的物体坐标系。如果对物体坐标系的这一改变,对于旋转物体自身的插值没有影响,我们就说这个插值满足右不变性。换句话说,如果原始的插值给我们R α R\alpha R α 然后新的插值给我们 o ⃗ α = w ⃗ t R α \vec{\mathbf{o}}\alpha=\vec{\mathbf{w}}^tR\alpha o α = w t R α 。 可以看出,物体的插值(使用新的物体坐标系c ′ \mathbf{c}' c ′ )没有变化。右不变性是一个十分自然的属性。但是我们将会看到当我们将位移包括进来时,我们也许希望插值与物体坐标系的原点有关。
我们可以直接看出等式(7.1)表示的插值满足右不变性如下 [ ( R 1 R r − 1 ) ( R r R 0 ) ] α R 0 R r = ( R 1 R 0 − 1 ) α R 0 R r = R α R r [(R_1R_r^{-1})(R_rR_0)]^\alpha R_0R_r=(R_1R_0^{-1})^\alpha R_0R_r=R_\alpha R_r [( R 1 R r − 1 ) ( R r R 0 ) ] α R 0 R r = ( R 1 R 0 − 1 ) α R 0 R r = R α R r
[ w c ^ ] \left[ \begin{array}{lcr} w\\ \mathbf{\hat{c}} \end{array}\right] [ w c ^ ] ,
其中w w w 是一个标量,而c ^ \mathbf{\hat{c}} c ^ 是一个三维的坐标系向量。我们加一个 “∧” 符号来标记它,以便与四维坐标系向量区分。
为了表示一个绕着单位长度的轴向k ^ \mathbf{\hat{k}} k ^ 旋转θ \theta θ 度,我们使用四元数
[ cos ( θ 2 ) sin ( θ 2 ) k ^ ] \left[ \begin{array}{ccc} \cos(\frac{\theta}{2}) \\ \sin(\frac{\theta}{2})\mathbf{\hat{k}} \end{array}\right] [ cos ( 2 θ ) sin ( 2 θ ) k ^ ] ,
角度需要除以2看起来有点奇怪,但它能够让四元数旋转正常工作,我们随后会描述到。注意一个绕着 − k ^ -\mathbf{\hat{k}} − k ^ 轴向旋转− θ -\theta − θ 角度给我们同样的四元数。 一个绕着轴向k ^ \mathbf{\hat{k}} k ^ 旋转θ + 4 π \theta+4\pi θ + 4 π 度也会给我们同样的四元数。 目前为止一切都很好。奇怪的是,绕着轴向k ^ \mathbf{\hat{k}} k ^ 旋转θ + 2 π \theta+2\pi θ + 2 π 度, 它实际上是同样的旋转,却会给我们一个负的四元数
[ − cos ( θ 2 ) − sin ( θ 2 ) k ^ ] \left[ \begin{array}{ccc} -\cos(\frac{\theta}{2}) \\ -\sin(\frac{\theta}{2})\mathbf{\hat{k}} \end{array}\right] [ − cos ( 2 θ ) − sin ( 2 θ ) k ^ ] ,
[ 1 0 ^ ] , [ − 1 0 ^ ] \left[ \begin{array}{ccc} 1 \\ \mathbf{\hat{0}} \end{array}\right] , \left[ \begin{array}{ccc} -1 \\ \mathbf{\hat{0}} \end{array}\right] [ 1 0 ^ ] , [ − 1 0 ^ ]
[ 1 k ^ ] , [ − 1 k ^ ] \left[ \begin{array}{ccc} 1 \\ \mathbf{\hat{k}} \end{array}\right] , \left[ \begin{array}{ccc} -1 \\ \mathbf{\hat{k}} \end{array}\right] [ 1 k ^ ] , [ − 1 k ^ ]
表示沿着k ^ \mathbf{\hat{k}} k ^ 轴旋转18 0 ∘ 180^\circ 18 0 ∘ 。
[ cos ( θ 2 ) sin ( θ 2 ) k ^ ] \left[ \begin{array}{ccc} \cos(\frac{\theta}{2}) \\ \sin(\frac{\theta}{2})\mathbf{\hat{k}} \end{array}\right] [ cos ( 2 θ ) sin ( 2 θ ) k ^ ]
α [ w c ^ ] = [ α w α c ^ ] \alpha \left[ \begin{array}{ccc} w \\ \mathbf{\hat{c}} \end{array}\right] = \left[ \begin{array}{ccc} \alpha w \\ \alpha\mathbf{\hat{c}} \end{array}\right] α [ w c ^ ] = [ α w α c ^ ]
其中⋅ \cdot ⋅ 和× \times × 是 3D 向量的点乘和叉乘。这个奇怪的相乘拥有以下有用的属性:如果[ w i , c ^ i ] t [w_i,\mathbf{\hat{c}}_i]^t [ w i , c ^ i ] t 表示旋转矩阵R i R_i R i , 而乘法[ w 1 , c ^ 1 ] t [ w 2 , c ^ 2 ] t [w_1,\mathbf{\hat{c}}_1]^t[w_2,\mathbf{\hat{c}}_2]^t [ w 1 , c ^ 1 ] t [ w 2 , c ^ 2 ] t 表示旋转矩阵R 1 R 2 R_1R_2 R 1 R 2 。 这个属性可以通过一系列不是很直观的计算来验证。
[ cos ( θ 2 ) sin ( θ 2 ) k ^ ] − 1 = [ cos ( θ 2 ) − sin ( θ 2 ) k ^ ] \left[ \begin{array}{ccc} \cos(\frac{\theta}{2}) \\ \sin(\frac{\theta}{2})\mathbf{\hat{k}} \end{array}\right]^{-1} = \left[ \begin{array}{ccc} \cos(\frac{\theta}{2}) \\ -\sin(\frac{\theta}{2})\mathbf{\hat{k}} \end{array}\right] [ cos ( 2 θ ) sin ( 2 θ ) k ^ ] − 1 = [ cos ( 2 θ ) − sin ( 2 θ ) k ^ ]
这个四元数简单的绕着同样的轴旋转− θ ∘ -\theta^\circ − θ ∘ 度。(逆也可以由非单位四元数定义,但我们不需要用到这个。)
重要的是,我们可以用四元数相乘来对一个坐标系向量实施一个旋转。假设我们有一个四维的坐标系向量 c = [ c ^ , 1 ] t \mathbf{c} = [\mathbf{\hat{c}},1]^t c = [ c ^ , 1 ] t ,并且我们用一个 4x4 的旋转矩阵左乘它来得到
c ′ = R c \mathbf{c}'=R\mathbf{c} c ′ = R c ,
在此返回给我们的四维坐标系向量是 c ′ = [ c ^ ′ , 1 ] t \mathbf{c}' = [\mathbf{\hat{c}}',1]^t c ′ = [ c ^ ′ , 1 ] t 。想用四元数来实现它, 需要先让R R R 以单位归一化的四元数形式来表示为
[ cos ( θ 2 ) sin ( θ 2 ) k ^ ] \left[ \begin{array}{ccc} \cos(\frac{\theta}{2}) \\ \sin(\frac{\theta}{2})\mathbf{\hat{k}} \end{array}\right] [ cos ( 2 θ ) sin ( 2 θ ) k ^ ]
我们用三维坐标系向量c ^ \mathbf{\hat{c}} c ^ 来创造一个非单位四元数
[ 0 c ^ ] \left[ \begin{array}{ccc} 0 \\ \mathbf{\hat{c}} \end{array}\right] [ 0 c ^ ]
[ 0 c ^ ′ ] \left[ \begin{array}{ccc} 0 \\ \mathbf{\hat{c}}' \end{array}\right] [ 0 c ^ ′ ] ,
其中c ^ ′ \mathbf{\hat{c}}' c ^ ′ 是我们想要得到的三维坐标系向量。
[ cos ( θ 2 ) sin ( θ 2 ) k ^ ] α = [ cos ( α θ 2 ) sin ( α θ 2 ) k ^ ] \left[ \begin{array}{ccc} \cos(\frac{\theta}{2}) \\ \sin(\frac{\theta}{2})\mathbf{\hat{k}} \end{array}\right]^{\alpha} = \left[ \begin{array}{ccc} \cos(\frac{\alpha\theta}{2}) \\ \sin(\frac{\alpha\theta}{2})\mathbf{\hat{k}} \end{array}\right] [ cos ( 2 θ ) sin ( 2 θ ) k ^ ] α = [ cos ( 2 α θ ) sin ( 2 α θ ) k ^ ]
[ cos ( θ 0 2 ) sin ( θ 0 2 ) k ^ ] [ cos ( θ 1 2 ) sin ( θ 1 2 ) k ^ ] \left[ \begin{array}{ccc} \cos(\frac{\theta_0}{2}) \\ \sin(\frac{\theta_0}{2})\mathbf{\hat{k}} \end{array}\right] \left[ \begin{array}{ccc} \cos(\frac{\theta_1}{2}) \\ \sin(\frac{\theta_1}{2})\mathbf{\hat{k}} \end{array}\right] [ cos ( 2 θ 0 ) sin ( 2 θ 0 ) k ^ ] [ cos ( 2 θ 1 ) sin ( 2 θ 1 ) k ^ ]
这个插值操作经常被称为球面线性插值,原因如下。单位四元数的四个实数的平方和为1;因此,我们可以将它看做单位四维球体R 4 \mathbb{R}^4 R 4 上的一个几何体点。如果从两个单位四元数开始并且对它们进行插值,就可以从公式(7.4)看出,在球体R 4 \mathbb{R}^4 R 4 上得到的轨迹,实际上和将两个单位球上的点连接起来的大圆弧完全相同。而且,在该轨迹上的插值出的弧长与α \alpha α 成比例。
在任何维度n n n 下,都可以用一个三角参数来表示在任何两个单位向量, v 0 ⃗ \vec{v_0} v 0 和v 1 ⃗ \vec{v_1} v 1 间的球面线性插值,计算如下
其中Ω \Omega Ω 是R 4 \mathbb{R}^4 R 4 内向量间的角度。因此,我们可以将等式(7.4)替换为
其中Ω \Omega Ω 是R 4 \mathbb{R}^4 R 4 四元数中起始和最终的角度。稍后,我们会讲到验证等式(7.4)和(7.6)所需要的步骤。注意在等式(7.4)中,为了选择“短侧”小于18 0 ∘ 180^\circ 18 0 ∘ 的插值,如果两个四元数之间四维点乘的结果为负,我们必须将两个四元数之一变负。
这样看来,我们可以用R 4 \mathbb{R}^4 R 4 中更简单的线性插值去近似等式(7.4),以及等式(7.6),由此,我们可以简单的计算得到
( 1 − α ) [ cos ( θ 0 2 ) sin ( θ 0 2 ) k ^ 0 ] + ( α ) [ cos ( θ 1 2 ) sin ( θ 1 2 ) k ^ 1 ] (1-\alpha) \left[ \begin{array}{ccc} \cos(\frac{\theta_0}{2}) \\ \sin(\frac{\theta_0}{2})\mathbf{\hat{k}}_0 \end{array}\right] + (\alpha) \left[ \begin{array}{ccc} \cos(\frac{\theta_1}{2}) \\ \sin(\frac{\theta_1}{2})\mathbf{\hat{k}}_1 \end{array}\right] ( 1 − α ) [ cos ( 2 θ 0 ) sin ( 2 θ 0 ) k ^ 0 ] + ( α ) [ cos ( 2 θ 1 ) sin ( 2 θ 1 ) k ^ 1 ]
因为这个插值已经不再是一个单位四元数,我们必须将结果归一化,不过这个很容易。重要的是,这个插值过程,称作线性插值(Lerping),可以得到和更复杂的球面插值(Slerp)同样的轨迹(沿着一个固定的单轴旋转),尽管它在α \alpha α 之间旋转的角度不再是均等的(如图 7.4)。
( 1 − α ) [ w l c ^ l ] [ w 0 c ^ 0 ] + ( α ) [ w l c ^ l ] [ w 1 c ^ 1 ] (1-\alpha) \left[ \begin{array}{ccc} w_l \\ \mathbf{\hat{c}}_l \end{array} \right] \left[ \begin{array}{ccc} w_0 \\ \mathbf{\hat{c}}_0 \end{array}\right] + (\alpha) \left[ \begin{array}{ccc} w_l \\ \mathbf{\hat{c}}_l \end{array}\right] \left[ \begin{array}{ccc} w_1 \\ \mathbf{\hat{c}}_1 \end{array}\right] ( 1 − α ) [ w l c ^ l ] [ w 0 c ^ 0 ] + ( α ) [ w l c ^ l ] [ w 1 c ^ 1 ]
= [ w l c ^ l ] ( ( 1 − α ) [ w 0 c ^ 0 ] + ( α ) [ w 1 c ^ 1 ] ) = \left[ \begin{array}{ccc} w_l \\ \mathbf{\hat{c}}_l \end{array}\right] \left( (1-\alpha) \left[ \begin{array}{ccc} w_0 \\ \mathbf{\hat{c}}_0 \end{array}\right] + (\alpha) \left[\begin{array}{ccc} w_1 \\ \mathbf{\hat{c}}_1 \end{array}\right] \right) = [ w l c ^ l ] ( ( 1 − α ) [ w 0 c ^ 0 ] + ( α ) [ w 1 c ^ 1 ] )
标量相乘可以在四元数乘法之间互换,并且四元数相乘可以提取到和之上。同样,我们可以直接从等式(7.6)看出它也同时具有左不变性和右不变性。计算中唯一有技巧的部分展示了角度Ω \Omega Ω ,同时具有左不变性和右不变性。
线性插值可以比球面插值更有效率的执行。更重要的是,它可以让在n n n 个不同旋转之间的混合概括的更容易。我们可以轻易的混合R 4 \mathbb{R}^4 R 4 中的四元数,并随后将它归一化。这种 n-way 间的混合在构建一系列的旋转曲线(见 section 9.3)以及当为动画蒙皮时(见 section 23.1.2)会很有用。还有一些其他的方法能够在球体内部实现 n-way 混合,尽管这种方法不是一个固定时间的计算方法[10]。
应该说(正如我们之前做的一样)等式(7.6)具有左不变性。注意我们之前已经为等式(7.4)建立了左不变性。因为两种插值方式都具有左不变性,我们可以在不损失一般性的情况下,只考虑R 0 R_0 R 0 是单位矩阵时的情况。
假设R 0 R_0 R 0 是单位矩阵,基于指数的插值等式(7.4)给我们( R 1 ) α (R_1)^\alpha ( R 1 ) α ,即
因为R 0 R_0 R 0 是单位矩阵,初始的四元数是[ 1 , 0 ^ ] t [1,\mathbf{\hat{0}}]^t [ 1 , 0 ^ ] t 。将其代入到等式(7.6),我们可以验证它也符合等式(7.7)。
我们定义Quat
为一个四组的实数。随后我们根据等式(7.2)来定义乘法(q1 * q2)
。 给定一个单位四元数,Quat q
,我们定义它的逆 inv(q)
。 给定一个单位四元数,Quat q
,和一个 Cvec4 c
,我们定义(q * c)
, 根据等式(7.3),将旋转应用于坐标系向量c \mathbf{c} c ,并返回坐标系向量c ′ \mathbf{c}' c ′ 。
[ i t 1 0 1 ] [ r 1 0 0 1 ] [ i t 2 0 1 ] [ r 2 0 0 1 ] \left[ \begin{array}{ccc} i & t_1 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{lcr} r_1 & 0 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{lcr} i & t_2 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{lcr} r_2 & 0 \\ 0 & 1 \end{array} \right] [ i 0 t 1 1 ] [ r 1 0 0 1 ] [ i 0 t 2 1 ] [ r 2 0 0 1 ]
= [ i t 1 0 1 ] [ r 1 r 1 t 2 0 1 ] [ r 2 0 0 1 ] =\left[ \begin{array}{lcr} i & t_1 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{lcr} r_1 & r_1t_2 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{lcr} r_2 & 0 \\ 0 & 1 \end{array} \right] = [ i 0 t 1 1 ] [ r 1 0 r 1 t 2 1 ] [ r 2 0 0 1 ]
= [ i t 1 0 1 ] [ i r 1 t 2 0 1 ] [ r 1 0 0 1 ] [ r 2 0 0 1 ] =\left[ \begin{array}{lcr} i & t_1 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{lcr} i & r_1t_2 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{lcr} r_1 & 0 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{lcr} r_2 & 0 \\ 0 & 1 \end{array} \right] = [ i 0 t 1 1 ] [ i 0 r 1 t 2 1 ] [ r 1 0 0 1 ] [ r 2 0 0 1 ]
= [ i t 1 + r 1 t 2 0 1 ] [ r 1 r 2 0 0 1 ] =\left[ \begin{array}{lcr} i & t_1+r_1t_2 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{lcr} r_1r_2 & 0 \\ 0 & 1 \end{array} \right] = [ i 0 t 1 + r 1 t 2 1 ] [ r 1 r 2 0 0 1 ]
从中我们可以看到,得到的结果是一个新的刚体变换,其中位移为 t 1 + r 1 t 2 t_1 + r_1t_2 t 1 + r 1 t 2 ,而旋转为 r 1 r 2 r_1r_2 r 1 r 2 。
( [ i t 0 1 ] [ r 0 0 1 ] ) − 1 \left( \left[ \begin{array}{lcr} i & t \\ 0 & 1 \end{array} \right] \left[ \begin{array}{lcr} r & 0 \\ 0 & 1 \end{array} \right] \right)^{-1} ( [ i 0 t 1 ] [ r 0 0 1 ] ) − 1
= [ r 0 0 1 ] − 1 [ i t 0 1 ] − 1 =\left[ \begin{array}{lcr} r & 0 \\ 0 & 1 \end{array} \right]^{-1} \left[ \begin{array}{lcr} i & t \\ 0 & 1 \end{array} \right]^{-1} = [ r 0 0 1 ] − 1 [ i 0 t 1 ] − 1
= [ r − 1 0 0 1 ] [ i t − 1 0 1 ] =\left[ \begin{array}{lcr} r^{-1} & 0 \\ 0 & 1 \end{array} \right]\left[ \begin{array}{lcr} i & t^{-1} \\ 0 & 1 \end{array} \right] = [ r − 1 0 0 1 ] [ i 0 t − 1 1 ]
= [ r − 1 − ( r − 1 t ) 0 1 ] =\left[ \begin{array}{lcr} r^{-1} & -(r^{-1}t) \\ 0 & 1 \end{array} \right] = [ r − 1 0 − ( r − 1 t ) 1 ]
= [ i − ( r − 1 t ) 0 1 ] [ i 0 0 1 ] =\left[ \begin{array}{lcr} i & -(r^{-1}t) \\ 0 & 1 \end{array} \right] \left[ \begin{array}{lcr} i & 0 \\ 0 & 1 \end{array} \right] = [ i 0 − ( r − 1 t ) 1 ] [ i 0 0 1 ]
由此,我们可以看到,得到的结果是一个新的刚体变换,其中位移为 − ( r − 1 t ) -(r^{-1}t) − ( r − 1 t ) ,而旋转为 r − 1 r^{-1} r − 1 。