ab=(ax *bx)+(ay *by)+(az *bz)
这产生一个标量值,因些dot product也称为scalar product(或者inner product)。根据向量长度的定义,可以使用向量与其自身的点积的平方根来计算向量的长度。 在几何数学中,点积表示了两个向量之间的角度。公式为: a b = ||a||*||b|| * cos(θ)
θ即为向量a和b的夹角。如果向量a和b都已经标准化,点积可以简化为:
a b = cos(θ)
根据这个公式,可以总结如下几点: 如果a b > 0,两个向量的夹角小于90度。 如果a b < 0,两个向量的夹角大于90度。 如果a b = 0,两个向量相互垂直。 在后面的章节中,你会发现点积在计算机图形学中有多种多样的应用。比如,在光照计算中可以用点积来计算照射表面和光源之间的角度。在第二部分,“Shader Authoring with HLSL”将会详细讲解。
Cross Product(叉积)
Cross Product是另一个非常有用的向量运算。两个向量的叉积得到一个与这两个向量都正交的第三个向量。叉积的公式为:
a × b = (ay * bz – az * by, az * bx – ax * bz, ax * by – ay * bx)
叉积可以用于计算一个triangle的法向量(也就是triangle的朝向)。
Matrix
一个m×n矩阵是一个m行,n列的二维数组。比如一个4×1矩阵,有4行1列,一个2×3矩阵有两行3列,如下所示:
在矩阵C中,指出了矩阵中每个元素对应的下标。只有一个单一的行或列的矩阵有时被称为行向量和列向量。具有相同行数和列数的矩阵称为方阵。在3D图形学中,4×4方阵应用最广泛。
Basic Matrix Operations
你可以使用矩阵执行一些基本的算术运算。在向量中,是对两个向量的逐个元素执行加减法。因些两个矩阵必要具有相同的行数和列数才可以做加减法。标量乘法同样是进行逐个元素运算,把标量与矩阵中的每个元素相乘。但是,矩阵的乘法却有点不一样。
Matrix Multiplication
对于矩阵乘法,一个具有n列的矩阵只能和一个具有n行的矩阵相乘。在所得到的矩阵中,每一个元素都是第一个矩阵的行与第二个矩阵对应的列进行dot product计算出来的。如下公式所示,如果把矩阵A的每一行作为行向量,矩阵B的每一列作为列向量,可以定义乘积矩阵元素为:
图2.3 illustrates this process。
图2.3 Matrix multiplication。
如下所示:
矩阵A是一个两行3列的矩阵,矩阵B一个3行两列的矩阵。矩阵B的行数与A的列数相同,因此可以进行矩阵乘法。相乘的结果一个2×3矩阵,计算如下:
需要注意的是矩阵乘法是不满足交换律(不能交换相乘,也无法得到相同的乘积)。事实,一般情况下定义矩阵乘法A * B,对于B * A的情况是没有定义的,比如一个3×3矩阵乘以一个2×3矩阵。
Transposition
矩阵的转置是通过把矩阵的元素依据主对角线反转得到的。对于一个方阵是很容易理解的,如下示例所述:
另外一种转置矩阵的方法是交换矩阵的行和列。这种很容易理解,特别是对于行向量和列向量,或者非方阵。例如:
Row-Major and Column-Major Order
处理矩阵时,必须考虑如何在计算机内存中存储矩阵。Direct3D以行优先的顺序存储矩阵,也就是说如果存储到一段连接内存中,是以一行一行的方式排列在内存中。这也是C语言中多维数组的存储格式。如下示例,是一个2×3矩阵以行优先顺序连接存储的形式: