首页 > 代码库 > 差乘积

差乘积

译自:http://www.lighthouse3d.com/tutorials/maths/vector-cross-product/

 

      两个向量差乘积得到一个特殊的向量,这个向量指向于(就是垂直)两个向量确定的平面。假设向量v1,v2在XZ平面上,假设v1到v2是逆时针方向的话,那么差乘积向量方向向上,反之方向向下。差乘积可以使用于许多方面,光照计算或者计算向量之间的夹角。

 crossproduct

下面的等式展示了计算v1和v2差乘积v的必要步骤。差乘积通常用符号“X”来表示。

v = v1 x v2    v = [vx,vy,vz] where,        vx = v1y * v2z - v1z * v2y        vy = v1z * v2x - v1x * v2z        vz = v1x * v2y - v1y * v2x

需要注意的是差乘积不符合交换律,事实上它是交换后取反的。下面是差乘积的一些特性:

v1 x v2 = - (v2 x v1)    k * (v1 x v2) = v1 x (k*v2) = (k*v1) x v2    v1 x (v2 + v3) = (v1 x v2) + (v1 x v3)

差乘积向量的长度和差乘向量v1,v2的长度,以及它们的夹角sine值成比例关系。

|v| = |v1| |v2| * sin(a)

上面sin里面的a是向量v1,v2的夹角。在下面的公式中,差乘积可以用来计算两个向量夹角的sine值(内积计算两个向量的cosines值)差乘积可以定义成C语言中的宏:

#define crossProduct(a,b,c) \    (a)[0] = (b)[1] * (c)[2] - (c)[1] * (b)[2];     (a)[1] = (b)[2] * (c)[0] - (c)[2] * (b)[0];     (a)[2] = (b)[0] * (c)[1] - (c)[0] * (b)[1];

差乘积