【笔记】glm中有关向量与矩阵的3种乘法

553 阅读4分钟

点乘 (dot)

点乘是两个向量之间的运算,结果是一个标量(单个数值)。

auto mRes0 = glm::dot(glm::vec3(0.0f0.0f1.0f), glm::vec3(0.0f1.0f0.0f));

点乘的数学含义:

  • 计算公式:a·b = a₁×b₁ + a₂×b₂ + a₃×b₃(注:这里的索引是数学上的123不是程序上的012)

  • 几何意义:a·b = |a|×|b|×cos(θ),其中θ是两个向量之间的夹角

  • 应用场景:

    • 计算两个向量之间的夹角

    • 判断两个向量是否垂直(点乘为0)

    • 计算一个向量在另一个向量方向上的投影长度

    • 光照计算中的漫反射光照强度

叉乘 (cross)

叉乘是两个三维向量之间的运算,结果是一个新的向量,该向量垂直于原来的两个向量所在的平面。

auto mRes1 = glm::cross(glm::vec3(0.0f0.0f1.0f), glm::vec3(0.0f1.0f0.0f));

叉乘的数学含义:

  • 计算公式:a×b = (a₂×b₃-a₃×b₂, a₃×b₁-a₁×b₃, a₁×b₂-a₂×b₁)(注:这里的索引是数学上的123不是程序上的012)

  • 几何意义:

    • 结果向量的方向垂直于a和b所在的平面(右手法则确定方向)

    • 结果向量的长度等于|a|×|b|×sin(θ),也等于以a和b为边的平行四边形的面积

  • 应用场景:

    • 计算垂直于两个向量的法向量

    • 判断点在三角形内外

    • 计算旋转轴

    • 计算面的法线

乘法运算符*在GLM库中, 运算符的行为取决于操作数的类型:

1. 向量与向量相乘

这是逐元素乘法(Hadamard乘积),结果是一个新向量,其中每个元素是原向量对应位置元素的乘积。

glm::vec4 vAdd(1.0f, 2.0f, 3.0f, 4.0f);
glm::vec4 v2(5.0f, 6.0f, 7.0f, 8.0f);
auto mul = vAdd * v2; // 结果: vec4(5.0f, 12.0f, 21.0f, 32.0f)

应用场景:

  • 颜色混合(如将两个颜色向量相乘)

  • 缩放效果(如将一个向量的各个分量按不同比例缩放)

  • 某些着色器计算中的逐元素操作

特性:

  • 满足交换律:a * b = b * a

  • 两个向量必须维度相同

2. 矩阵与矩阵相乘

这是标准的矩阵乘法,遵循线性代数中的矩阵乘法规则。

glm::mat4 mTrans = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f, 0.0f, 0.0f));
glm::mat4 mScale = glm::scale(glm::mat4(1.0f), glm::vec3(2.0f, 2.0f, 2.0f));
auto result = mTrans * mScale; // 结果是一个新的4x4矩阵

数学含义:

  • 这是标准的矩阵乘法,遵循线性代数规则

  • 对于两个矩阵A(m×n)和B(n×p),结果是一个m×p矩阵C。(注:必须是A的列数与B的行数相同)

  • 公式:C[i,j] = ∑(k=1 to n) A[i,k] × B[k,j]

应用场景:

  • 组合多个变换(如先缩放再平移)

  • 坐标系转换

  • 复杂的空间变换

特性:

  • 不满足交换律:A * B ≠ B * A(顺序很重要!)

  • 满足结合律:(A * B) * C = A * (B * C)

  • 矩阵A的列数必须等于矩阵B的行数

3. 矩阵与向量相乘

这里是矩阵与矩阵相乘,但在图形学中常用于变换操作。当矩阵与向量相乘时,表示对向量应用线性变换。

glm::mat4 transform = glm::rotate(glm::mat4(1.0f), glm::radians(45.0f), glm::vec3(0.0f, 0.0f, 1.0f));
glm::vec4 position(1.0f, 0.0f, 0.0f, 1.0f);
auto transformedPosition = transform * position; // 结果是一个变换后的向量

数学含义:

  • 这是将向量视为列向量,应用线性变换

  • 可以看作是矩阵乘法的特例,其中一个矩阵是n×1的列向量

  • 公式:(M * v)ᵢ = ∑(j=1 to n) M[i,j] × v[j]

应用场景:

  • 对顶点应用变换(平移、旋转、缩放)

  • 坐标系转换(如从模型空间到世界空间)

  • 投影变换(如从3D空间投影到2D屏幕)

特性:

  • 向量必须被视为列向量(在GLM中)

  • 矩阵的列数必须等于向量的维度

  • 结果是一个与矩阵行数相同维度的向量

三者的主要区别

  1. 结果类型:
  • dot:返回标量(单个数值)

  • cross:返回向量(仅适用于三维向量)

  • *:根据操作数类型返回向量或矩阵

  1. 几何意义:
  • dot:测量两个向量的相似度或一个向量在另一个向量方向上的投影

  • cross:创建垂直于两个输入向量的新向量

  • *:应用线性变换(矩阵乘法)或逐元素乘法(向量乘法)

  1. 应用场景:
  • dot:光照计算、投影计算、相似度计算

  • cross:法线计算、构建坐标系

  • :组合多个变换、应用变换到顶点

在图形编程中,这三种运算都非常重要,它们共同构成了3D图形数学的基础。