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)
- 向量乘標量(數乘) 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)=(a∗x1,a∗y1)
- 向量點積(數量積)
(
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)=x1∗x2+y1∗y2
- 數形結合
a
⃗
⋅
b
⃗
=
∣
a
∣
∗
∣
b
∣
∗
c
o
s
θ
\vec{a}\cdot\vec{b}=|a|*|b|*cos\theta
- 幾何意義: 點積的正負或零<=>角度小於、大於或等於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
⃗
=
∣
a
∣
∗
∣
b
∣
∗
c
o
s
θ
\vec{a}\cdot\vec{b}=|a|*|b|*cos\theta
- 向量叉積
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
- 其中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 =(y1z2−y2z1,z1x2−z2x1,x1y2−x2y1)=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=1∑nairbrj(m≥i>0,p≥j>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+m13m21m32−m13m22m31−m12m21m33−m11m23m32 - 方陣計算方法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+2∣M12∣(注意正負)
∣ 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=1∑mmijcij(i∈[1,m])=i=1∑mmijcij(j∈[1,m])
簡而胭脂就是任取某一行/列,計算該行/列上的代數餘子式之和 - 性質1 ∣ M 1 M 2 ∣ = ∣ M 1 ∣ ∣ M 2 ∣ |M_1M_2|=|M_1||M_2| ∣M1M2∣=∣M1∣∣M2∣
- 性質2: ∣ A T ∣ = ∣ A ∣ |A^T|=|A| ∣AT∣=∣A∣
- 性質3:任意行或列為0,則行列式為0
- 性質4:交換兩行或兩列,行列式取反
- 性質5:任意行/列加上 其他任意行/列的任意倍,行列式不變
- 方陣計算方法1:對角線和反對角線法
-
矩陣的逆
A ( A − 1 ) = A − 1 A = I A(A^{-1})=A^{-1}A=I A(A−1)=A−1A=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|} M−1=∣M∣adjM - 性質1 ( M − 1 ) − 1 = M (M^{-1})^{-1}=M (M−1)−1=M
- 性質2 I − 1 = I I^{-1}=I I−1=I
- 性質3 ( M − 1 ) T = ( M T ) − 1 (M^{-1})^T=(M^{T})^{-1} (M−1)T=(MT)−1
- 性質4 ( A B ) − 1 = B − 1 A − 1 (AB)^{-1}=B^{-1}A^{-1} (AB)−1=B−1A−1
- 正交矩陣:
M
−
1
<
=
>
M
T
M^{ -1}<=>M^T
M−1<=>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α0−sinα00100sinα0cosα00001⎦⎥⎥⎤∗⎣⎢⎢⎡100dx010dy001dz0001⎦⎥⎥⎤=⎣⎢⎢⎡cosα0−sinα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