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)=(x1−x2,y1−y2) 减数向量尾指向被减数向量尾
- 向量乘标量(数乘) 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 a⋅b=∣a∣∗∣b∣∗cosθ
- 几何意义: 点积的正负或零<=>角度小于、大于或等于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⎦⎤=(y1z2−y2z1)i−(x1z2−x2z1)j+(x1y2−x2y1)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