GAMES101-现代计算机图形学入门-闫令琪
LECTURE-2 线性代数简单总结 复习下基础
向量的点乘 1 2 3 4 5 6 7 8 9 10 if (dot (v1, v2) > 0 ) { float angle = acos (dot (v1, v2) / (v1.l ength() * v2.l ength())); } else { float angle = acos (-dot (v1, v2) / (v1.l ength() * v2.l ength())); }
向量的叉乘 新向量方向的判断 右手螺旋定则 如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}$
[{"url":"https://lstyimgbed.cn/PicGo/6c8e53ebd45a2bd36600ded4b841e3b90a8be6d3.jpg","alt":"","title":""}]
镜像变换
$\begin{bmatrix} x' \\ y' \end{bmatrix}$ = $\begin{bmatrix} -1 & 0 \\ 0 & -1 \end{bmatrix}$ $\begin{bmatrix} x \\ y \end{bmatrix}$
[{"url":"https://lstyimgbed.cn/PicGo/511aa12b1fa2b6ab90eef477f0831dab03cdbe05.jpg","alt":"","title":""}]
错切变换 对于图片来说每个点的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}$
[{"url":"https://lstyimgbed.cn/PicGo/cuoqiebianhuan.jpg","alt":"","title":""}]
旋转变换 默认绕(0,0)转,默认逆时针旋转
$R_\theta$ = $\begin{bmatrix}\cos \theta & -\sin \theta \\sin \theta & \cos \theta\end{bmatrix}$
[{"url":"https://lstyimgbed.cn/PicGo/xuanzhuan.jpg","alt":"","title":""}]
公式推导
[{"url":"https://lstyimgbed.cn/PicGo/gongshi.jpg","alt":"","title":""}]
[{"url":"https://lstyimgbed.cn/PicGo/gongshi2.jpg","alt":"","title":""}]
如果用一个矩阵乘以输入可以得到输出的坐标,那么称这个变换叫线性变换
平移变换 平移可以写成
x = x + tx
y = y + ty
矩阵如图,无法写成线性变换的样子,为了解决平移这个特例,人们引入`齐次坐标`
齐次坐标
[{"url":"https://lstyimgbed.cn/PicGo/qicizuobiao1.jpg","alt":"","title":""}]
[{"url":"https://lstyimgbed.cn/PicGo/qicizuobiao2.jpg","alt":"","title":""}]
2D变换的齐次坐标形式
[{"url":"https://lstyimgbed.cn/PicGo/2Dqicizuobiao.jpg","alt":"","title":""}]
三维变换 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)
$\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$