【图形学】四元数(二)

4、四元数的推导

  对于轴 u ⃗ \vec{u} u 旋转,我们从 v ⃗ \vec{v} v 旋转到 v ′ ⃗ \vec{v'} v ,将 v ⃗ \vec{v} v 分解为平行于旋转轴 u \textbf{u} u 以及正交 u \textbf{u} u 的两个分量,即:
v = v ∣ ∣ + v ⊥ v = v_{||} + v_\perp v=v+v
  旋转后的分量:
v ′ = v ∣ ∣ ′ + v ⊥ ′ v' = v'_{||} + v'_\perp v=v+v
在这里插入图片描述

  如图所示,我们可以看到 v ∣ ∣ ′ v'_{||} v 其实就是 v ⃗ \vec{v} v u ⃗ \vec{u} u 上的正交投影(Orthogonal Projection)。我们易得:
v ∥ = proj ⁡ u ( v ) = u ⋅ v u ⋅ u u = u ⋅ v ∥ u ∥ 2 u ( ∥ u ∥ 2 = u ⋅ u ) = ( u ⋅ v ) u . ( ∥ u ∥ = 1 ) \begin{array}{rlr} \mathbf{v}_{\|} & =\operatorname{proj}_{\mathbf{u}}(\mathbf{v}) & \\ & =\frac{\mathbf{u} \cdot \mathbf{v}}{\mathbf{u} \cdot \mathbf{u}} \mathbf{u} & \\ & =\frac{\mathbf{u} \cdot \mathbf{v}}{\|\mathbf{u}\|^{2}} \mathbf{u} & \left(\|\mathbf{u}\|^{2}=\mathbf{u} \cdot \mathbf{u}\right) \\ & =(\mathbf{u} \cdot \mathbf{v}) \mathbf{u} . & (\|\mathbf{u}\|=1) \end{array} v=proju(v)=uuuvu=u2uvu=(uv)u.(u2=uu)(u=1)
  又因为 v = v ∣ ∣ + v ⊥ \mathbf{v}=\mathbf{v}_{||}+\mathbf{v}_{\perp} v=v+v,我们可以得到:
v ⊥ = v − v ∣ ∣ = v − ( u ⋅ v ) u ) \mathbf{v}_\perp=\mathbf{v}-\mathbf{v}_{||}\\ =\mathbf{v}-(\mathbf{u} \cdot \mathbf{v})\mathbf{u}) v=vv=v(uv)u)
  至此,我们知道了 v ∣ ∣ \mathbf{v}_{||} v v ⊥ \mathbf{v}_\perp v 的表达式了。我们对此进行旋转:
   v ∣ ∣ \mathbf{v}_{||} v 不旋转,而 v ⊥ \mathbf{v}_\perp v 我们从俯视图看,通过 u \mathbf{u} u v ⊥ \mathbf{v}_\perp v 能够计算得到一个辅助计算的向量 w \mathbf{w} w。将 v ′ ⊥ \mathbf{v'}_\perp v 投影到 w \mathbf{w} w v ⊥ \mathbf{v}_\perp v上,易得:
v ⊥ ′ = v v ′ + v w ′ = cos ⁡ ( θ ) v ⊥ + sin ⁡ ( θ ) w = cos ⁡ ( θ ) v ⊥ + sin ⁡ ( θ ) ( u × v ⊥ ) \begin{aligned} \mathbf{v}_{\perp}^{\prime} &=\mathbf{v}_{v}^{\prime}+\mathbf{v}_{w}^{\prime} \\ &=\cos (\theta) \mathbf{v}_{\perp}+\sin (\theta) \mathbf{w} \\ &=\cos (\theta) \mathbf{v}_{\perp}+\sin (\theta)\left(\mathbf{u} \times \mathbf{v}_{\perp}\right) \end{aligned} v=vv+vw=cos(θ)v+sin(θ)w=cos(θ)v+sin(θ)(u×v)
在这里插入图片描述

  又有在这里插入图片描述

  将上面的两个结果组合就可以获得:
v ′ = v ∥ ′ + v ⊥ ′ = v ∥ + cos ⁡ ( θ ) v ⊥ + sin ⁡ ( θ ) ( u × v ⊥ ) . = ( u ⋅ v ) u + cos ⁡ ( θ ) ( v − ( u ⋅ v ) u ) + sin ⁡ ( θ ) ( u × v ) = cos ⁡ ( θ ) v + ( 1 − cos ⁡ ( θ ) ) ( u ⋅ v ) u + sin ⁡ ( θ ) ( u × v ) . \begin{aligned} \mathbf{v}^{\prime} &=\mathbf{v}_{\|}^{\prime}+\mathbf{v}_{\perp}^{\prime} \\ &=\mathbf{v}_{\|}+\cos (\theta) \mathbf{v}_{\perp}+\sin (\theta)\left(\mathbf{u} \times \mathbf{v}_{\perp}\right) . \\ &=(\mathbf{u} \cdot \mathbf{v}) \mathbf{u}+\cos (\theta)(\mathbf{v}-(\mathbf{u} \cdot \mathbf{v}) \mathbf{u})+\sin (\theta)(\mathbf{u} \times \mathbf{v}) \\ &=\cos (\theta) \mathbf{v}+(1-\cos (\theta))(\mathbf{u} \cdot \mathbf{v}) \mathbf{u}+\sin (\theta)(\mathbf{u} \times \mathbf{v}) . \end{aligned} v=v+v=v+cos(θ)v+sin(θ)(u×v).=(uv)u+cos(θ)(v(uv)u)+sin(θ)(u×v)=cos(θ)v+(1cos(θ))(uv)u+sin(θ)(u×v).
  这样,我们就得到了一般形式的旋转公式:
在这里插入图片描述

5、四元数

  四元数: q = a + b i + c j + d k , ( a , b , c , d ∈ R ) q=a+bi+cj+dk, (a,b,c,d\in\mathbb{R}) q=a+bi+cj+dk,(a,b,c,dR) ,其中 i 2 = j 2 = k 2 = i j k = − 1 i^2=j^2=k^2=ijk=-1 i2=j2=k2=ijk=1 。我们通常把四元数的 实部 和 虚部 分开,并用一个三维向量来表示虚部,记作:
q = [ s , v ] . ( v = [ x y z ] , s , x , y , z ∈ R ) q=[s,\mathbf{v}]. (\mathbf{v}=\begin{bmatrix}x \\y \\z \end{bmatrix}, s,x,y,z \in \mathbb{R}) q=[s,v].(v=xyz,s,x,y,zR)

①模长:

∣ ∣ q ∣ ∣ = a 2 + b 2 + c 2 + d 2 ||q||=\sqrt{a^2+b^2+c^2+d^2} q=a2+b2+c2+d2
用标量和向量的方式表示的话,则为:
∣ ∣ q ∣ ∣ = s 2 + ∣ ∣ v ∣ ∣ 2 = s 2 + v ⋅ v ||q||=\sqrt{s^2+||\mathbf{v}||^2}\\ =\sqrt{s^2+v \cdot v} q=s2+v2 =s2+vv
  显然,四元数的模长很难用几何的方法来进行理解,因为它代表的是一个四维的长度。但是,和高维向量的模长一样,这只是类比复数模长进行衍生定义的结果,你只需要将它理解为一个定义就可以了。

②四元数基本运算

  其实就和普通的向量加法、减法、标量乘法一样了,没有区别。

③BraBmann积

在这里插入图片描述

④共轭和逆

  我们规定: q q − 1 = q − 1 q = 1 ( q ≠ 1 ) qq^{-1}=q^{-1}q=1 (q\ne 1) qq1=q1q=1(q=1),其中 q − 1 q^{-1} q1 q q q 的逆。
  显然,要在无数的四元数中寻找一个满足 q q q的逆 是非常困难的,但是实际上我们可以使用四元数共轭的一些性质来获得 q − 1 q^{-1} q1
  我们定义,一个四元数 q = a + b i + c i + d k q=a+bi+ci+dk q=a+bi+ci+dk共轭 q ∗ = a − b i − c j − d k q^*=a-bi-cj-dk q=abicjdk
。如果用标量向量有序对的形式来定义的话, q = [ s , v ] q=[s,\mathbf{v}] q=[s,v]的共轭为 g ∗ = [ s , − v ] g^*=[s,-\mathbf{v}] g=[sv]

  共轭四元数的一个非常有用的性质就是:
q q ∗ = [ s , v ] ⋅ [ s , − v ] = [ s 2 − v ⋅ ( − v ) , s ( − v ) + s v + v × ( − v ) ] = [ s 2 + v ⋅ v , 0 ] ( v 平 行 于 − v , 所 以 v × ( − v ) = 0 ) = s 2 + x 2 + y 2 + z 2 = ∣ ∣ q ∣ ∣ 2 qq^*=[s, \mathbf{v} ]\cdot [s, -\mathbf{v}]\\ =[s^2-\mathbf{v} \cdot (-\mathbf{v}), s(-\mathbf{v})+s\mathbf{v}+\mathbf{v} \times (-\mathbf{v})]\\ =[s^2+\mathbf{v} \cdot \mathbf{v},0]\\ (\mathbf{v}平行于-\mathbf{v},所以\mathbf{v}\times (-\mathbf{v})=0)\\ =s^2+x^2+y^2+z^2\\ =||q||^2 qq=[s,v][s,v]=[s2v(v),s(v)+sv+v×(v)]=[s2+vv,0](vvv×(v)=0)=s2+x2+y2+z2=q2
  根据四元数逆的定义,有:
q q − 1 = 1 q ∗ q q − 1 = q ∗ ( q ∗ q ) q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 ⋅ q − 1 = q ∗ q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 qq^-1=1 \\ q^*qq^-1=q^* \\ \left( q^*q \right) q^-1=q^* \\ ||q||^2\cdot q^-1=q^* \\ q^-1=\frac{q^*}{||q||^2} qq1=1qqq1=q(qq)q1=qq2q1=qq1=q2q
  最终,如果, ∣ ∣ q ∣ ∣ = 1 ||q||=1 q=1 ,那么 q 就是一个单位四元数(Unit Quaternion),那么:
q − 1 = q ∗ 1 2 = q ∗ q^-1=\frac{q^*}{1^2}=q^* q1=12q=q

⑤纯四元数

  如果一个四元数能写成这样的形式: $ v= [0, \mathbf{v}]$,那么我们称之为一个纯四元数(Pure Quaternion),也就是说,它的实部为 0 。对于两个纯四元数 v = [ 0 , v ] , u = [ 0 , u ] v=[0,\mathbf{v}], u=[0,\mathbf{u}] v=[0,v],u=[0,u],则有:
v u = [ 0 − v ⋅ u , 0 + v ×    u ] = [ − v ⋅    u , v ×    u ] vu=\left[ 0-\mathbf{v}\cdot \mathbf{u},0+\mathbf{v}\times \,\,\mathbf{u} \right] \\ =\left[ -\mathbf{v}\cdot \,\,\mathbf{u},\mathbf{v}\times \,\,\mathbf{u} \right] vu=[0vu,0+v×u]=[vu,v×u]

⑥3D旋转公式(四元数型,正交情况)

  我们用 向量 v \mathbf{v} v 沿着一个用单位向量定义的旋转轴 u \mathbf{u} u 旋转 θ \theta θ 度,成为 v ′ \mathbf{v}' v ,我们依然按照平行和垂直的方向拆解这个向量。我们将这些向量定义为纯四元数:
v = [ 0 , v ]    v ′ = [ 0 , v ′ ] v ⊥ = [ 0 , v ⊥ ]    v ⊥ ′ = [ 0 , v ⊥ ′ ] v ∣ ∣ = [ 0 , v ∣ ∣ ]    v ∣ ∣ ′ = [ 0 , v ∣ ∣ ′ ]    u = [ 0 , u ] v=\left[ 0,\mathbf{v} \right] \,\, v'=\left[ 0,\mathbf{v}' \right] \\ v_{\bot}=\left[ 0,\mathbf{v}_{\bot} \right] \,\, v'_{\bot}=\left[ 0,\mathbf{v}'_{\bot} \right] \\ v_{||}=\left[ 0,\mathbf{v}_{||} \right] \,\, v'_{||}=\left[ 0,\mathbf{v}'_{||} \right] \,\, \\ u=\left[ 0,\mathbf{u} \right] v=[0,v]v=[0,v]v=[0,v]v=[0,v]v=[0,v]v=[0,v]u=[0,u]

  能得到:
