前言
这篇文章仅为了方便于自己查找一些3d 的数学公式。
DirectX使用的是行向量 ,即矩阵的乘法是左乘
OpenGL使用的是列向量 ,即矩阵的乘法是右乘
Unity的Shader中, 使用的是列向量 ,即矩阵的乘法是右乘
请注意,下面的矩阵向量如果没有特别说明,都是使用行向量(与Unity的有所区别)
一、向量类
向量的点积
- 公式1:
a ⃗ ⋅ b ⃗ = ∣ a ⃗ ∣ ⋅ ∣ b ⃗ ∣ c o s θ \vec{a}·\vec{b} = |\vec{a}|·|\vec{b}|cos\theta a⋅b=∣a∣⋅∣b∣cosθ - 公式2:
a ⃗ ⋅ b ⃗ = ( a ⃗ x , a ⃗ y , a ⃗ z ) ⋅ ( b ⃗ x , b ⃗ y , b ⃗ z ) = a ⃗ x b ⃗ x + a ⃗ y b ⃗ y + a ⃗ z b ⃗ z \vec{a}·\vec{b} = (\vec{a}_{x},\vec{a}_{y},\vec{a}_{z})·(\vec{b}_{x},\vec{b}_{y},\vec{b}_{z})\\ = \vec{a}_{x}\vec{b}_{x}+\vec{a}_{y}\vec{b}_{y}+\vec{a}_{z}\vec{b}_{z} a⋅b=(ax,ay,az)⋅(bx,by,bz)=axbx+ayby+azbz - 几何意义:
点积是描述两个向量的"相似程度",点积结果越大,两向量越接近;
结果等于0,代表两向量垂直;
结果大于0,代表两向量的夹角大于90度;
结果小于0,代表两向量的夹角小于90度。
向量的叉积
- 公式
a ⃗ × b ⃗ = [ a ⃗ x a ⃗ y a ⃗ z ] × [ b ⃗ x b ⃗ y b ⃗ z ] = [ a ⃗ y × b ⃗ z − a ⃗ z × b ⃗ y a ⃗ z × b ⃗ x − a ⃗ x × b ⃗ z a ⃗ x × b ⃗ y − a ⃗ y × b ⃗ x ] \vec{a}× \vec{b} = \begin{bmatrix} \vec{a}_{x} \\ \vec{a}_{y} \\ \vec{a}_{z} \\ \end{bmatrix} × \begin{bmatrix} \vec{b}_{x} \\ \vec{b}_{y} \\ \vec{b}_{z} \\ \end{bmatrix}= \begin{bmatrix} \vec{a}_{y}×\vec{b}_{z}- \vec{a}_{z}×\vec{b}_{y}\\ \vec{a}_{z}×\vec{b}_{x}- \vec{a}_{x}×\vec{b}_{z} \\ \vec{a}_{x}×\vec{b}_{y}- \vec{a}_{y}×\vec{b}_{x}\\ \end{bmatrix} a×b= axayaz × bxbybz = ay×bz−az×byaz×bx−ax×bzax×by−ay×bx - 几何意义:
叉积得到的向量垂直于原来的两个向量
二、矩阵
2.1 方阵
定义:行数和列数相同的矩阵称为方阵,如2×2矩阵,3×3矩阵,4×4矩阵等;
-
对角矩阵
定义:如果所有非对角线元素都为0,则这种矩阵称为对角矩阵,如下:
[ M 11 0 0 0 0 M 22 0 0 0 0 M 33 0 0 0 0 M 44 ] \begin{bmatrix} M_{11}&0&0&0\\ 0&M_{22}&0&0\\ 0&0&M_{33}&0\\ 0&0&0&M_{44}\\ \end{bmatrix} M110000M220000M330000M44 -
单位矩阵
定义:对角线元素为1,其他元素为0的矩阵称为单位矩阵, 单位矩阵是一种特殊的对角矩阵,如下:
[ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] \begin{bmatrix} 1&0&0&0\\ 0&1&0&0\\ 0&0&1&0\\ 0&0&0&1\\ \end{bmatrix} 1000010000100001
任意一个矩阵乘以单位矩阵,都将得到原来的矩阵
2.2 矩阵乘法的注意事项
-
矩阵乘法不满足交换律,即: AB≠ BA
-
矩阵乘法满足结合律,即: (AB)C= A(BC) (假设A, B, C的维数使其乘法有意义,要注意如果(AB)C有意义,那么A(BC)- -定也有意义)
矩阵乘法结合律可以扩展到多个矩阵的情况下,如:
ABCDEF=(((AB)C)D)E)F= (((BC)D)E)F)=(AB)(CD)(EF) -
矩阵乘法也满足与标量或向量的结合律,即:
(kA)B=k(AB)= A(kB) (vA)B=v(AB) -
矩阵积的转置相当于先转置矩阵然后以相反的顺序乘:
( A B ) T = B T A T ( M 1 M 2 M 3 . . . M n − 1 M n ) T = M n T M n − 1 T . . . M 3 T M 2 T M 1 T (AB)^{T} = B^{T}A^{T}\\ ({M}_{1}{M}_{2}{M}_{3}...{M}_{n-1}{M}_{n})^{T} = {M}_{n}^{T}{M}_{n-1}^{T}...{M}_{3}^{T}{M}_{2}^{T}{M}_{1}^{T} (AB)T=BTAT(M1M2M3...Mn−1Mn)T=MnTMn−1T...M3TM2TM1T -
矩阵一向量乘法满足对向量加法的分配律。对于向量v、w和矩阵M,有:
( v ⃗ + w ⃗ ) M = v ⃗ M + w ⃗ M (\vec{v}+\vec{w})M = \vec{v}M+\vec{w}M (v+w)M=vM+wM
2.3 矩阵的转置
定义:
一个
r
∗
c
的矩阵
M
,
M
的转置记作
M
T
,
M
T
是一个
c
∗
r
的矩阵
一个r * c的矩阵M,M的转置记作 M^{T},M^{T}是一个c * r的矩阵
一个r∗c的矩阵M,M的转置记作MT,MT是一个c∗r的矩阵
从另一方面理解,
M
i
j
T
=
M
j
i
,
即沿着矩阵的对角线翻折
从另一方面理解,M_ij^{T} = M_ji,即沿着矩阵的对角线翻折
从另一方面理解,MijT=Mji,即沿着矩阵的对角线翻折
如下例子:
[
a
b
c
d
e
f
g
h
i
]
T
=
[
a
d
g
b
e
h
c
f
i
]
\begin{bmatrix} a&b&c\\ d&e&f\\ g&h&i\\ \end{bmatrix}^{T} = \begin{bmatrix} a&d&g\\ b&e&h\\ c&f&i\\ \end{bmatrix}
adgbehcfi
T=
abcdefghi
2.4 矩阵的几何解析
2.4.1 矩阵怎样变换向量的
以
p
⃗
、
q
⃗
、
r
⃗
为行构建一个
3
×
3
矩阵
M
,可以得到下面的形式:
以\vec{p}、\vec{q}、\vec{r}为行构建一个3×3矩阵M,可以得到下面的形式:
以p、q、r为行构建一个3×3矩阵M,可以得到下面的形式:
M
=
[
p
⃗
q
⃗
r
⃗
]
=
[
p
⃗
x
p
⃗
y
p
⃗
z
q
⃗
x
q
⃗
y
q
⃗
z
r
⃗
x
r
⃗
y
r
⃗
z
]
M = \begin{bmatrix} \vec{p}\\ \vec{q}\\ \vec{r}\\ \end{bmatrix} = \begin{bmatrix} {\vec{p}}_{x}&{\vec{p}}_{y}&{\vec{p}}_{z}\\ {\vec{q}}_{x}&{\vec{q}}_{y}&{\vec{q}}_{z}\\ {\vec{r}}_{x}&{\vec{r}}_{y}&{\vec{r}}_{z}\\ \end{bmatrix}
M=
pqr
=
pxqxrxpyqyrypzqzrz
如果用一个向量乘以该矩阵,得到:
[
x
y
z
]
×
[
p
⃗
x
p
⃗
y
p
⃗
z
q
⃗
x
q
⃗
y
q
⃗
z
r
⃗
x
r
⃗
y
r
⃗
z
]
=
x
⋅
p
⃗
+
y
⋅
q
⃗
+
z
⋅
r
⃗
\begin{bmatrix} x&y&z\\ \end{bmatrix} × \begin{bmatrix} {\vec{p}}_{x}&{\vec{p}}_{y}&{\vec{p}}_{z}\\ {\vec{q}}_{x}&{\vec{q}}_{y}&{\vec{q}}_{z}\\ {\vec{r}}_{x}&{\vec{r}}_{y}&{\vec{r}}_{z}\\ \end{bmatrix} = x·\vec{p} + y·\vec{q} + z·\vec{r}
[xyz]×
pxqxrxpyqyrypzqzrz
=x⋅p+y⋅q+z⋅r
如果把矩阵的行解释为坐标系的基向量,那么乘以该矩阵就相当于执行了一次坐标转换。若有aM-如果把矩阵的行解释为坐标系的基向量,那么乘以该矩阵就相当于执行了一次坐标转换。若有aM = b,我们就可以说,M将a转换到b。
2.4.2 矩阵的形式
矩阵每一行都能解析为转换后的基向量。(大家可以用转换前的基向量乘该矩阵就可以得出结论,具体过程不再推导)
2.5 旋转矩阵
下面所说的角度都是以逆时针为正方形
2.5.1 2D的旋转矩阵
R ( θ ) = [ p ′ q ′ ] = [ c o s θ s i n θ − s i n θ c o s θ ] R(\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ \end{bmatrix} = \begin{bmatrix} cos\theta&sin\theta\\ -sin\theta&cos\theta\\ \end{bmatrix} R(θ)=[p′q′]=[cosθ−sinθsinθcosθ]
2.5.2 3D中绕坐标轴旋转
绕轴旋转θ时,必须知道哪个方向为正,哪个方向为负。
-------这个后面补充-------
- 绕X轴旋转
R ( θ ) = [ p ′ q ′ r ′ ] = [ 1 0 0 0 c o s θ s i n θ 0 − s i n θ c o s θ ] R(\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ r{′}\\ \end{bmatrix} = \begin{bmatrix} 1&0&0\\ 0&cos\theta&sin\theta\\ 0&-sin\theta&cos\theta\\ \end{bmatrix} R(θ)= p′q′r′ = 1000cosθ−sinθ0sinθcosθ - 绕Y轴旋转
R ( θ ) = [ p ′ q ′ r ′ ] = [ c o s θ 0 − s i n θ 0 1 0 s i n θ 0 c o s θ ] R(\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ r{′}\\ \end{bmatrix} = \begin{bmatrix} cos\theta&0&-sin\theta\\ 0&1&0\\ sin\theta&0&cos\theta\\ \end{bmatrix} R(θ)= p′q′r′ = cosθ0sinθ010−sinθ0cosθ - 绕Z轴旋转
R ( θ ) = [ p ′ q ′ r ′ ] = [ c o s θ s i n θ 0 − s i n θ c o s θ 0 0 0 1 ] R(\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ r{′}\\ \end{bmatrix} = \begin{bmatrix} cos\theta&sin\theta&0\\ -sin\theta&cos\theta&0\\ 0&0&1\\ \end{bmatrix} R(θ)= p′q′r′ = cosθ−sinθ0sinθcosθ0001
2.5.3 3D中绕任意轴旋转
R ( n , θ ) = [ p ′ q ′ r ′ ] = [ n x 2 ( 1 − c o s θ ) + c o s θ n x n y ( 1 − c o s θ ) + n z s i n θ n x n z ( 1 − c o s θ ) − n y s i n θ n x n y ( 1 − c o s θ ) − n z s i n θ n y 2 ( 1 − c o s θ ) + c o s θ n y n z ( 1 − c o s θ ) + n x s i n θ n x n z ( 1 − c o s θ ) + n y s i n θ n y n z ( 1 − c o s θ ) − n x s i n θ n z 2 ( 1 − c o s θ ) + c o s θ ] R(n,\theta) = \begin{bmatrix} p^{′}\\ q^{′}\\ r{′}\\ \end{bmatrix} = \begin{bmatrix} n_x^{2}(1-cos\theta)+cos\theta&n_xn_y(1-cos\theta)+n_zsin\theta&n_xn_z(1-cos\theta)-n_ysin\theta\\ n_xn_y(1-cos\theta)-n_zsin\theta&n_y^{2}(1-cos\theta)+cos\theta&n_yn_z(1-cos\theta)+n_xsin\theta\\ n_xn_z(1-cos\theta)+n_ysin\theta&n_yn_z(1-cos\theta)-n_xsin\theta&n_z^{2}(1-cos\theta)+cos\theta\\ \end{bmatrix} R(n,θ)= p′q′r′ = nx2(1−cosθ)+cosθnxny(1−cosθ)−nzsinθnxnz(1−cosθ)+nysinθnxny(1−cosθ)+nzsinθny2(1−cosθ)+cosθnynz(1−cosθ)−nxsinθnxnz(1−cosθ)−nysinθnynz(1−cosθ)+nxsinθnz2(1−cosθ)+cosθ
2.6 缩放矩阵
2.6.1 2D的缩放矩阵
S ( k x , k y ) = [ k x 0 0 k y ] S(k_x,k_y) = \begin{bmatrix} k_x&0\\ 0&k_y\\ \end{bmatrix} S(kx,ky)=[kx00ky]
2.6.2 3D的缩放矩阵
S ( k x , k y , , k z ) = [ k x 0 0 0 k y 0 0 0 k z ] S(k_x,k_y,,k_z) = \begin{bmatrix} k_x&0&0\\ 0&k_y&0\\ 0&0&k_z\\ \end{bmatrix} S(kx,ky,,kz)= kx000ky000kz
2.6.3 2D沿任意方向的缩放矩阵
通过基向量构造矩阵,得到以单位向量n为缩放方向,k为因子的缩放矩阵,如下面公式所示
S
(
n
⃗
,
k
)
=
[
1
+
(
k
−
1
)
n
⃗
x
2
(
k
−
1
)
n
⃗
x
n
⃗
y
(
k
−
1
)
n
⃗
x
n
⃗
y
1
+
(
k
−
1
)
n
⃗
y
2
]
S(\vec{n},k) = \begin{bmatrix} 1+(k-1)\vec{n}_x^{2}&(k-1)\vec{n}_x\vec{n}_y\\ (k-1)\vec{n}_x\vec{n}_y&1+(k-1)\vec{n}_y^{2}\\ \end{bmatrix}
S(n,k)=[1+(k−1)nx2(k−1)nxny(k−1)nxny1+(k−1)ny2]
2.6.4 3D沿任意方向的缩放矩阵
以单位向量n为缩放方向,k为因子的3D缩放矩阵如下面公式所示
S
(
n
⃗
,
k
)
=
[
1
+
(
k
−
1
)
n
⃗
x
2
(
k
−
1
)
n
⃗
x
n
⃗
y
(
k
−
1
)
n
⃗
x
n
⃗
z
(
k
−
1
)
n
⃗
x
n
⃗
y
1
+
(
k
−
1
)
n
⃗
y
2
(
k
−
1
)
n
⃗
y
n
⃗
z
(
k
−
1
)
n
⃗
x
n
⃗
z
(
k
−
1
)
n
⃗
z
n
⃗
y
1
+
(
k
−
1
)
n
⃗
z
2
]
S(\vec{n},k) = \begin{bmatrix} 1+(k-1)\vec{n}_x^{2}&(k-1)\vec{n}_x\vec{n}_y&(k-1)\vec{n}_x\vec{n}_z\\ (k-1)\vec{n}_x\vec{n}_y&1+(k-1)\vec{n}_y^{2}&(k-1)\vec{n}_y\vec{n}_z\\ (k-1)\vec{n}_x\vec{n}_z&(k-1)\vec{n}_z\vec{n}_y&1+(k-1)\vec{n}_z^{2}\\ \end{bmatrix}
S(n,k)=
1+(k−1)nx2(k−1)nxny(k−1)nxnz(k−1)nxny1+(k−1)ny2(k−1)nzny(k−1)nxnz(k−1)nynz1+(k−1)nz2
-------没完待续。。。。。。后期会继续补充-------