1. 程式人生 > 實用技巧 >UnityShader學習02_3D數學基礎

UnityShader學習02_3D數學基礎

3D數學基礎

座標系
模型座標系:模型自身的座標系
世界座標系:物體在空間中的座標
攝像機座標系:物體在攝像機位置和方向下的座標
螢幕投影座標系:物體在二維螢幕投影下的座標
向量
二維向量舉例

  • 向量相加 ( x 1 , y 1 ) + ( x 2 , y 2 ) = ( x 1 + x 2 , y 1 + y 2 ) (x_1,y_1)+(x_2,y_2)=(x_1+x_2,y_1+y_2) (x1,y1)+(x2,y2)=(x1+x2,y1+y2) 向量頭尾相連
  • 向量相減 ( x 1 , y 1 ) − ( x 2 , y 2 ) = ( x 1 − x 2 , y 1 − y 2 ) (x_1,y_1)-(x_2,y_2)=(x_1-x_2,y_1-y_2)
    (x1,y1)(x2,y2)=(x1x2,y1y2)
    減數向量尾指向被減數向量尾
  • 向量乘標量(數乘) a ∗ ( x 1 , y 1 ) = ( a ∗ x 1 , a ∗ y 1 ) a*(x_1,y_1)=(a*x_1,a*y_1) a(x1,y1)=(ax1,ay1)
  • 向量點積(數量積) ( x 1 , y 1 ) ⋅ ( x 2 , y 2 ) = x 1 ∗ x 2 + y 1 ∗ y 2 (x_1,y_1)\cdot(x_2,y_2)=x1*x2+y1*y2 (x1,y1)(x2,y2)=x1x2+y1y2
    • 數形結合 a ⃗ ⋅ b ⃗ = ∣ a ∣ ∗ ∣ b ∣ ∗ c o s θ \vec{a}\cdot\vec{b}=|a|*|b|*cos\theta
      a b =abcosθ
    • 幾何意義: 點積的正負或零<=>角度小於、大於或等於90°
    • 推論 當 a ⃗ \vec{a} a b ⃗ \vec{b} b 都是單位化向量時, θ = a c o s ( a ⃗ ⋅ b ⃗ ) \theta=acos(\vec{a}\cdot\vec{b}) θ=acos(a b )
  • 向量叉積 a ⃗ × b ⃗ = [ i j k x 1 y 1 z 1 x 2 y 2 z 2 ] = ( y 1 z 2 − y 2 z 1 ) i − ( x 1 z 2 − x 2 z 1 ) j + ( x 1 y 2 − x 2 y 1 ) k \vec{a}\times\vec{b}=\left[\begin{matrix} i & j & k \\x_1 & y_1 & z_1 \\x_2 & y_2 & z_2 \end{matrix}\right]=(y_1z_2-y_2z_1)i-(x_1z_2-x_2z_1)j+(x_1y_2-x_2y_1)k
    a ×b =ix1x2jy1y2kz1z2=(y1z2y2z1)i(x1z2x2z1)j+(x1y2x2y1)k
    • 其中ijk為3個方向向量,當其都是標準化向量時 a ⃗ × b ⃗ = ( y 1 z 2 − y 2 z 1 , z 1 x 2 − z 2 x 1 , x 1 y 2 − x 2 y 1 ) = n ⃗ \vec{a}\times\vec{b}=(y_1z_2-y_2z_1,z_1x_2-z_2x_1,x_1y_2-x_2y_1)=\vec{n} a ×b =(y1z2y2z1,z1x2z2x1,x1y2x2y1)=n
    • 幾何意義: n ⃗ \vec{n} n 垂直於 a ⃗ \vec{a} a b ⃗ \vec{b} b 所構成的平面,即成為該平面的法向量
    • 注意:法向量滿足左手螺旋法則,即將 a ⃗ \vec{a} a 旋轉到 b ⃗ \vec{b} b 看做螺旋, n ⃗ \vec{n} n 為大拇指朝向,因此Unity中叉乘應該為順時針計算

矩陣

