# 4.3 四元数

## 4.3.1 数学背景

q^qvi2=(qv,qw)=iqx+jqy+kqz+qw=qv+qw,=iqx+jqy+kqz=(qx,qy,qz),=j2=k2=1,jk=kj=i,ki=ik=j,ij=ji=k.(4.28)$$$\begin{split} \hat{q}&=(q_v, q_w)=iq_x+jq_y+kq_z+q_w=q_v+q_w, \\ q_v &=iq_x+jq_y+kq_z=(q_x,q_y,q_z), \\ i^2&=j^2=k^2=-1,jk=-kj=i, ki=-ik=j,ij=-ji=k.\\ \end{split}$$\tag{4.28}$

(译注：如何记住i,j,k$i,j,k$之间的关系，从右往左看向量两个虚部之间的乘积为另一个虚部，如果相邻两个虚部乘积顺序相反，那么结果也取反)

q^r^=(iqx+jqy+kqz+qw)(irx+jry+krz+rw)=i(qyrzqzry+rwqx+qwrx)    +j(qzrxqxrz+rwqy+qwrz)    +k(qxryqyrx+rwqz+qwrz)    +qwrwqxrxqyryqzrz=(qv×rv+rwqv+qwrv,  qwrwqvrv)(4.29)$$$\begin{split} \hat{q}\hat{r}&=(iq_x+jq_y+kq_z+q_w)(ir_x+jr_y+kr_z+r_w) \\ &=i(q_yr_z-q_zr_y+r_wq_x+q_wr_x)\\ &\ \ \ \ +j(q_zr_x-q_xr_z+r_wq_y+q_wr_z)\\ &\ \ \ \ +k(q_xr_y-q_yr_x+r_wq_z+q_wr_z)\\ &\ \ \ \ +q_wr_w-q_xr_x-q_yr_y-q_zr_z\\ &=(q_v\times r_v+r_wq_v+q_wr_v,\ \ q_wr_w-q_v\cdot r_v)\\ \end{split}$$\tag{4.29}$

n(q^)=q^q^=q^q^=qvqv+q2w=q2x+q2y+q2z+q2w(4.30)$$$\begin{split} n(\hat{q})&=\sqrt{\hat{q}\hat{q}^\ast}=\sqrt{\hat{q}^\ast\hat{q}}=\sqrt{q_v\cdot q_v+q_w^2}\\ &=\sqrt{q_x^2+q_y^2+q_z^2+q_w^2}\\ \end{split}$$\tag{4.30}$

n(q^2)=q^q^q^q^n(q^)(4.31)$$$\begin{split} n(\hat{q}^2)=\hat{q}\hat{q}^\ast\\ \frac{\hat{q}\hat{q}^\ast}{n(\hat{q})}\\ \end{split}$$\tag{4.31}$

q^1=1n(q^)2q^(4.32)$\hat{q}^{-1}=\displaystyle\frac{1}{n(\hat{q})^2}\hat{q}^*\tag{4.32}$

(q^)(q^+r^)=q^=q^+r^(4.33)$$$\begin{split} (\hat{q}*)*&=\hat{q}\\ (\hat{q}+\hat{r})*&=\hat{q}^*+\hat{r}^*\\ \end{split}$$\tag{4.33}$

n(q^)n(q^r^)=n(q^)=n(q^)n(r^)(4.34)$$$\begin{split} n(\hat{q}^*)&=n(\hat{q})\\ n(\hat{q}\hat{r})&=n(\hat{q})n(\hat{r})\\ \end{split}$$\tag{4.34}$

p^(sq^+tr^)(sp^+tq^)r^=sp^q^+tp^r^=sp^r^+tq^r^(4.35)$$$\begin{split} \hat{p}(s\hat{q}+t\hat{r})&=s\hat{p}\hat{q}+t\hat{p}\hat{r}\\ (s\hat{p}+t\hat{q})\hat{r}&=s\hat{p}\hat{r}+t\hat{q}\hat{r}\\ \end{split}$$\tag{4.35}$