在这里插入图片描述

  通过这两个分量,我们可以获得一般情况下 v ′ v' v 的结果:
v ′ = v ∣ ∣ ′ + v ⊥ ′ = v ∣ ∣ + q v ⊥ ( 其 中 q = c o s ( θ , s i n ( θ ) u ) v'=v'_{||}+v'_\perp\\ =v_{||}+qv_\perp\\ (其中q=cos(\theta, sin(\theta)\mathbf{u}) v=v+v=v+qvq=cos(θ,sin(θ)u)
在这里插入图片描述

5、3D旋转的矩阵形式

  在实际的应用中,我们可能会需要将旋转与平移和缩放进行复合,所以需要用到四元数的旋转的矩阵形式。比如,我们熟悉的结论:

左乘一个四元数 q = a + b i + c j + d k q =a+bi+cj+dk q=a+bi+cj+dk 等同于下面这个矩阵:
[ a − b − c − d b a − d c c d a − b d − c b a ] \left[ \begin{matrix} a& -b& -c& -d\\ b& a& -d& c\\ c& d& a& -b\\ d& -c& b& a\\ \end{matrix} \right] abcdbadccdabdcba
右乘 q q q ,等同于这个矩阵:
[ a − b − c − d b a d − c c − d a b d c − b a ] \left[ \begin{matrix} a& -b& -c& -d\\ b& a& d& -c\\ c& -d& a& b\\ d& c& -b& a\\ \end{matrix} \right] abcdbadccdabdcba
  那么我们的结论可以写成:
q v q ∗ = L ( q ) R ( q − 1 ) v = L ( q ) R ( q ∗ ) v = [ a − b − c − d b a − d c c d a − b d − c b a ] [ a b c d − b a − d c − c d a − b − d − c b a ] qvq^*=L(q)R(q^{-1})v \\ =L(q)R(q^*)v \\ =\left[ \begin{matrix} a& -b& -c& -d\\ b& a& -d& c\\ c& d& a& -b\\ d& -c& b& a\\ \end{matrix} \right] \left[ \begin{matrix} a& b& c& d\\ -b& a& -d& c\\ -c& d& a& -b\\ -d& -c& b& a\\ \end{matrix} \right] qvq=L(q)R(q1)v=L(q)R(q)v=abcdbadccdabdcbaabcdbadccdabdcba
  又因为: a 2 + b w + c 2 + d 2 = 1 a^2+b^w+c^2+d^2=1 a2+bw+c2+d2=1,这个式子能化简为:
q v q ∗ = [ 1 0 0 0 0 1 − 2 c 2 − 2 d 2 2 b s − 2 a d 2 a c + 2 b d 0 2 b c − 2 a d 1 − 2 b 2 − 2 d 2 2 c d − 2 a b 0 2 b d − 2 a c 2 a b + 2 c d 1 − 2 b 2 − 2 c 2 ] qvq^*=\left[ \begin{matrix} 1& 0& 0& 0\\ 0& 1-2c^2-2d^2& 2bs-2ad& 2ac+2bd\\ 0& 2bc-2ad& 1-2b^2-2d^2& 2cd-2ab\\ 0& 2bd-2ac& 2ab+2cd& 1-2b^2-2c^2\\ \end{matrix} \right] qvq=1000012c22d22bc2ad2bd2ac02bs2ad12b22d22ab+2cd02ac+2bd2cd2ab12b22c2
  所以,我们有结论:
在这里插入图片描述

(对于目前的状态,四元数学习到这里已经十分够用了暂时不拓展了

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值