笔记而已。。。
向量
写作:或,前一种是物理或手写方式,后一种是数学方式。
向量的长度(模):
- 写作: 或
单位向量:
- 长度为1的向量
- 归一化:
向量的加法:
- = +
- 有平行四边形与首尾相连2种方式
向量的点乘(也叫做内积或数量积):
- 两两相乘之后求和的操作,结果是一个标量;
- (三维)用代数的方式表示:
- 用夹角的方式表示:
其中:
- 为两向量夹角;
- 和 分别为向量的模长;
- 表示方向相似性:
- :同方向;
- :垂直(正交);
- :反方向。
- 满足以下性质:
- 交换律:;
- 分配律:;
- 与模长的关系:(向量模长平方);
- 正交性判断:若,则两向量垂直。
- 应用场景
-
向量在方向的投影长度(标量):
-
向量在方向的投影向量:
-
几何图形分析:
- 判断三角形夹角;
- 计算平行四边形面积(结合叉乘);
-
计算机图形学:
- 光照模型中的明暗计算;
- 表面法线方向检测;
-
向量的叉乘
1. 代数定义 向量叉乘(叉积、外积)的代数公式为:
- 三维向量(结果是所在平面的法向量,满足右手法则):
设 ,,则叉乘结果为:- 叉乘后的法向量的模长公式为:
2. 几何解释:
- 表示方向垂直性:
- :两向量垂直;
- :两向量平行。
3. 三角形的面积公式:
4. 重要性质
- 反交换律:;
- 分配律:;
- 与模长的关系: 表示两向量张成的平行四边形面积;
- 正交性判断:若 ,则两向量平行。
4. 应用场景
- 几何图形分析:
- 计算平行四边形或三角形的面积;
- 判断两向量是否平行或垂直;
- 计算机图形学:
- 计算表面法线方向(用于光照和渲染);
- 判断物体的碰撞方向。
矩阵
略
向量与矩阵
在图形学中,GLM 库提供了多种数学运算的封装,以下从 术语分类 和 GLM 库实现 两个维度完整梳理所有相关运算:
一、术语分类与数学定义
1. 点乘(点积/内积/标量积)
- 数学定义:
结果为标量,反映向量方向相似性及夹角余弦值。 - 别名统一:
“点乘”与“点积”“内积”“标量积”为同一概念的不同表述,均指代上述运算。
2. 叉乘(叉积/外积/向量积)
- 数学定义:
结果为垂直于原向量平面的新向量。 - 别名统一:
“叉乘”与“叉积”“外积”“向量积”为同一运算的不同术语。
3. 矩阵乘法(普通乘法*)
- 数学定义:
矩阵乘法需满足前列数等于后行数,结果矩阵元素为行乘列累加:
用于组合线性变换(如平移、旋转、缩放)。 - 存储顺序:
GLM 中矩阵按 列主序(Column-Major) 存储,即矩阵的列在内存中连续排列。例如:glm::mat4 m(1.0f); // 单位矩阵的列依次为 [1,0,0,0], [0,1,0,0], [0,0,1,0], [0,0,0,1]
4. 普通乘法*的其他含义
- 标量乘法:向量/矩阵的每个分量乘以标量,例如
vec3 * float。 - 逐元素乘法(非标准数学操作):两个同维向量/矩阵对应分量相乘,需手动实现或调用特定函数。
二、GLM 库的 C++ 实现
1. 点乘(点积)
#include <glm/glm.hpp>
glm::vec3 a(1.0f, 2.0f, 3.0f);
glm::vec3 b(4.0f, 5.0f, 6.0f);
float dot = glm::dot(a, b); // 计算结果:1 * 4 + 2 * 5 + 3 * 6 = 32
2. 叉乘(叉积)
glm::vec3 cross = glm::cross(a, b); // 结果向量:(2 * 6-3 * 5, 3 * 4-1 * 6, 1 * 5-2 * 4) = (-3, 6, -3)
3. 矩阵乘法
glm::mat4 m1 = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f, 2.0f, 3.0f)); // 平移矩阵
glm::mat4 m2 = glm::rotate(glm::mat4(1.0f), glm::radians(45.0f), glm::vec3(0.0f, 1.0f, 0.0f)); // 旋转矩阵
glm::mat4 combined = m1 * m2; // 先旋转后平移(矩阵乘法顺序为从右向左)
4. 标量乘法
glm::vec3 scaled = a * 2.0f; // 结果向量:(2.0f, 4.0f, 6.0f)
5. 生成变换矩阵
// 平移、旋转、缩放矩阵
glm::mat4 translation = glm::translate(glm::mat4(1.0f), glm::vec3(2.0f, 0.0f, 0.0f));
glm::mat4 rotation = glm::rotate(glm::mat4(1.0f), glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f));
glm::mat4 scaling = glm::scale(glm::mat4(1.0f), glm::vec3(2.0f));
三、核心区别总结
| 运算类型 | 输入 | 输出 | GLM 函数/操作符 | 应用场景 |
|---|---|---|---|---|
| 点乘(点积) | 两个向量 | 标量 | glm::dot(a, b) | 投影计算、光照强度 |
| 叉乘(叉积) | 两个三维向量 | 向量 | glm::cross(a, b) | 法向量生成、坐标系构建 |
| 矩阵乘法 | 两个矩阵 | 矩阵 | operator* | 坐标变换组合(MVP 矩阵) |
| 标量乘法 | 向量/矩阵 + 标量 | 向量/矩阵 | operator* | 缩放、亮度调整 |
四、注意事项
- 矩阵乘法顺序:GLM 中矩阵乘法顺序遵循 从右向左应用变换,例如
translation * rotation表示先旋转后平移。 - 列主序存储:矩阵按列存储,与 OpenGL 默认规范一致,传入着色器时无需转置。
- 四元数运算:GLM 支持四元数旋转(
glm::quat),避免万向节死锁,适合平滑插值。
如需进一步了解 GLM 的几何计算(如射线相交测试、法线生成),可参考其文档或实际项目中的高级应用。