q^=(sinϕuq,cosϕ)=sinϕuq+cosϕ(4.36)$\hat{q}=(sin\phi u_q,cos\phi)=sin\phi u_q+cos\phi \tag{4.36}$

n(q^)=n(sinϕuq,cosϕ)=sin2ϕ(uquq)+cos2ϕ=sin2ϕ+cos2ϕ=1(4.37)$$$\begin{split} n(\hat{q})&=n(sin\phi u_q,cos\phi)=\sqrt{sin^2\phi(u_q\cdot u_q)+cos^2\phi}\\ &=\sqrt{sin^2\phi+cos^2\phi}=1\\ \end{split}$$\tag{4.37}$

q^=sinϕuq+cosϕ=eϕuq(4.38)$\hat{q}=sin\phi u_q+cos\phi=e^{\phi u_q} \tag{4.38}$

q^t=(sinϕuq+cosϕ)t=eϕtuq=sin(ϕt)uq+cos(ϕt)(4.39)$\hat{q}^t=(sin\phi u_q+cos\phi)^t=e^{\phi tu_q}=sin(\phi t)u_q+cos(\phi t)\tag{4.39}$

## 4.3.2 四元数变换

q^p^q^1(4.40)$\hat{q}\hat{p}\hat{q}^{-1}\tag{4.40}$

r^(q^p^q^)r^=(r^q^)p^(r^q^)=c^p^c^(4.41)$\hat{r}(\hat{q}\hat{p}\hat{q}^*)\hat{r}^*=(\hat{r}\hat{q})\hat{p}(\hat{r}\hat{q})^*=\hat{c}\hat{p}\hat{c}^*\tag{4.41}$

Mq=1s(q2y+q2z)s(qxqy+qwqz)s(qxqzqwqy)0s(qxqyqwqz)1s(q2x+q2z)s(qyqz+qwqx)0s(qxqz+qwqy)s(qyqzqwqx)1s(q2x+q2y)00001(4.42)$M^q=\begin{pmatrix}1-s(q_y^2+q_z^2) && s(q_xq_y-q_wq_z) && s(q_xq_z+q_wq_y) && 0 \\ s(q_xq_y+q_wq_z) && 1-s(q_x^2+q_z^2) && s(q_yq_z-q_wq_x) && 0 \\ s(q_xq_z-q_wq_y) && s(q_yq_z+q_wq_x) && 1-s(q_x^2+q_y^2) && 0 \\ 0 && 0 && 0 && 1 \end{pmatrix} \tag{4.42}$

Mq=12(q2y+q2z)2(qxqy+qwqz)2(qxqzqwqy)02(qxqyqwqz)12(q2x+q2z)2(qyqz+qwqx)02(qxqz+qwqy)2(qyqzqwqx)12(q2x+q2y)00001(4.43)$M^q=\begin{pmatrix}1-2(q_y^2+q_z^2) && 2(q_xq_y-q_wq_z) && 2(q_xq_z+q_wq_y) && 0 \\ 2(q_xq_y+q_wq_z) && 1-2(q_x^2+q_z^2) && 2(q_yq_z-q_wq_x) && 0 \\ 2(q_xq_z-q_wq_y) && 2(q_yq_z+q_wq_x) && 1-2(q_x^2+q_y^2) && 0 \\ 0 && 0 && 0 && 1 \end{pmatrix} \tag{4.43}$

mq21mq12=4qwqx,mq02mq20=4qwqy,mq10mq01=4qwqz,(4.44)$$$\begin{split} m_{21}^q-m_{12}^q=4q_wq_x,\\ m_{02}^q-m_{20}^q=4q_wq_y,\\ m_{10}^q-m_{01}^q=4q_wq_z,\\ \end{split}$$\tag{4.44}$

