叉乘,其实首先在笛卡而空间中认识它,假设C = cross( A, B ), 而A = ( x0 , y0, z0 ), B = ( x1, y1, z1 ),那么A,B的叉乘就是等于C = ( y0 * z1 - y1 * z0, x1 * z0 - x0 * z1, x0 * y1 - y0 * x1 ),我们要清楚,此时的叉乘是独立于任何坐标系的.
为什么呢?我们把坐标系表示成( E, D, U, R ), E表示原点,X,Y,Z分别表示坐标系的轴,约定把右手规则施加给这个坐标系,那么
A = x0D + y0U + z0R, B = x1D + y1U + z1R
则C = ( y0 * z1 - y1 * z0)D + (x1 * z0 - x0 * z1)U+ ( x0 * y1 - y0 * x1)R,
又,我们把把坐标系表示成( E, R, U, D ), 由于我们把左手定则施加给了( E, X, Y, Z ),那么它必然是基于右手定则的坐标系.那么
A = z0R + x0U+ y0D , B = z1R + x1U + y1D;
则C = ( x0 * y1 - y0 * x1)R + ( x1 * z0 - x0 * z1)U + ( y0 * z1 - y1 * z0)D;
有没有发现左手坐标系与右手坐标系的叉乘后的C是相等的,呵呵,从这里我们可以确定,抛开具体的坐标系,叉乘的结果是相等的.
但是如果我们把A,B具体化,在坐标系( E, D, U, R )中,假设:
A = D =( 1, 0, 0 ), B = U = ( 0, 1, 0 ), R = ( 0, 0, 1 )那么
C = ( 0 * 0 - 1 * 0)D + ( 1 * 0 - 0 * 0 )U+ ( 1 * 1 - 0 * 0)R = ( 0, 0, 1 ) = R
cross( D, U ) = R;
而在坐标系( E, R, U, D ),中,可得
A = R =( 0, 0, 1 ), B = U = ( 0, 1, 0 ), D = ( 1, 0, 0 )那么
C = ( 0 * 1 - 0 * 0)R + ( 1 * 0 - 1 * 0)U + ( 0 *0 - 1 * 1)D = ( -1, 0, 0 ) = -D
cross( R, U ) = -D;
大家可以看到,右手坐标系的叉乘与左手坐标系的叉乘是完全不一样的, 也就是说当我们提到叉乘时,我们一般认为它独立于任何坐标系,而只有当具体到某个类型的坐标系,我们才关心,叉乘后的结果是指向哪个方向的( 右手顶则适用~~ )
另外,我们可以简单的认为,在坐标系( E, U0, U1, U2 )中,如果
cross( U0, U1 ) = U2,属于右手坐标系
cross( U0, U1 ) = -U2,属于左手坐标系
最后需要注意的是,在DX中的方法D3DXVec3Cross,实际上是对笛卡而空间的向量做叉乘,也就是说你不用去关心叉乘后向量C的方向了,它是Cross( A, B ) = C,而不会是Cross( A, B ) = -C,因为这个方法并没有关心具体坐标系,而是单纯的使用C = ( y0 * z1 - y1 * z0, x1 * z0 - x0 * z1, x0 * y1 - y0 * x1 ),可以自己去DX中验证.
Enjoy!!