[ m 11 m 12 m 13 m 21 m 22 m 23 m 31 m 32 m 33 ] \left[\begin{matrix} m_{11} & m_{12} & m_{13} \\m_{21} & m_{22} & m_{23} \\m_{31} & m_{32} & m_{33} \end{matrix}\right] m11m21m31m12m22m32m13m23m33

  • 矩陣和標量乘法 λ A = [ λ m 11 λ m 12 λ m 13 λ m 21 λ m 22 λ m 23 λ m 31 λ m 32 λ m 33 ] \lambda A=\left[\begin{matrix} \lambda m_{11} & \lambda m_{12} & \lambda m_{13} \\\lambda m_{21} & \lambda m_{22} & \lambda m_{23} \\\lambda m_{31} & \lambda m_{32} & \lambda m_{33} \end{matrix}\right] λA=λm11λm21λm31λm12λm22λm32λm13λm23λm33

  • 矩陣乘法

    • a對於一個mxn的矩陣 A ( a m n ) A(a_{mn}) A(amn)和nxp的矩陣 B ( b n p ) B(b_{np}) B(bnp),相乘後得到mxp的矩陣 C ( c m p ) C(c_{mp}) C(cmp)
    • c i j = ∑ r = 1 n a i r b r j ( m ≥ i > 0 , p ≥ j > 0 ) c_{ij}=\displaystyle \sum^n_{r=1}{a_{ir}b_{rj}(m\geq i>0,p\geq j>0)} cij=r=1nairbrj(mi>0,pj>0)
    • 不滿足交換律,滿足結合律和分配律
  • 矩陣轉置 A T = [ m 11 m 21 m 31 m 12 m 22 m 32 m 13 m 23 m 33 ] A^T=\left[\begin{matrix} m_{11} & m_{21} & m_{31} \\m_{12} & m_{22} & m_{32} \\m_{13} & m_{23} & m_{33} \end{matrix}\right] AT=m11m12m13m21m22m23m31m32m33

    • 性質1: ( A T ) T = A (A^T)^T=A (AT)T=A
    • 性質2: ( λ A ) T = λ A T (\lambda A)^T=\lambda A^T (λA)T=λAT
    • 性質3: ( A B ) T = B T A T (AB)^T=B^TA^T (AB)T=BTAT
  • 方陣就是行數和列數相等的矩陣

    • 方陣計算方法1:對角線和反對角線法
      ∣ A 3 ∣ = ∣ m 11 m 12 m 13 m 21 m 22 m 23 m 31 m 32 m 33 ∣ = m 11 m 22 m 33 + m 12 m 23 m 31 + m 13 m 21 m 32 − m 13 m 22 m 31 − m 12 m 21 m 33 − m 11 m 23 m 32 |A_3|=\left|\begin{matrix} m_{11} & m_{12} & m_{13} \\m_{21} & m_{22} & m_{23} \\m_{31} & m_{32} & m_{33} \end{matrix}\right|=m_{11}m_{22}m_{33}+m_{12}m_{23}m_{31}+m_{13}m_{21}m_{32}-m_{13}m_{22}m_{31}-m_{12}m_{21}m_{33}-m_{11}m_{23}m_{32} A3=m11m21m31m12m22m32m13m23m33=m11m22m33+m12m23m31+m13m21m32m13m22m31m12m21m33m11m23m32
    • 方陣計算方法2:代數餘子式
      餘子式: M 12 = [ m 21 m 23 m 31 m 33 ] M_{12}=\left[\begin{matrix} m_{21} & m_{23}\\m_{31} & m_{33} \end{matrix}\right] M12=[m21m31m23m33]
      即Mij為刪除第i行第j列元素後剩下元素組成的,階數-1的方陣
      代數餘子式 c 12 = ( − 1 ) 1 + 2 ∣ M 12 ∣ c_{12}=(-1)^{1+2}|M_{12}| c12=(1)1+2M12(注意正負)
      ∣ A m ∣ = ∑ j = 1 m m i j c i j ( i ∈ [ 1 , m ] ) = ∑ i = 1 m m i j c i j ( j ∈ [ 1 , m ] ) |A_{m}|=\displaystyle \sum_{j=1}^m{m_{ij}c_{ij}(i\in[1,m])}=\displaystyle \sum_{i=1}^m{m_{ij}c_{ij}(j\in[1,m])} Am=j=1mmijcij(i[1,m])=i=1mmijcij(j[1,m])
      簡而胭脂就是任取某一行/列,計算該行/列上的代數餘子式之和
    • 性質1 ∣ M 1 M 2 ∣ = ∣ M 1 ∣ ∣ M 2 ∣ |M_1M_2|=|M_1||M_2| M1M2=M1M2
    • 性質2: ∣ A T ∣ = ∣ A ∣ |A^T|=|A| AT=A
    • 性質3:任意行或列為0,則行列式為0
    • 性質4:交換兩行或兩列,行列式取反
    • 性質5:任意行/列加上 其他任意行/列的任意倍,行列式不變
  • 矩陣的逆
    A ( A − 1 ) = A − 1 A = I A(A^{-1})=A^{-1}A=I A(A1)=A1A=I

    • 逆矩陣的前提:為方陣、矩陣行列式不為0
    • 計算代數餘子式矩陣:
      M = [ c 11 c 12 c 13 c 21 c 22 c 23 c 31 c 32 c 33 ] M=\left[\begin{matrix} c_{11} & c_{12} & c_{13} \\c_{21} & c_{22} & c_{23} \\c_{31} & c_{32} & c_{33} \end{matrix}\right] M=c11c21c31c12c22c32c13c23c33
    • 計算標準伴隨矩陣:
      a d j M = M T adjM=M^{T} adjM=MT
    • 計算逆矩陣
      M − 1 = a d j M ∣ M ∣ M^{-1}=\frac{adjM}{|M|} M1=MadjM
    • 性質1 ( M − 1 ) − 1 = M (M^{-1})^{-1}=M (M1)1=M
    • 性質2 I − 1 = I I^{-1}=I I1=I
    • 性質3 ( M − 1 ) T = ( M T ) − 1 (M^{-1})^T=(M^{T})^{-1} (M1)T=(MT)1
    • 性質4 ( A B ) − 1 = B − 1 A − 1 (AB)^{-1}=B^{-1}A^{-1} (AB)1=B1A1
    • 正交矩陣: M − 1 < = > M T M^{ -1}<=>M^T M1<=>MT
      • 僅包含一個方向的旋轉的矩陣是正交矩陣

