向量的叉乘

来源:互联网 发布:c语言无符号整型范围 编辑:程序博客网 时间:2024/04/28 23:24

    叉乘,其实首先在笛卡而空间中认识它,假设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!!

原创粉丝点击