文章目录
向量(vector)
- 两个重要属性:方向和长度
- 没有特定的开始位置
Normalization标准化
- 长度: ∣ ∣ a ∣ ∣ ||\bold a|| ∣∣a∣∣
- 单位向量:
a
^
=
a
∣
∣
a
∣
∣
\hat a = \frac {\bold a} { || \bold a ||}
a^=∣∣a∣∣a
用来表示方向
Addition
-
Parallelogram law & Triangle law,平行四边形定则或者三角定则
-
Algebraically(代数上理解):坐标相加
笛卡尔坐标系(Cartesian Coordinates)
将所有向量的起点都移动到原点,使用两个向量(通常相互垂直的单位向量(orthogonal unit))来表示空间中的所有向量。
相互垂直的单位向量的优势是便于计算长度: ∣ ∣ A ∣ ∣ = x 2 + y 2 ||A|| = \sqrt{x^2 + y^2} ∣∣A∣∣=x2+y2
Product乘法
Dot(Scalar) Product
a
⋅
b
=
∣
∣
a
∣
∣
∣
∣
b
∣
∣
cos
θ
\bold a · \bold b = || \bold a || || \bold b || \cos\theta
a⋅b=∣∣a∣∣∣∣b∣∣cosθ
点乘满足交换律、结合律、分配律。
在笛卡尔坐标系下,计算点乘可以通过对应轴相乘,再加和。
点乘通常用来找到两个向量的夹角(或者说夹角的余弦) ,以及找到一个向量到另一个向量的投影。
-
投影一定和a共线
-
投影的长度符合直角三角形定则,用b的长度乘夹角cos就能求得
-
计算投影可以用于将向量拆解
- 点乘也可以用于计算前后(相对于某一向量),根据点积结果的大小[-1, 1],也可以计算两个向量在方向上有多接近(计算光照会用)
cross product叉乘
-
叉乘结果和原本的两个向量都垂直(垂直于a, b的平面)
-
右手定则。计算a和b的叉积,就用四指摆成从a旋转到b的方向,大拇指的方向就是叉积方向
根据右手定则,也可以注意到叉积不满足交换律。
-
叉积的一个重要作用是计算坐标系。
-
另一个重要应用是判断左右和内外。
如图,若叉乘结果为正,例如a叉乘b,则b位于a的右侧(右手定则);而b叉乘a,结果为负,则a位于b的左侧。
如图,如果p在三角形内部,则 A B × A P , B C × B P , C A × C P AB \times AP, BC \times BP, CA \times CP AB×AP,BC×BP,CA×CP应该同向,否则P点就会在三角形外。这个操作是光栅化的基础(遍历位于三角形内的图元)
对于正好卡在边上的点,是否包含在三角形里看自己意愿,都可以
单位正交基
对于单位正交基,拆分p在该方向上的投影可以直接用 p ⋅ u = ∣ ∣ p ∣ ∣ cos θ \bold p \cdot \bold u = ||\bold p ||\cos\theta p⋅u=∣∣p∣∣cosθ获取长度,再乘单位基就是该方向上的投影。
矩阵(Matrices)
矩阵在图形学中最大的应用是表示变换transform
最常用的操作是矩阵乘积,两个矩阵可乘的前提是 ( M × N ) ( N × P ) (M \times N)(N \times P) (M×N)(N×P),前一个的列数等于第二个的行数(或者说中间必须相同);需要算第i行第j列就找第一个的i行乘第二个的j列。
矩阵不满足交换率。但结合律很好用。
矩阵乘向量
向量为列向量,矩阵乘向量是变换的核心。
转置
单位矩阵 & 逆
向量乘积转成矩阵形式(反称矩阵)
叉乘转矩阵在旋转变换(Rotation)很有用。
反称矩阵补充
反称矩阵是满足 A T = − A A^T = -A AT=−A的矩阵,即矩阵的转置等于矩阵的负数。
反称矩阵的特征是主对角线元素全为0,而两侧元素反号。
反称矩阵的一个应用是表示向量的叉积,下面是一个例子
设
a
=
(
a
1
,
a
2
,
a
3
)
和
b
=
(
b
1
,
b
2
,
b
3
)
是两个三维向量,那么它们的叉积可以写成:
a
×
b
=
∣
i
j
k
a
1
a
2
a
3
b
1
b
2
b
3
∣
=
[
a
2
b
3
−
a
3
b
2
a
3
b
1
−
a
1
b
3
a
1
b
2
−
a
2
b
1
]
其中
i
,
j
,
k
是三个单位向量。我们可以注意到结果向量是对
b
进行线性变换的结果,所以将
b
提取出来
a
×
b
=
[
0
−
a
3
a
2
a
3
0
−
a
1
−
a
2
a
1
0
]
[
b
1
b
2
b
3
]
其中第一个矩阵就是反称矩阵,因为它满足
A
T
=
−
A
。
设 \bold{a} = (a_1, a_2, a_3) 和 \bold{b} = (b_1, b_2, b_3) 是两个三维向量,那么它们的叉积可以写成: \newline \bold{a}\times\bold{b} =\left| \begin{array}{} \bold{i} & \bold{j} & \bold{k}\\ a_1 & a_2 & a_3\\b_1 &b_2&b_3 \end{array} \right| = \left[ \begin{array}{} a_2b_3 - a_3b_2 \\ a_3b_1 - a_1b_3 \\ a_1b_2 - a_2b_1 \end{array} \right] \newline\newline 其中 \bold{i},\bold{j},\bold{k} 是三个单位向量。我们可以注意到结果向量是对b进行线性变换的结果,所以将b提取出来 \newline \bold{a}\times\bold{b} =\begin{bmatrix} 0 & -a_3 & a_2\\ a_3 & 0 & -a_1\\-a_2&a_1&0 \end{bmatrix}\begin{bmatrix} b_1\\ b_2\\ b_3 \end{bmatrix} \newline 其中第一个矩阵就是反称矩阵,因为它满足 A^T = -A 。
设a=(a1,a2,a3)和b=(b1,b2,b3)是两个三维向量,那么它们的叉积可以写成:a×b=
ia1b1ja2b2ka3b3
=
a2b3−a3b2a3b1−a1b3a1b2−a2b1
其中i,j,k是三个单位向量。我们可以注意到结果向量是对b进行线性变换的结果,所以将b提取出来a×b=
0a3−a2−a30a1a2−a10
b1b2b3
其中第一个矩阵就是反称矩阵,因为它满足AT=−A。
叉积写成行列式那一步,等价于 ( a 1 i + a 2 j + a 3 k ) × ( b 1 i + b 2 j + b 3 k ) (a_1i + a_2j + a_3k) \times (b_1i + b_2j + b_3k) (a1i+a2j+a3k)×(b1i+b2j+b3k),根据叉乘的分配结合律可以展开。