GAMES101-现代计算机图形学入门-闫令琪

LECTURE-2 线性代数简单总结

复习下基础

向量的点乘

1
2
3
4
5
6
7
8
9
10
if (dot(v1, v2) > 0) {
// 向量v1和v2指向同一个方向
// 计算向量v1和v2的夹角
float angle = acos(dot(v1, v2) / (v1.length() * v2.length()));
}
else {
// 向量v1和v2指向相反方向
// 计算向量v1和v2的夹角
float angle = acos(-dot(v1, v2) / (v1.length() * v2.length()));
}

向量的叉乘

新向量方向的判断
右手螺旋定则
如a×b=c,四指从a的方向向b的方向握紧,大拇指指向的就是c的方向
向量的叉乘满足结合律
a×(b×c)=(a×b)×c
向量的叉乘满足分配律
a×(b+c)=a×b+a×c
向量的叉乘满足 distributive property
(a+b)×c=a×c+b×c

输入两个向量,输出一个同时垂直与这两个向量的新向量

1
2
3
4
5
Vector3f cross(const Vector3f& v1, const Vector3f& v2) {
return Vector3f(v1.y * v2.z - v1.z * v2.y,
v1.z * v2.x - v1.x * v2.z,
v1.x * v2.y - v1.y * v2.x);
}

叉乘判断左右侧
例:如果a×b的结果为c,c为正,则b在a的左侧,c为负,则b在a的右侧

在三角形中,判断一个点是否在三角形内部
AB×AP > 0 说明P在AB左侧
BC×BP > 0 说明P在BC左侧
CA×CP > 0 说明P在CA左侧
说明点P落在三角形ABC内部

矩阵

矩阵的乘积

1
2
3
4
5
6
7
for (int i = 0; i < rows_A; ++i) {
for (int j = 0; j < cols_B; ++j) {
for (int k = 0; k < cols_A; ++k) {
result[i][j] += A[i][k] * B[k][j];
}
}
}

首先两个矩阵必须要可以相乘
(M x N)(N x P) = (M x P)
第一个矩阵的列==第二个矩阵的行。才能相乘
如:
第一个矩阵M行N列
第二个矩阵N行P列
得到M行P列的新矩阵

矩阵的转置

1
2
3
4
5
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
result[j][i] = matrix[i][j];
}
}

转置的性质
转置的转置等于原矩阵
(A^T)^T = A

矩阵乘向量

1
2
3
4
5
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
result[i] += matrix[i][j] * vector[j];
}
}

性质
A(BxN)x(NxM)= AxB

反对称矩阵

定义
如果一个矩阵A满足A^T = -A,那么这个矩阵就被称为反对称矩阵。
性质
反对称矩阵的特征值都是0
反对称矩阵的特征向量是正交的
构造
将a向量重新组织,变为A这个矩阵,A这个矩阵叫a向量的反对称矩阵(Skew-Symmetric Matrix)
(为什么PPT中写的是DualMatrix(对偶矩阵?)呢?此处的“对偶”并非线性代数中“对偶空间”的标准定义,而是强调向量与叉乘矩阵的等价性。叉乘矩阵可视为向量的一种“对偶表示”,使得几何操作(如旋转)可通过矩阵运算实现。计算机图形学中,这种术语是约定俗成的,目的是直观表达向量与矩阵形式的对应关系)(感谢评论区大佬批评指正)
A*乘以b就是axb的结果
(Lecture4的罗德里格斯旋转公式会用到这个性质)

LECTURE-3 变换矩阵简单总结

变换

缩放变换

$$\begin{bmatrix} S_x & 0 \ 0 & S_y \end{bmatrix}$$

就叫缩放矩阵,与xy点乘得到缩放后的矩阵

$\begin{bmatrix} x' \\ y' \end{bmatrix}$ = $\begin{bmatrix} S_x & 0 \\ 0 & S_y \end{bmatrix}$ $\begin{bmatrix} x \\ y \end{bmatrix}$

镜像变换

$\begin{bmatrix} x' \\ y' \end{bmatrix}$ = $\begin{bmatrix} -1 & 0 \\ 0 & -1 \end{bmatrix}$ $\begin{bmatrix} x \\ y \end{bmatrix}$

错切变换

对于图片来说每个点的y坐标都没变
对于左上角的点来说变化应该是0+a
对于右上角的点来说变化应该是1+a
对于左边中间的点来说变化应该是0+a/2
所以每个点的变化应该是x+ay

$\begin{bmatrix} x' \\ y' \end{bmatrix}$ = $\begin{bmatrix} 1 & a \\ 0 & 1 \end{bmatrix}$ $\begin{bmatrix} x \\ y \end{bmatrix}$

旋转变换

默认绕(0,0)转,默认逆时针旋转

$R_\theta$ = $\begin{bmatrix}\cos \theta & -\sin \theta \\sin \theta & \cos \theta\end{bmatrix}$

公式推导

如果用一个矩阵乘以输入可以得到输出的坐标,那么称这个变换叫线性变换

平移变换

平移可以写成

x = x + tx y = y + ty
矩阵如图,无法写成线性变换的样子,为了解决平移这个特例,人们引入`齐次坐标`

齐次坐标

2D变换的齐次坐标形式

三维变换

3D POINT

(x,y,z,1)^T

3D VECTOR

(x,y,z,0)^T
(x,y,z,w)=(x/w,y/w,z/w,1)

3D TRANSFORMATION

$\begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix}$ = $\begin{bmatrix} a & b & c & t_x \\ d & e & f & t_y \\ g & h & i & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix}$ $\begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}$

还是那个经典问题,变化顺序为先线性变换再旋转

LECTURE-4 变换进阶

旋转$\theta$