【笔记】向量与矩阵

165 阅读3分钟

笔记而已。。。

向量

写作:a\vec{a}a\mathbf{a},前一种是物理或手写方式,后一种是数学方式。

向量的长度(模):x2+y2+z2\sqrt{x^2+y^2+z^2}
  • 写作: a\mid\mid\vec{a}\mid\mida\mid\mid\mathbf{a}\mid\mid

单位向量:
  • 长度为1的向量
  • 归一化:
a^=aa\hat{a} = \frac{\mathbf{a}}{\mid\mid\mathbf{a}\mid\mid}

向量的加法:
  • c\vec{c} = a\vec{a} + b\vec{b}
  • 有平行四边形与首尾相连2种方式

向量的点乘(也叫做内积数量积):
  • 两两相乘之后求和的操作,结果是一个标量
  • (三维)用代数的方式表示:
ab=axbx+ayby+azbz\mathbf{a} \cdot \mathbf{b} = a_x b_x + a_y b_y + a_z b_z
  • 用夹角的方式表示:
ab=abcosθ\mathbf{a} \cdot \mathbf{b} = \mid\mid\mathbf{a}\mid\mid \cdot\mid\mid\mathbf{b}\mid\mid \cos\theta

其中:

  • θ\theta 为两向量夹角;
  • a\mid\mid\mathbf{a}\mid\midb\mid\mid\mathbf{b}\mid\mid 分别为向量的模长;
  • cosθ\cos\theta 表示方向相似性:
    • cosθ=1\cos\theta = 1:同方向;
    • cosθ=0\cos\theta = 0:垂直(正交);
    • cosθ=1\cos\theta = -1:反方向。
  • 满足以下性质:
  1. 交换律ab=ba\mathbf{a} \cdot \mathbf{b} = \mathbf{b} \cdot \mathbf{a}
  2. 分配律a(b+c)=ab+ac\mathbf{a} \cdot (\mathbf{b} + \mathbf{c}) = \mathbf{a} \cdot \mathbf{b} + \mathbf{a} \cdot \mathbf{c}
  3. 与模长的关系aa=a2\mathbf{a} \cdot \mathbf{a} = \mid\mid\mathbf{a}\mid\mid^2(向量模长平方);
  4. 正交性判断:若ab=0\mathbf{a} \cdot \mathbf{b} = 0,则两向量垂直。
  • 应用场景
    1. 向量a\mathbf{a}b\mathbf{b}方向的投影长度(标量)

      投影长度=abb\text{投影长度} = \frac{\mathbf{a} \cdot \mathbf{b}}{\mid\mid\mathbf{b}\mid\mid}
    2. 向量a\mathbf{a}b\mathbf{b}方向的投影向量

      projba=(abb2)b\text{proj}_{\mathbf{b}} \mathbf{a} = \left( \frac{\mathbf{a} \cdot \mathbf{b}}{\mid\mid\mathbf{b}\mid\mid^2} \right) \mathbf{b}
    3. 几何图形分析

      • 判断三角形夹角;
      • 计算平行四边形面积(结合叉乘);
    4. 计算机图形学

      • 光照模型中的明暗计算;
      • 表面法线方向检测;

向量的叉乘

1. 代数定义 向量叉乘(叉积、外积)的代数公式为:

  • 三维向量(结果是ab\mathbf{a}\mathbf{b}所在平面的法向量,满足右手法则)
    a=(ax,ay,az)\mathbf{a} = (a_x, a_y, a_z)b=(bx,by,bz)\mathbf{b} = (b_x, b_y, b_z),则叉乘结果为:
    a×b=(aybzazby,azbxaxbz,axbyaybx)\mathbf{a} \times \mathbf{b} = (a_y b_z - a_z b_y, a_z b_x - a_x b_z, a_x b_y - a_y b_x)
    • 叉乘后的法向量的模长公式为:
a×b=absinθ\mid\mid\mathbf{a} \times \mathbf{b}\mid\mid = \mid\mid\mathbf{a}\mid\mid \cdot \mid\mid\mathbf{b}\mid\mid \sin\theta

2. 几何解释:

  • sinθ\sin\theta 表示方向垂直性:
    • sinθ=1\sin\theta = 1:两向量垂直;
    • sinθ=0\sin\theta = 0:两向量平行。

3. 三角形的面积公式: S=a×b2S = \frac{\mid\mid\mathbf{a} \times \mathbf{b}\mid\mid}{2}

4. 重要性质

  1. 反交换律a×b=b×a\mathbf{a} \times \mathbf{b} = -\mathbf{b} \times \mathbf{a}
  2. 分配律a×(b+c)=a×b+a×c\mathbf{a} \times (\mathbf{b} + \mathbf{c}) = \mathbf{a} \times \mathbf{b} + \mathbf{a} \times \mathbf{c}
  3. 与模长的关系a×b\mid\mid\mathbf{a} \times \mathbf{b}\mid\mid 表示两向量张成的平行四边形面积;
  4. 正交性判断:若 a×b=0\mathbf{a} \times \mathbf{b} = \mathbf{0},则两向量平行。

4. 应用场景

  1. 几何图形分析
    • 计算平行四边形或三角形的面积;
    • 判断两向量是否平行或垂直;
  2. 计算机图形学
    • 计算表面法线方向(用于光照和渲染);
    • 判断物体的碰撞方向。

矩阵

向量与矩阵

在图形学中,GLM 库提供了多种数学运算的封装,以下从 ​术语分类 和 ​GLM 库实现 两个维度完整梳理所有相关运算:


一、术语分类与数学定义

1. ​点乘(点积/内积/标量积)​
  • 数学定义
    ab=axbx+ayby+azbz\mathbf{a} \cdot \mathbf{b} = a_x b_x + a_y b_y + a_z b_z
    结果为标量,反映向量方向相似性及夹角余弦值。
  • 别名统一
    “点乘”与“点积”“内积”“标量积”为同一概念的不同表述,均指代上述运算。
2. ​叉乘(叉积/外积/向量积)​
  • 数学定义
    a×b=(aybzazby, azbxaxbz, axbyaybx)\mathbf{a} \times \mathbf{b} = (a_y b_z - a_z b_y,\ a_z b_x - a_x b_z,\ a_x b_y - a_y b_x)
    结果为垂直于原向量平面的新向量。
  • 别名统一
    “叉乘”与“叉积”“外积”“向量积”为同一运算的不同术语。
3. ​矩阵乘法(普通乘法*)​
  • 数学定义
    矩阵乘法需满足前列数等于后行数,结果矩阵元素为行乘列累加:
    Cij=kAikBkjC_{ij} = \sum_{k} A_{ik} B_{kj}
    用于组合线性变换(如平移、旋转、缩放)。
  • 存储顺序
    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*缩放、亮度调整

四、注意事项

  1. 矩阵乘法顺序:GLM 中矩阵乘法顺序遵循 ​从右向左应用变换,例如 translation * rotation 表示先旋转后平移。
  2. 列主序存储:矩阵按列存储,与 OpenGL 默认规范一致,传入着色器时无需转置。
  3. 四元数运算:GLM 支持四元数旋转(glm::quat),避免万向节死锁,适合平滑插值。

如需进一步了解 GLM 的几何计算(如射线相交测试、法线生成),可参考其文档或实际项目中的高级应用。