点乘 (dot)
点乘是两个向量之间的运算,结果是一个标量(单个数值)。
auto mRes0 = glm::dot(glm::vec3(0.0f, 0.0f, 1.0f), glm::vec3(0.0f, 1.0f, 0.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.0f, 0.0f, 1.0f), glm::vec3(0.0f, 1.0f, 0.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中)
-
矩阵的列数必须等于向量的维度
-
结果是一个与矩阵行数相同维度的向量
三者的主要区别
- 结果类型:
-
dot:返回标量(单个数值)
-
cross:返回向量(仅适用于三维向量)
-
*:根据操作数类型返回向量或矩阵
- 几何意义:
-
dot:测量两个向量的相似度或一个向量在另一个向量方向上的投影
-
cross:创建垂直于两个输入向量的新向量
-
*:应用线性变换(矩阵乘法)或逐元素乘法(向量乘法)
- 应用场景:
-
dot:光照计算、投影计算、相似度计算
-
cross:法线计算、构建坐标系
-
:组合多个变换、应用变换到顶点
在图形编程中,这三种运算都非常重要,它们共同构成了3D图形数学的基础。