向量与矩阵基础知识笔记
向量
1. 点乘(Dot Product)
- 点乘可以用来判断两个向量是否正交(即两向量成直角)或平行。
- 通过点乘结果,可以计算两个非单位向量的夹角。具体方法是:点乘的结果除以两个向量长度的乘积,得到的就是夹角的余弦值(cosθ)。
cosθ=∥a∥∥b∥a⋅b
2. 叉乘(Cross Product)
- 叉乘只在三维空间(3D)中有定义。
- 叉乘需要两个不平行的向量作为输入,结果是一个正交于这两个向量的新向量。
- 如果输入的两个向量本身就正交,则叉乘后会得到三个互相正交的向量。
a×b=aybz−azbyazbx−axbzaxby−aybx
矩阵
- 矩阵的每一项称为元素(Element)。
- 矩阵通过 (i, j) 进行索引,i 表示行,j 表示列。例如,2×3 的矩阵有2行3列,称为“2×3矩阵”或矩阵的维度(Dimension)。
- 注意:与2D图像索引的(x, y)顺序相反,矩阵中获取元素4的索引是(2, 1)(第二行,第一列)。
矩阵与向量的乘法
1. 缩放(Scaling)
- 缩放是指改变向量的长度,但保持方向不变。
- 在2D或3D中,分别对每个轴(x、y、z)进行缩放。例如,可以定义一个缩放向量(S1, S2, S3),每个分量对应一个轴。
- OpenGL中,3D缩放时,2D的z轴可以设为1,保证z轴数值不变。
- 非均匀缩放:各轴缩放因子不同;均匀缩放:所有轴缩放因子相同。
- 缩放矩阵可表示为:
sx0000sy0000sz00001xyzw=sxxsyyszzw
2. 位移(Translation)
- 位移是指将原始向量加上另一个向量,从而获得一个新位置的向量。
- 在4×4矩阵中,位移值位于第四列最上面的三个位置。如果位移向量为(Tx, Ty, Tz),则位移矩阵可定义为:
100001000010txtytz1xyzw=x+txwy+tywz+tzww
- 位移需要用到向量的w分量(齐次坐标),否则无法实现。
- 3×3矩阵无法实现位移操作,因为没有足够的空间存放位移值。
齐次坐标(Homogeneous Coordinates)
向量的w分量称为齐次坐标。
从齐次向量还原3D向量时,需要将x、y、z分别除以w。
齐次坐标的优点:允许在3D向量上进行位移。
如果w=0,则该向量为方向向量(不能位移)。
3. 旋转(Rotation)
- 2D或3D空间中的旋转通过角度表示,可用角度制或弧度制。360°=2π弧度。
- 常用角度与弧度互转公式:
-
- 弧度转角度:角度 = 弧度 × (180.0f / π)
- 角度转弧度:弧度 = 角度 × (π / 180.0f)
- π ≈ 3.14159265359
- 3D旋转需指定一个旋转轴和一个角度。旋转矩阵根据旋转轴不同而不同,记作θ:
-
10000cosθsinθ00−sinθcosθ00001xyzw=xcosθy−sinθzsinθy+cosθzw
cosθ0−sinθ00100sinθ0cosθ00001xyzw=cosθx+sinθzy−sinθx+cosθzw
cosθsinθ00−sinθcosθ0000100001xyzw=cosθx−sinθysinθx+cosθyzw
4. 矩阵组合(Matrix Composition)
- 矩阵变换的强大之处在于,可以将多个变换通过矩阵乘法组合成一个矩阵。
- 注意:矩阵乘法不满足交换律,顺序很重要。
-
- 乘法顺序:最右边的矩阵先与向量相乘,推荐从右向左理解。
- 通常建议:先缩放→再旋转→最后位移,否则变换效果会互相影响。
100001000010txtytz1cosθsinθ00−sinθcosθ0000100001sx0000sy0000sz00001=sxcosθsxsinθ00−sysinθsycosθ0000sz0txtytz1
GLM 简介
- GLM(OpenGL Mathematics)是一个仅包含头文件的数学库,无需链接和编译,只需包含头文件即可。
- 从0.9.9版本起,GLM矩阵类型默认初始化为零矩阵(所有元素为0),而不是单位矩阵(对角线为1,其余为0)。
-
- 如果使用0.9.9及以上版本,建议初始化方式为:glm::mat4 mat = glm::mat4(1.0f);
- 在GLSL中,矩阵可以直接作为mat4类型uniform变量传递给着色器。例如,在顶点着色器中用矩阵uniform乘以位置向量。
GLM三种主要变换操作
- 缩放变换:
glm::mat4 scale(glm::mat4 const& m, glm::vec3 const& v);
- 旋转变换:
glm::mat4 rotate(glm::mat4 const& m, float angle, glm::vec3 const& axis);
- 平移变换:
glm::mat4 translate(glm::mat4 const& m, glm::vec3 const& v);
| | | | |
|---|
| 函数名 | 第一个参数 | 第二个参数 | 第三个参数 | 返回值 |
| translate | glm::mat4 | glm::vec3 | - | glm::mat4 |
| rotate | glm::mat4 | float(角度) | glm::vec3(轴) | glm::mat4 |
| scale | glm::mat4 | glm::vec3 | - | glm::mat4 |