From 5fa619a73a5f4bf42dbe290d6e434bdc607d97b9 Mon Sep 17 00:00:00 2001 From: thejinchao Date: Tue, 8 Apr 2025 00:37:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/note/graphics/math/transform_01.md | 185 ++++++++++++ docs/note/graphics/math/vector_trip.svg | 372 +++++++++++++++--------- 2 files changed, 412 insertions(+), 145 deletions(-) diff --git a/docs/note/graphics/math/transform_01.md b/docs/note/graphics/math/transform_01.md index 039db5e..91342f2 100644 --- a/docs/note/graphics/math/transform_01.md +++ b/docs/note/graphics/math/transform_01.md @@ -178,3 +178,188 @@ c+(1-c)x^2& (1-c)xy-sz&(1-c)xz+sy\\ (1-c)xz-sy&(1-c)yz+sx&c+(1-c)z^2 \end{bmatrix} $$ + +### 3.4 四元数 + +#### 3.4.1 复数 +复数([Complex Number](https://simple.wikipedia.org/wiki/Complex_number))可以表达为 +$$\begin{aligned} +z=a+bi\\ +a,b\in\mathbb{R}, i^2=-1 +\end{aligned}$$ +其中$a$被成为实部(Real Part), $b$被称为虚部(Imaginary Part), 复数的基本运算规律如下,设$z_1=a_1+b_1i, z_2=a_2+b_2i$,那么 +$$ +\begin{aligned} +z_1+z_2&=(a_1+a_2)+(b_1+b_2)i\\ +z_1-z_2&=(a_1-a_2)+(b_1-b_2)i\\ +z_1z_2&=(a_1a_2-b_1b_2)+(a_1b_2+a_2b_1)i +\end{aligned} +$$ + +#### 3.4.2 四元数定义 +四元数([Quaternion](https://en.wikipedia.org/wiki/Quaternion))可以视为对复数的扩充。 四元数有1个实部,3个虚部,形式如下 +$$ +q=s+xi+yj+zk +$$ +其中$s,x,y,z\in\mathbb{R}$,$i,j,k$满足如下计算性质 +$$ +\begin{aligned} +i^2&=j^2=k^2=ijk=-1\\ +ij&=k\quad ji=-k\\ +jk&=i\quad kj=-i\\ +ki&=j\quad ik=-j\\ +\end{aligned} +$$ +汇总到如下表格中 +| | $i$ | $j$ | $k$ | +| :--- | :--- | :--- | :--- | +| $i$ | $-1$ | $k$ | $-j$ | +| $j$ | $-k$ | $-1$ | $i$ | +| $k$ | $j$ | $-i$ | $-1$ | + +四元数也可以表达成将实数部和虚数部分开的形式,对于四元数$q=s+xi+yj+zk$,设$\vec{v}=[x,y,z]^T$,则这个四元数可以表达为 +$$ +q=[s,\vec{v}] +$$ + +#### 3.4.3 四元数的基本运算 +对于两个四元数$q_1=[s_1,\vec{v_1}], q_2=[s_2,\vec{v_2}]$,基本运算规律如下 +$$ +\begin{aligned} +q_1+q_2&=[s_1+s_2,\quad \vec{v_1}+\vec{v_2}]\\ +q_1-q_2&=[s_1-s_2,\quad \vec{v_1}-\vec{v_2}]\\ +q_1q_2&=[s_1s_2-\vec{v_1}\cdot\vec{v_2},\quad s_1\vec{v_2}+s_2\vec{v_1}+\vec{v_1}\times\vec{v_2}] +\end{aligned} +$$ +四元数的乘法满足满足结合律,但不满足交换律 +$$ +\begin{aligned} +(q_1q_2)q_3&=q_1(q_2q_3)\\ +q_1q_2&\neq q_2q_1 +\end{aligned} +$$ +但如果$q_1,q_2$中的两个向量部分平行,由于$\vec{v_1}\times\vec{v_2}=0$,易证 +$$ +q_1q_2=q_2q_1\quad(when\quad \vec{v_1}\parallel\vec{v_2}) +\tag{3.4.3.1} +$$ +定义四元数$q=s+xi+yj+zk$的模为 +$$ +\|q\|=\sqrt{s^2+x^2+y^2+z^2} +$$ +如果一个四元数的模为1,那么称这个四元数为单位四元数 + +#### 3.4.4 四元数的共轭和逆 +定义四元数$q=[s, \vec{v}]$的共轭四元数$\overline{q}$为 +$$ +\overline{q}=[s, -\vec{v}] +$$ +共轭四元数满足如下运算 +$$ +q\overline{q}=\overline{q}q=\|q\|^2\tag{3.4.4.1} +$$ +对于单位四元数,有$q\overline{q}=1$ +定义四元数$q$的逆为$q^{-1}$,满足$qq^{-1}=1$,由公式3.4.4.1可知 +$$ +qq^{-1}=1=\frac{q\overline{q}}{\|q\|} +$$ +所以 +$$ +q^{-1}=\frac{\overline{q}}{\|q\|^2}\tag{3.4.4.2} +$$ +四元数的逆满足如下运算 +$$ +(q_1q_2)^{-1}=q_2^{-1}q_1^{-1} +$$ +#### 3.4.5 四元数与向量 +如果一个四元数的实部为0,那么称之为纯四元数(Pure Quaternion),由于纯四元数仅有3个虚部,可以将一个3D向量转换为一个纯四元数。设$q_v=[0,\vec{v}]$,那么 +$$\begin{aligned} +\lambda q_v&=[0, \lambda\vec{v}]\\ +q_{u}\pm q_{v}&=[0, \vec{u}\pm\vec{v}] +\end{aligned}$$ +由此可见,向量的线性运算,都可以使用与之对应的纯四元数来代替。但乘法则不同,设两个纯四元数$q_u=[0, \vec{u}], q_v=[0, \vec{v}]$,相乘后结果为 +$$ +q_uq_v=[-\vec{u}\cdot\vec{v}, \vec{u}\times\vec{v}]\tag{3.4.5.1} +$$ +对于向量$\vec{v}$,记四元数$q(\theta, \vec{v})=[\cos\theta, \vec{v}\sin\theta]$,这种四元数有一些很有用的特性,首先如果$\vec{v}$是单位向量,那么$q(\theta, \vec{v})$是单位四元数,易证: +$$ +\|q(\theta, \vec{v})\|=\sqrt{\cos^2\theta+\sin^2\theta(v_x^2+v_y^2+v_z^2)}=1 +$$ +另外 +$$\begin{aligned} +q(\alpha, \vec{v})q(\theta, \vec{v})&=[\cos\alpha,\quad\vec{v}\sin\alpha][\cos\theta,\quad\vec{v}\sin\theta]\\ +&=[\cos\alpha\cos\theta-\sin\alpha\sin\theta,\quad\vec{v}(\cos\alpha\sin\theta+\cos\theta\sin\alpha)]\\ +&=[\cos(\alpha+\theta),\quad\vec{v}\sin(\alpha+\theta)]\\ +&=q(\alpha+\theta, \vec{v})\\ +q(\theta, \vec{v})^2&=q(2\theta, \vec{v}) +\end{aligned}\tag{3.4.5.2}$$ + +#### 3.4.6 使用四元数表达旋转 +观察上面推导罗德里格旋转公式过程中的公式3.3.2.5,其中 +$$\begin{aligned} +\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v}}&=\vec{\boldsymbol{n}}\times(\boldsymbol{v_1}+\boldsymbol{v_2})\\ +&=\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v_1}}+\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v_2}}\\ +&=\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v_2}} +\end{aligned}$$ +带入公式3.3.2.5,可以得到 +$$ +R_n(\vec{\boldsymbol{v}}_2)=\vec{\boldsymbol{v}}_2\cos(\theta)+(\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v_2}})\sin(\theta)\tag{3.4.6.1} +$$ +设两个纯四元数$q_n, q_v$ +$$\begin{aligned} +q_n&=[0, \vec{n}]\\ +q_{v2}&=[0, \vec{v_2}] +\end{aligned}\tag{3.4.6.2} +$$ +根据公式3.4.5.1 +$$\begin{aligned} +q_nq_{v2}&=[-\vec{n}\cdot\vec{v_2},\quad\vec{n}\times\vec{v_2}]\\ +&=[0,\quad\vec{n}\times\vec{v_2}] +\end{aligned}\tag{3.4.6.3}$$ +所以$q_nq_{v2}$是一个纯四元数 +由于3.4.6.1中都是线性计算,将3.4.6.2和3.4.6.3代入其中,可以得到$R_n(\vec{\boldsymbol{v}}_2)$的四元数形式 +$$\begin{aligned} +R_n(\vec{\boldsymbol{v}}_2)&=\vec{\boldsymbol{v}}_2\cos\theta+(\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v_2}})\sin\theta\\ +&= q_v\cos\theta+q_nq_{v2}\sin\theta\\ +&=(\cos\theta+q_n\sin\theta)q_{v2}\\ +&=[\cos\theta, \vec{n}\sin\theta]q_{v2}\\ +&=q(\theta, \vec{n})q_{v2} +\end{aligned}\tag{3.4.6.4}$$ +设一个新的四元数$p$ +$$ +p=q(\frac{\theta}{2}, \vec{n})=[\cos\frac{\theta}{2},\vec{n}\sin\frac{\theta}{2}]\tag{3.4.6.5} +$$ +根据公式3.4.5.2,可以得到 +$$ +pp=q(\theta, \vec{n}) +$$ +且由于$p$是单位四元数,可以知道 +$$ +pp^{-1}=p\overline{p}=1 +$$ +将3.4.6.4带入3.3.2.4中,可以得到罗德里格旋转公式的四元数形式为 +$$\begin{aligned} +R_n(\vec{\boldsymbol{v}})&=\vec{\boldsymbol{v}}_1+R_n(\vec{\boldsymbol{v}}_2)\\ +&=q_{v1}+q(\theta, \vec{n})q_{v2}\\ +&=p\overline{p}q_{v1}+ppq_{v2} +\end{aligned}\tag{3.4.6.6} +$$ +由于$\vec{n}\parallel\vec{v_1}$,根据公式3.4.3.1,可知$\overline{p}q_{v1}=q_{v1}\overline{p}$ +由于$\vec{n}\perp\vec{v_2}$,可以推断出$pq_{v2}=q_{v2}\overline{p}$,证明如下: +$$\begin{aligned} +pq_{v2}&=[\cos\frac{\theta}{2},\vec{n}\sin\frac{\theta}{2}][0, \vec{v_2}]\\ +&=[0,\vec{v_2}\cos\frac{\theta}{2}+(\vec{n}\times\vec{v_2})\sin\frac{\theta}{2}]\\ +q_{v2}\overline{p}&=[0, \vec{v_2}][\cos\frac{\theta}{2},-\vec{n}\sin\frac{\theta}{2}]\\ +&=[0,\vec{v_2}\cos\frac{\theta}{2}-(\vec{v_2}\times\vec{n})\sin\frac{\theta}{2}] +\end{aligned}$$ +带入3.4.6.6,可以得到 +$$\begin{aligned} +R_n(\vec{\boldsymbol{v}})&=pq_{v1}\overline{p}+pq_{v2}\overline{p}\\ +&=p(q_{v1}+q_{v2})\overline{p}\\ +&=pq_v\overline{p} +\end{aligned}\tag{3.4.6.7} +$$ +也就是说,对于向量$\vec{v}$,围绕单位向量$\vec{n}$旋转$\theta$,只需要构造四元数$[\cos\frac{\theta}{2}, \vec{n}\sin\frac{\theta}{2}]$,可以利用下面的等式计算旋转后的向量$\vec{v'}$ +$$ +[0, \vec{v'}]=[\cos\frac{\theta}{2}, \vec{n}\sin\frac{\theta}{2}][0,\vec{v}][\cos\frac{\theta}{2}, -\vec{n}\sin\frac{\theta}{2}] +$$ \ No newline at end of file diff --git a/docs/note/graphics/math/vector_trip.svg b/docs/note/graphics/math/vector_trip.svg index bb295e5..5d9d6a6 100644 --- a/docs/note/graphics/math/vector_trip.svg +++ b/docs/note/graphics/math/vector_trip.svg @@ -24,16 +24,86 @@ inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" inkscape:zoom="2.9682216" - inkscape:cx="133.75012" - inkscape:cy="62.326883" + inkscape:cx="133.58167" + inkscape:cy="62.495334" inkscape:window-width="2560" - inkscape:window-height="1476" - inkscape:window-x="-12" - inkscape:window-y="-12" + inkscape:window-height="1494" + inkscape:window-x="-11" + inkscape:window-y="-11" inkscape:window-maximized="1" inkscape:current-layer="layer1" /> + id="defs1"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + - - - - - - - - - + + + + + + - - - - - - - - - + + + + + + - - - - - - - - - + + + + + + + style="fill:none;stroke:#a7a9ac;stroke-miterlimit:10;stroke-width:1.00031497;stroke-dasharray:none" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + transform="translate(-1.2553831,1.346337)" /> - + transform="translate(-1.2553831,1.346337)" /> - + transform="translate(-1.2553831,1.346337)" /> - + transform="translate(-1.2553831,1.346337)" /> - + transform="translate(-1.2553831,1.346337)" /> - + transform="translate(-1.2553831,1.346337)" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +