GAMES101-现代计算机图形学学习笔记(02)
Lecture 02 Review of Linear Algebra
今天有幸看到闫老师的现代图形学课程,感觉真的讲得很好,所以决定把自己的一些学习笔记以及课程作业记录下来,希望能和大家一起讨论学习一下。如果有时间还是希望大家能去看看原课程,强推!! b站视频链接: link . 课程官网链接: link .
向量
向量定义
一种既有大小,又有方向的量;大小体现在模长,方向体现在指向。 没有绝对的起始位置,所以也具有平移不变性 的性质。 一个如图所示的向量
A
B
→
\overrightarrow{A B}
A B
, 可由如下公式表示:
A
B
→
=
B
−
A
\overrightarrow{A B}=B-A
A B
= B − A
向量运算
向量单位化
向量
A
B
→
\overrightarrow{A B}
A B
的模长记为:
∣
∣
A
B
→
∣
∣
||\overrightarrow{A B}||
∣ ∣ A B
∣ ∣ , 对于三维空间的向量
A
B
→
=
(
x
,
y
,
z
)
\overrightarrow{A B} = (x,y,z)
A B
= ( x , y , z ) 来说,模长为
x
2
+
y
2
+
z
2
2
\sqrt[2]{x^{2}+y^{2}+z^{2}}
2 x 2 + y 2 + z 2
。 一个模长为1的向量为单位向量,计算一个单位向量可以通过
A
B
^
=
A
B
→
/
∥
A
B
→
∥
\hat{AB}=\overrightarrow{A B} /\|\overrightarrow{A B}\|
A B ^ = A B
/ ∥ A B
∥ 来计算。
向量加法的两种表示形式
几何上:表示为平行四边形或者三角形法则相加
代数上:表示为数值位(坐标轴位)上的相加
向量乘法
假设已知向量
a
⃗
\vec{a}
a
和
b
⃗
\vec{b}
b
为三维空间上的向量。
点乘 点乘结果是一个数 ①代数形式: 向量点乘表示为其各个分量上的乘积和
a
⃗
⋅
b
⃗
=
∑
i
=
1
3
a
i
b
i
=
a
1
b
1
+
a
2
b
2
+
a
3
b
3
\vec{a} \cdot \vec{b}=\sum_{i=1}^{3} a_{i} b_{i}=a_{1} b_{1}+a_{2} b_{2}+a_{3} b_{3}
a
⋅ b
= i = 1 ∑ 3 a i b i = a 1 b 1 + a 2 b 2 + a 3 b 3 ②几何形式:
a
⃗
⋅
b
⃗
=
∥
a
⃗
∥
∥
b
⃗
∥
cos
θ
\vec{a} \cdot \vec{b}=\|\vec{a}\|\|\vec{b}\| \cos \theta
a
⋅ b
= ∥ a
∥ ∥ b
∥ cos θ 同时也可以变换公式得到两个向量的夹角余弦值:
cos
θ
=
a
⃗
⋅
b
⃗
∥
a
⃗
∥
∥
b
⃗
∥
\cos \theta=\frac{\vec{a} \cdot \vec{b}}{\|\vec{a}\|\|\vec{b}\|}
cos θ = ∥ a
∥ ∥ b
∥ a
⋅ b
即通过该余弦值计算两个向量的相似度。 ③意义: 第一点,找到两个向量的夹角(可以通过角度的大小决定两个向量的前后关系); 第二点,找到一个向量在另一个向量上的投影; 第三点,对向量在水平和垂直方向上进行分解; 点乘的应用十分广泛,还有诸如计算光照反射分量也需要用到点乘,即考虑了入射光和物体表面法向的夹角关系,当光照方向与物体法向方向夹角越小时,其光照影响会越大,即点乘结果越接近1,如下图所示:
叉乘 叉乘结果是一个向量 ①代数形式:
a
⃗
×
b
⃗
=
(
y
a
z
b
−
y
b
z
a
z
a
x
b
−
x
a
z
b
x
a
y
b
−
y
a
x
b
)
\vec{a} \times \vec{b}=\left(\begin{array}{l} y_{a} z_{b}-y_{b} z_{a} \\ z_{a} x_{b}-x_{a} z_{b} \\ x_{a} y_{b}-y_{a} x_{b} \end{array}\right)
a
× b
= ⎝ ⎛ y a z b − y b z a z a x b − x a z b x a y b − y a x b ⎠ ⎞ ②几何形式: 数值上 以
a
⃗
\vec{a}
a
,
b
⃗
\vec{b}
b
夹角为θ组成的平行四边形的面积。 方向上 垂直于
a
⃗
\vec{a}
a
,
b
⃗
\vec{b}
b
所决定的平面,其指向按右手定则从
a
⃗
\vec{a}
a
转向
b
⃗
\vec{b}
b
来确定。 (需要注意的一点 )两个向量叉乘交换需要加负号,而点乘不需要。
a
⃗
×
b
⃗
=
−
b
⃗
×
a
⃗
\vec{a} \times \vec{b}=-\vec{b} \times \vec{a}
a
× b
= − b
× a
a
⃗
⋅
b
⃗
=
b
⃗
⋅
a
⃗
\vec{a} \cdot \vec{b}=\vec{b} \cdot \vec{a}
a
⋅ b
= b
⋅ a
③意义: 第一点,叉乘可以用来向量的左右关系。若向量
a
⃗
\vec{a}
a
在向量
b
⃗
\vec{b}
b
右边,通过右手法则,他们叉乘的结果应该朝上;而如果结果朝下,则向量
a
⃗
\vec{a}
a
在向量
b
⃗
\vec{b}
b
左边; 第二点,叉乘可以用来判断一个点是否在多边形内。如果一个点P在一个多边形内,那么从该多边形所有的点来说,每条边构成的向量与点p构成的向量叉乘结果都应该是一致的,反之,会出现某些叉乘结构不一致,即算出的向量方向相反。 下图中点A B C 构成的向量与点 P构成的向量的叉乘结果都是朝向屏幕外。
矩阵
矩阵定义
矩阵本质上是由m × n 个数排成的m行n列的数表。记作:
A
=
[
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
a
31
a
32
⋯
a
3
n
⋯
⋯
⋯
a
m
1
a
m
2
⋯
a
m
n
]
\mathbf{A}=\left[\begin{array}{llll} a_{11} & a_{12} & \cdots & a_{1 n} \\ a_{21} & a_{22} & \cdots & a_{2 n} \\ a_{31} & a_{32} & \cdots & a_{3 n} \\ \cdots & \cdots & & \cdots \\ a_{m 1} & a_{m 2} & \cdots & a_{m n} \end{array}\right]
A = ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ a 1 1 a 2 1 a 3 1 ⋯ a m 1 a 1 2 a 2 2 a 3 2 ⋯ a m 2 ⋯ ⋯ ⋯ ⋯ a 1 n a 2 n a 3 n ⋯ a m n ⎦ ⎥ ⎥ ⎥ ⎥ ⎤
矩阵运算
包括矩阵与矩阵的加法,减法,矩阵的交换律,结合律等等。这里不详细展开,可以参考: 链接: link .
矩阵乘法
矩阵与数的乘法
矩阵与矩阵的乘法(需要第一个矩阵列数与第二个矩阵行数相等)
点乘和叉乘的矩阵乘法表示
点乘的矩阵乘法表示
a
⃗
⋅
b
⃗
=
a
⃗
T
b
⃗
=
(
x
a
y
a
z
a
)
(
x
b
y
b
z
b
)
=
(
x
a
x
b
+
y
a
y
b
+
z
a
z
b
)
\begin{array}{cc} \vec{a} \cdot \vec{b}=\vec{a}^{T} \vec{b} =\left(\begin{array}{lll} x_{a} & y_{a} & z_{a} \end{array}\right)\left(\begin{array}{l} x_{b} \\ y_{b} \\ z_{b} \end{array}\right) \end{array}=\left(x_{a} x_{b}+y_{a} y_{b}+z_{a} z_{b}\right)
a
⋅ b
= a
T b
= ( x a y a z a ) ⎝ ⎛ x b y b z b ⎠ ⎞ = ( x a x b + y a y b + z a z b )
叉乘的矩阵乘法表示
a
⃗
×
b
⃗
=
A
∗
b
=
(
0
−
z
a
y
a
z
a
0
−
x
a
−
y
a
x
a
0
)
(
x
b
y
b
z
b
)
\vec{a} \times \vec{b}=A^{*} b=\left(\begin{array}{ccc} 0 & -z_{a} & y_{a} \\ z_{a} & 0 & -x_{a} \\ -y_{a} & x_{a} & 0 \end{array}\right)\left(\begin{array}{l} x_{b} \\ y_{b} \\ z_{b} \end{array}\right)
a
× b
= A ∗ b = ⎝ ⎛ 0 z a − y a − z a 0 x a y a − x a 0 ⎠ ⎞ ⎝ ⎛ x b y b z b ⎠ ⎞ 这里的叉乘也和后面计算轴角的一个分量对应上了。
总的来说,图形学里用到的矩阵和向量概念十分多,向量可由用来计算光照,表示方向,同时矩阵也可以用来计算变换过程,十分方便。