我擦服猪,居然不識(shí)別公式饼拍。好吧想看的同學(xué)自己復(fù)制到別的 Markdown 編輯器上吧彬犯。沒錯(cuò)我就是這么不負(fù)責(zé)任向楼。
左手坐標(biāo)系
舉起右手,用食指和大拇指擺出一個(gè)“L”的手勢谐区,并且讓食指向上湖蜕,大拇指向右。現(xiàn)在宋列,伸出中指昭抒,如果不出意外的話它應(yīng)該指向你的前方。你的大拇指炼杖、食指和中指分別對應(yīng)了+x灭返、+y和+z軸的方向。
當(dāng)需要旋轉(zhuǎn)時(shí)坤邪,在左手坐標(biāo)系中熙含,我們可以這樣判斷方向:舉起左手,握拳艇纺,伸出大拇指讓它指向旋轉(zhuǎn)軸的正方向怎静,那么旋轉(zhuǎn)的正方向就是剩下4個(gè)手指的彎曲方向。
矢量的點(diǎn)積(內(nèi)積)
- 在 Unity Shader 中黔衡,我們可以直接使用 dot(a,b) 的代碼來對兩個(gè)矢量值進(jìn)行點(diǎn)積的運(yùn)算蚓聘。
- 公式:$ a \times b = (a_x, a_y, a_z) \cdot (b_x, b_y, b_z) = a_xb_x + a_yb_y + a_zb_z $
- 我們可以使用點(diǎn)積 a·b 來得到 b 在 a 方向上的有符號(hào)的投影。
- 我們可以直接利用點(diǎn)積來求矢量的模:$ v \cdot v = v_xv_x + v_yv_y + v_zv_z = |v|^2 $
- 第二個(gè)計(jì)算公式:$ a \cdot b = |a||b| \cos\theta $
矢量的差積(外積)
- 矢量差積的結(jié)果仍然是一個(gè)矢量盟劫。
- 公式: $ a \times b = (a_x, a_y, a_z) \times (b_x, b_y, b_z) = (a_yb_z - a_zb_y, a_zb_x - a_xb_z, a_xb_y - a_yb_x ) $
- 幾何意義:差積將得到一個(gè)同時(shí)垂直于這兩個(gè)矢量的新矢量夜牡。
- 不滿足交換律
- 另一個(gè)公式:$|a \times b| = |a||b|sin \theta $
基本的變換矩陣
1. 一些基本概念
- 線性變換包括:縮放(scale),旋轉(zhuǎn)(rotation)捞高,錯(cuò)切(shear),鏡像(mirroring)渣锦,正交投影等硝岗。
- 仿射變換(affine transform):合并線性變換和平移變換的變換類型。
- 齊次坐標(biāo)(homogeneous coordinate):由三維矢量轉(zhuǎn)換而成的四維矢量(事實(shí)上齊次坐標(biāo)的維度可以超過四維)袋毙。齊次坐標(biāo)只是為了方便計(jì)算而使用的一種表示方法而已型檀。
- 我們把表示純平移、純旋轉(zhuǎn)和純縮放的變換矩陣叫做基礎(chǔ)變換矩陣听盖。
2. 基礎(chǔ)變換矩陣
基礎(chǔ)變換矩陣:
$$ \left[ \begin{matrix} M_{x \times x} & t_{3 \times 1}\ 0_{1 \times 3} & 1 \end{matrix} \right] $$
其中胀溺,左上角的 $M_{x \times x}$ 用于表示旋轉(zhuǎn)和縮放裂七,$t_{3 \times 1}$ 表示平移。
3. 平移矩陣
$$ \left[ \begin{matrix} 1 & 0 & 0 & t_x \ 0 & 1 & 0 & t_y \ 0 & 0 & 1 & t_z \ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \ y \ z \ 1 \end{matrix} \right] = \left[ \begin{matrix} x + t_x \ y + t_y \ z + t_z \ 1 \end{matrix} \right] $$
3. 縮放矩陣
$$ \left[ \begin{matrix} k_x & 0 & 0 & 0 \ 0 & k_y & 0 & 0 \ 0 & 0 & k_z & 0 \ 0 & 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \ y \ z \ 1 \end{matrix} \right] = \left[ \begin{matrix} k_xx \ k_yy \ k_zz \ 1 \end{matrix} \right] $$
4. 旋轉(zhuǎn)矩陣
- 如果我們需要把點(diǎn)繞著x軸旋轉(zhuǎn) \theta 度仓坞,可以使用下面的矩陣:
$$ R_x(\theta)=
\left[ \begin{matrix}
1 & 0 & 0 & 0 \
0 & \cos\theta & -\sin\theta & 0 \
0 & \sin\theta & \cos\theta & 0 \
0 & 0 & 0 & 1
\end{matrix} \right]
$$ - 繞y軸旋轉(zhuǎn):
$$ R_y(\theta)=
\left[ \begin{matrix}
\cos\theta & 0 & \sin\theta & 0 \
0 & 1 & 0 & 0 \
-\sin\theta & 0 & \cos\theta & 0 \
0 & 0 & 0 & 1
\end{matrix} \right]
$$ - 繞z軸旋轉(zhuǎn):
$$ R_z(\theta)=
\left[ \begin{matrix}
\cos\theta & -\sin\theta & 0 & 0 \
\sin\theta & \cos\theta & 0 & 0 \
0 & 0 & 1 & 0 \
0 & 0 & 0 & 1
\end{matrix} \right]
$$
5. 復(fù)合變化
我們可以把平移背零、旋轉(zhuǎn)和縮放組合起來,來形成一個(gè)復(fù)雜的變換過程无埃。復(fù)合變換可以通過矩陣的串聯(lián)來實(shí)現(xiàn):
$$ P_{new} = M_{translation}M_{rotation}M_{scale}P_{old} $$
由于上面我們使用的是列矩陣徙瓶,因此閱讀順序是從右到左($M_{scale}$先和$P_{old}$運(yùn)算),即先進(jìn)行縮放變換嫉称,再進(jìn)行旋轉(zhuǎn)變換侦镇,最后進(jìn)行平移變換。由于計(jì)算結(jié)果是依賴于變換順序的织阅,由于矩陣乘法不滿足交換律壳繁,因此矩陣的乘法順序很重要。我們約定變換順序就是:先縮放荔棉,再旋轉(zhuǎn)闹炉,最后平移。
當(dāng)需要組合旋轉(zhuǎn)時(shí)江耀,Unity 中剩胁,旋轉(zhuǎn)的順序是z、x祥国、y昵观,這意味著,當(dāng)給定 $(\theta_x, \theta_y, \theta_z)$ 這樣的旋轉(zhuǎn)角度時(shí)舌稀,得到的組合旋轉(zhuǎn)變換矩陣是:
$$ M_{rotat\theta_z}M_{rotat\theta_x}M_{rotat\theta_y} =
\left[ \begin{matrix}
\cos\theta & -\sin\theta & 0 & 0 \
\sin\theta & \cos\theta & 0 & 0 \
0 & 0 & 1 & 0 \
0 & 0 & 0 & 1
\end{matrix} \right]
\left[ \begin{matrix}
1 & 0 & 0 & 0 \
0 & \cos\theta & -\sin\theta & 0 \
0 & \sin\theta & \cos\theta & 0 \
0 & 0 & 0 & 1
\end{matrix} \right]
\left[ \begin{matrix}
\cos\theta & 0 & \sin\theta & 0 \
0 & 1 & 0 & 0 \
-\sin\theta & 0 & \cos\theta & 0 \
0 & 0 & 0 & 1
\end{matrix} \right]
$$
目前所需要的內(nèi)容不涉及到坐標(biāo)轉(zhuǎn)換等問題啊犬,其他基礎(chǔ)數(shù)學(xué)知識(shí)先不管。