tr(Mq)=42s(q2x+q2y+q2z)=4(1q2x+q2y+q2zq2x+q2y+q2z+q2w)=4q2wq2x+q2y+q2z+q2w=4q2wn(q^)(4.45)$$$\begin{split} tr(M^q)&=4-2s(q_x^2+q_y^2+q_z^2)=4(1-\displaystyle\frac{q_x^2+q_y^2+q_z^2}{q_x^2+q_y^2+q_z^2+q_w^2})\\ &=\displaystyle\frac{4q_w^2}{q_x^2+q_y^2+q_z^2+q_w^2}=\displaystyle\frac{4q_w^2}{n(\hat{q})}\\ \end{split}$$\tag{4.45}$

qw=12tr(Mq)qx=mq21mq124qwqy=mq02mq204qwqx=mq10mq014qw.(4.46)$$$\begin{split} q_w=\frac{1}{2}\sqrt{tr(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_x=\frac{m_{10}^q-m_{01}^q}{4q_w}.\\ \end{split}$$\tag{4.46}$

m00m11m22u=t+2q2x=t+2q2y=t+2q2z=m00+m11+m22=t+2q2w(4.47)$$$\begin{split} m_{00}&=t+2q_x^2，\\ m_{11}&=t+2q_y^2，\\ m_{22}&=t+2q_z^2，\\ u&=m_{00}+m_{11}+m_{22}=t+2q_w^2， \end{split}$$\tag{4.47}$

4q2x4q2y4q2z4q2w=+m00m11m22+m33=m00+m11m22+m33=m00m11+m22+m33=tr(Mq)(4.48)$$$\begin{split} 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}，\\ 4q_w^2&=tr(M^q)，\\ \end{split}$$\tag{4.48}$

s^(q^,r^,t)=(r^q^1)tq^(4.49)$\hat{s}(\hat{q},\hat{r},t)=(\hat{r}\hat{q}^{-1})^t\hat{q}\tag{4.49}$

s^(q^,r^,t)=slerp(q^,r^,t)=sin(ϕ(1t))sinϕq^+sin(ϕt)sinϕr^(4.50)$\hat{s}(\hat{q},\hat{r},t)=slerp(\hat{q},\hat{r},t)=\displaystyle\frac{sin(\phi(1-t))}{sin\phi}\hat{q}+\frac{sin(\phi t)}{sin\phi}\hat{r}\tag{4.50}$

a^i=q^iexp[log(q^1ia^i1)+log(q^1ia^i+1)4](4.51)$\hat{a}_i=\hat{q}_i exp[-\displaystyle\frac{\log(\hat{q}_i^{-1}\hat{a}_{i-1})+\log(\hat{q}_i^{-1}\hat{a}_{i+1})}{4}]\tag{4.51}$

squad(q^i,q^i+1,a^i,a^i+1,t)=slerp(slerp(q^i,q^i+1,t),slerp(a^i,a^i+1,t),2t(1t))(4.52)$squad(\hat{q}_i,\hat{q}_{i+1},\hat{a}_i,\hat{a}_{i+1},t)=slerp(slerp(\hat{q}_i,\hat{q}_{i+1},t),slerp(\hat{a}_i,\hat{a}_{i+1},t),2t(1-t))\tag{4.52}$

q^=(qv,qw)=(12(1+e),2(1+e)2)(4.53)$\hat{q}=(q_v,q_w)=\left(\displaystyle\frac{1}{\sqrt{2(1+e)}},\displaystyle\frac{\sqrt{2(1+e)}}{2}\right)\tag{4.53}$

R(s,t)=e+hv2xhvxvy+vzhvxvzvy0hvxvyvze+hv2yhvyvz+vx0hvxvz+vyhvyvzvxe+hv2z00001(4.54)$R(s,t)=\begin{pmatrix}e+hv_x^2 && hv_xv_y-v_z && hv_xv_z+v_y && 0 \\ hv_xv_y+v_z && e+hv_y^2 && hv_yv_z-v_x && 0 \\ hv_xv_z-v_y && hv_yv_z+v_x && e+hv_z^2 && 0 \\ 0 && 0 && 0 && 1 \end{pmatrix} \tag{4.54}$

veh=s×t=cos(2ϕ)=st=1cos(2ϕ)sin(2ϕ)2=1evv=11+e(4.55)$$$\begin{split} v&=s\times t，\\ e&=cos(2\phi)=s\cdot t，\\ h&=\frac{1-cos(2\phi)}{sin(2\phi)^2}=\frac{1-e}{v\cdot v}=\frac{1}{1+e}，\\ \end{split}$$\tag{4.55}$

# 4.4 顶点混合

4.56给出了顶点融合的数学公式，p是原始顶点，u(t)$u(t)$是顶点的变换矩阵，随着时间t的变换而变化。有n条骨骼会影响到p在世界坐标系中的位置。变换矩阵Mi$M_i$将骨骼从自身坐标系转换到世界坐标系。一般来说，骨骼关节的控制点都位于他自身坐标系的原点。[2016/09/25]例如，将前臂和手肘的连接点设置为原点，旋转动画会使前臂绕着这个连接点旋转。矩阵Bi(t)$B_i(t)$为第i根骨骼的自身到世界坐标系的变换矩阵，随着时间的变化用以模拟对象运动，一般来说是多个矩阵的组合，例如是上一层次骨骼变换和当前骨骼变换矩阵的组合。Woodland描述了一种维持和更新Bi(t)$B_i(t)$的方法。最后，wi$w_i$是骨骼i对顶点p影响的权重。顶点混合方式如下：

u(t)=n1i=0wiBi(t)M1ip, wheren1i=0wi=1, wi0 (4.56)$u(t)=\sum_{i=0}^{n-1}w_iB_i(t)M_i^{-1}p,\ where \sum_{i=0}^{n-1}w_i=1,\ w_i\ge 0 \ \tag{4.56}$

• 本文已收录于以下专栏：

## Real-Time Rendering 翻译 4.变换【上】

• su47yuwenshu
• 2016年07月10日 00:20
• 541

## Real-Time Rendering 翻译 1.引言

Test MarkDown
• su47yuwenshu
• 2016年05月17日 11:41
• 867

## 【《Real-Time Rendering 3rd》 提炼总结】(四) 第五章 · 图形渲染与视觉外观 The Visual Appearance

• zhmxy555
• 2017年06月04日 11:05
• 52264

## Real-Time Rendering 翻译 3.图形处理单元

• su47yuwenshu
• 2016年06月17日 01:10
• 1025

## RealTimeRendering第三版的翻译

http://www.cnblogs.com/alonecat06/category/417541.html 特别是第三章最近看一下
• sae_kurosawa
• 2017年01月05日 10:57
• 198

## 【Real-Time Rendering 3rd】开坑的序章

0x00 作为前序的废话 想要系统学习任何一门知识，我个人习惯是首先会上手一本导论性质的书，力求先形成一个方面的了解，然后再深入。在CG和实时渲染相关领域，有这样一位能领你进门的师傅 ——《Real...
• sinat_35191326
• 2017年08月13日 19:59
• 312

## 【《Real-Time Rendering 3rd》 提炼总结】(一) 全书知识点总览

• zhmxy555
• 2017年04月09日 17:36
• 33966

## Real-Time 3D Rendering with DirectX and HLSL

• chenjinxian_3D
• 2016年06月26日 07:47
• 2146

## Real-Time Rendering 笔记

• wolf96
• 2015年09月21日 13:24
• 1961

## 学习《Real Time Rendering》后自己实现的代码

• jiangcaiyang123
• 2012年01月08日 09:54
• 1928

举报原因： 您举报文章：Real-Time Rendering 翻译 4.变换【下】 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)