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 ⎠ ⎞
这里的叉乘也和后面的欧拉角的一个分量对应上了。
总的来说,图形学里用到的矩阵和向量概念十分多,向量可由用来计算光照,表示方向,同时矩阵也可以用来计算变换过程,十分方便。