應用

2D旋轉
A = [ x y ] A=\left[\begin{matrix} x & y \end{matrix}\right] A=[xy]
順時針旋轉角為α
A ′ = [ x y ] ∗ [ c o s α s i n α − s i n α c o s α ] A'=\left[\begin{matrix} x & y \end{matrix}\right]*\left[\begin{matrix} cos\alpha& sin\alpha \\-sin\alpha &cos\alpha \end{matrix}\right] A=[xy][cosαsinαsinαcosα]
3D旋轉
x軸旋轉(x,y,z)
[ 1 0 0 0 c o s α s i n α 0 − s i n α c o s α ] \left[\begin{matrix} 1&0&0\\0&cos\alpha& sin\alpha \\0&-sin\alpha &cos\alpha \end{matrix}\right] 1000cosαsinα0sinαcosα
y、z軸旋轉同理可知


2D平移(3X3矩陣)
A = [ x y ] A=\left[\begin{matrix} x & y \end{matrix}\right] A=[xy]
平移距離(dx,dy,0)
A ′ = [ x y 1 ] ∗ [ 1 0 0 0 1 0 d x d y 1 ] = [ x + d x y + d y 1 ] A'=\left[\begin{matrix} x & y &1\end{matrix}\right]*\left[\begin{matrix} 1&0&0 \\0&1&0\\dx&dy&1 \end{matrix}\right]= \left[\begin{matrix} x+dx &y+dy &1 \end{matrix}\right] A=[xy1]10dx01dy001=[x+dxy+dy1]
3D平移(4X4矩陣)
A ′ = [ x y z 1 ] ∗ [ 1 0 0 0 0 1 0 0 0 0 1 0 d x d y d z 1 ] = [ x + d x y + d y z + d z 1 ] A'=\left[\begin{matrix} x & y &z&1\end{matrix}\right]*\left[\begin{matrix} 1&0&0&0 \\0&1&0&0\\0&0&1&0\\dx&dy&dz&1 \end{matrix}\right]=\left[\begin{matrix} x+dx &y+dy &z+dz&1 \end{matrix}\right] A=[xyz1]100dx010dy001dz0001=[x+dxy+dyz+dz1]


y軸旋轉+3D平移
[ c o s α 0 s i n α 0 0 1 0 0 − s i n α 0 c o s α 0 0 0 0 1 ] ∗ [ 1 0 0 0 0 1 0 0 0 0 1 0 d x d y d z 1 ] = [ c o s α 0 s i n α 0 0 1 0 0 − s i n α 0 c o s α 0 d x d y d z 1 ] \left[\begin{matrix} cos\alpha&0&sin\alpha&0 \\0&1&0&0\\-sin\alpha&0&cos\alpha&0\\0&0&0&1 \end{matrix}\right] *\left[\begin{matrix} 1&0&0&0 \\0&1&0&0\\0&0&1&0\\dx&dy&dz&1 \end{matrix}\right]=\left[\begin{matrix} cos\alpha&0&sin\alpha&0 \\0&1&0&0\\-sin\alpha&0&cos\alpha&0\\dx&dy&dz&1 \end{matrix}\right] cosα0sinα00100sinα0cosα00001100dx010dy001dz0001=cosα0sinαdx010dysinα0cosαdz0001
(3D平移的左上角3X3可以看做是一個單位矩陣,任何矩陣乘單位矩陣等於原矩陣,旋轉的矩陣複製過來即可)


縮放矩陣
[ s c a l e x 0 0 0 0 s c a l e y 0 0 0 0 s c a l e z 0 0 0 0 1 ] \left[\begin{matrix} scale_x&0&0&0 \\0&scale_y&0&0\\0&0&scale_z&0\\0&0&0&1 \end{matrix}\right] scalex0000scaley0000scalez00001


透視投影
Py為原位置,忽略掉P’y的正負性,可以得相似三角形的計算,轉為矩陣計算
在這裡插入圖片描述

A ′ = [ x y z 1 ] ∗ [ 1 0 0 0 0 1 0 0 0 0 1 1 d 0 0 0 0 ] = [ x y z z d ] A'=\left[\begin{matrix} x & y &z&1\end{matrix}\right]*\left[\begin{matrix} 1&0&0&0 \\0&1&0&0\\0&0&1&\frac{1}{d}\\0&0&0&0 \end{matrix}\right]=\left[\begin{matrix} x &y &z&\frac{z}{d} \end{matrix}\right] A=[xyz1]10000100001000d10=[xyzdz]
雖然這裡是四元向量,但在攝像機上只能顯示兩個(x,y),所以需要根據z和d來設定距離資訊(x,y)*d/z