除了正常的加减乘除以外,向量的最常见的三个运算是点积、叉积、正交基。

对于向量的乘法和除法要做一下说明,因为除发的效率要远低于乘法,因此会将除法尽可能的化为乘法来实现。比如我们要对向量缩放一半,则可以除以2,也可以乘以0.5,则尽量要以乘以0.5来实行。

【向量定义】

对于【数学】向量的四则运算、点积、叉积、正交基维向量来说,有【数学】向量的四则运算、点积、叉积、正交基个相互垂直的正交基 {【数学】向量的四则运算、点积、叉积、正交基},那么一个独立的【数学】向量的四则运算、点积、叉积、正交基维标量集{【数学】向量的四则运算、点积、叉积、正交基}和此正交基存在一个线性组合【数学】向量的四则运算、点积、叉积、正交基,则【数学】向量的四则运算、点积、叉积、正交基就是一个【数学】向量的四则运算、点积、叉积、正交基维向量。

这里面有一点要注意,只要有正交基,则可以在基上定义向量。比如经常的局部坐标系就是要求其正交基在其上定义局部坐标,比如这篇文章就求了相机坐标的局部坐标系的正交基:【OptiX】第1个示例 光线生成模块(RayGenerationProgram), 相机操作、添加三角网以及相交丢失模块(Miss Program)

【向量的加减法】

在求解颜色时,我们经常使用到加法,比如漫反射的结果再加上镜面反射的结果是最终的结果等等。这里要理解的一点是当代表颜色时,加法代表两个颜色叠加。比如R(1.0, 0.0, 0.0)+G(1.0, 0.0, 0.0)+B(1.0, 0.0, 0.0)=W(1.0, 1.0, 1.0),结果就是颜色混合的白色。

向量的加法从几何上代表两个向量所围成的平行四边形的对角线:

【数学】向量的四则运算、点积、叉积、正交基

向量的减法代表另一条对角线(【数学】向量的四则运算、点积、叉积、正交基)时,【数学】向量的四则运算、点积、叉积、正交基叫做被减向量,【数学】向量的四则运算、点积、叉积、正交基叫做减向量,记【数学】向量的四则运算、点积、叉积、正交基方向的一个口决是:指向被减向量

【数学】向量的四则运算、点积、叉积、正交基

【向量的点积】

向量点积的定义,拿三维向量来说:

【数学】向量的四则运算、点积、叉积、正交基

这里要注意向量的点积结果是一个数值,而非一个向量。

下面来推导点积的最重要的几何意义公式【数学】向量的四则运算、点积、叉积、正交基其中【数学】向量的四则运算、点积、叉积、正交基是两个向量之间的夹角。当【数学】向量的四则运算、点积、叉积、正交基【数学】向量的四则运算、点积、叉积、正交基都是单位向量时,【数学】向量的四则运算、点积、叉积、正交基 这是图形学界使用频率最高的公式之一。仅对二三维有效。

下面来进行推导:

【数学】向量的四则运算、点积、叉积、正交基,它们的终点分别为【数学】向量的四则运算、点积、叉积、正交基,【数学】向量的四则运算、点积、叉积、正交基

那么,在三角形OAB中,使用余弦定理:

【数学】向量的四则运算、点积、叉积、正交基 其中【数学】向量的四则运算、点积、叉积、正交基【数学】向量的四则运算、点积、叉积、正交基【数学】向量的四则运算、点积、叉积、正交基的夹角。

将A,B,【数学】向量的四则运算、点积、叉积、正交基的值代入后,整理即得【数学】向量的四则运算、点积、叉积、正交基

【向量的叉积】

先看叉积的性质。两个向量的叉积的结果是垂直于这两个向量【数学】向量的四则运算、点积、叉积、正交基【数学】向量的四则运算、点积、叉积、正交基的第三个向量【数学】向量的四则运算、点积、叉积、正交基,它的方向使用右手螺旋定则,长度则为【数学】向量的四则运算、点积、叉积、正交基【数学】向量的四则运算、点积、叉积、正交基所围的平行四边形的面积。

【数学】向量的四则运算、点积、叉积、正交基

【数学】向量的四则运算、点积、叉积、正交基,其中【数学】向量的四则运算、点积、叉积、正交基【数学】向量的四则运算、点积、叉积、正交基【数学】向量的四则运算、点积、叉积、正交基的夹角。

叉乘满足的基本性质如下:

  1. 【数学】向量的四则运算、点积、叉积、正交基,自己与自己的夹角【数学】向量的四则运算、点积、叉积、正交基=0,则【数学】向量的四则运算、点积、叉积、正交基=0,所夹的平行四边形的面积也是0。
  2. 【数学】向量的四则运算、点积、叉积、正交基
  3. 【数学】向量的四则运算、点积、叉积、正交基

再看叉乘在数值计算上的定义:

【数学】向量的四则运算、点积、叉积、正交基

【数学】向量的四则运算、点积、叉积、正交基

【数学】向量的四则运算、点积、叉积、正交基 (展开式一)

先讨论正交基【数学】向量的四则运算、点积、叉积、正交基的运算法则:

【数学】向量的四则运算、点积、叉积、正交基

【数学】向量的四则运算、点积、叉积、正交基

再代入到(展开式一)

【数学】向量的四则运算、点积、叉积、正交基

【数学】向量的四则运算、点积、叉积、正交基

【数学】向量的四则运算、点积、叉积、正交基

【计算正交基】

向量的经常的一个操作是构造正交基,根据一个向量,构建正交基,往往需要用到叉乘。在给定的单位向量【数学】向量的四则运算、点积、叉积、正交基,构建一个与之垂直的向量【数学】向量的四则运算、点积、叉积、正交基,则保证其相互垂直,则【数学】向量的四则运算、点积、叉积、正交基,随手可构造【数学】向量的四则运算、点积、叉积、正交基,再构造【数学】向量的四则运算、点积、叉积、正交基

pbrt-v2的geometry.h的针对向量的定义中有个内联函数用来根据一个输入的向量,计算正交基,输入一个v1,输出v2, 和v3,都是单位向量:

inline void CoordinateSystem(const Vector &v1, Vector *v2, Vector *v3) {
    if (fabsf(v1.x) > fabsf(v1.y)) {
        float invLen = 1.f / sqrtf(v1.x*v1.x + v1.z*v1.z);
        *v2 = Vector(-v1.z * invLen, 0.f, v1.x * invLen);
    }
    else {
        float invLen = 1.f / sqrtf(v1.y*v1.y + v1.z*v1.z);
        *v2 = Vector(0.f, v1.z * invLen, -v1.y * invLen);
    }
    *v3 = Cross(v1, *v2);
}

 

 

相关文章: