差乘积
译自:http://www.lighthouse3d.com/tutorials/maths/vector-cross-product/
两个向量差乘积得到一个特殊的向量,这个向量指向于(就是垂直)两个向量确定的平面。假设向量v1,v2在XZ平面上,假设v1到v2是逆时针方向的话,那么差乘积向量方向向上,反之方向向下。差乘积可以使用于许多方面,光照计算或者计算向量之间的夹角。
下面的等式展示了计算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];