zoukankan      html  css  js  c++  java
  • 三维向量叉乘推导

    一直以来,我都记不住向量叉乘的结果,每次都要查询。其根本原因在于,我没有去研究过叉乘是如何推导出来的。于是,这次想彻底解决一下。首先要感谢维基百科,它已经把所有问题都描述清楚了。

    http://en.wikipedia.org/wiki/Cross_product

    而下面的文字,只是我的读书笔记,以加深自己的印象。

    首先我们知道 ,对于向量u和v, u x v的结果,是得到一个既垂直于u又垂直于v的向量,假设记作n.

    则有下面公式

    n = u x v;

    而n的方向,是由右手法则决定的。 即伸出右手,四个手指方向从u绕到v. 此时,大姆指的方向,就是n的方向。 我们通常叫做右向量。

    引用一下维基百科的图来说明问题,有兴趣的兄弟可以照图比划一下。 (注:图中向量是用的a x b来表示)

    image

    有了上面的知识,我们继续向下看。

    我们假设向量 u,v,n分别用三个标量来表示。即

    u = (Xu,Yu,Zu)

    v = (Xv,Yv,Zv)

    n = (Xn,Yn,Zn)

    则,它们的关系为

    Xn = Yu*Zv – Zu*Yv;

    Yn = Zu*Xv – Xu*Zv;

    Zn = Xu*Yv – Yu*Xv;

    即 n = (Yu*Zv – Zu*Yv,Zu*Xv – Xu*Zv,Xu*Yv – Yu*Xv);

    而为了验证n与u和v的垂直性,可以使用点乘进行

    点乘法则比这个简单多了, u*v = (Xu*Xv + Yu*Yv + Zu*Zv) = dotUV;

    如果两个向量垂直,则dotUV = 0;

    代入验证一把

    u*n = (Xu*(Yu*Zv – Zu*Yv) + Yu*(Zu*Xv – Xu*Zv) + Zu*(Xu*Yv – Yu*Xv));

          = Xu*Yu*Zv – Xu*Zu*Yv + Yu*Zu*Xv – Yu*Xu*Zv + Zu*Xu*Yv – Zu*Yu*Xv;

    把正负号的因式仔细比对一下,发现刚好可以低消。 结果为0.

    v*n 同理可证。

    于是,也验证了n与u,v垂直的特性。

    如果只是为了应用的话,走到这一步就可以停下了。后面的知识,只是为了满足一下好奇心。

    那我们就来看看,这个结论是怎么来的呢? 我们接着来推导。

    为了更好地推导,我们需要加入三个轴对齐的单位向量。

    i,j,k.

    i,j,k满足以下特点

    i = j x k; j = k x i; k = i x j;

    k x j = –i; i x k = –j; j x i = –k;

    i x i = j x j = k x k = 0; (0是指0向量)

    由此可知,i,j,k是三个相互垂直的向量。它们刚好可以构成一个坐标系。

    这三个向量的特例就是 i = (1,0,0) j = (0,1,0) k = (0,0,1)。

    好,那对于处于i,j,k构成的坐标系中的向量u,v我们可以如下表示

    u = Xu*i + Yu*j + Zu*k;

    v = Xv*i + Yv*j + Zv*k;

    那么 u x v = (Xu*i + Yu*j + Zu*k) x (Xv*i + Yv*j + Zv*k)

                   = Xu*Xv*(ixi) + Xu*Yv*(i x j) + Xu*Zv*(i x k) + Yu*Xv*(j x i) + Yu*Yv*(j x j) + Yu*Zv*(j x k) + Zu*Xv*( k x i ) + Zu*Yv(k x j) + Zu*Zv(k x k)

    由于上面的i,j,k三个向量的特点,所以,最后的结果可以简化为

    u x v = (Yu*Zv – Zu*Yv)*i + (Zu*Xv – Xu*Zv)j + (Xu*Yv – Yu*Xv)k;

    于是,在i,j,k构成的坐标系中。集就是上面的结果。

    当i = (1,0,0) j = (0,1,0) k = (0,0,1)时,我们通常省略i,j,k的写法。最终也就得到了我们的右向量。

    叉乘的意义

      叉乘表示垂直于uxv的右向量。

    使用的地方

      可以通过叉乘,修正向量关系,从而构建坐标系。 常见的有 摄相机矩阵和TBN空间转换矩阵的构建。

    叉乘的矩阵表示法。

    很多书上,包括 3D游戏大师编程技巧 上面,都是用的矩阵表示法来说明叉乘。

    如下。

    image

    它对应的矩阵表示法为

    image

    求其代数余子式,可以表示为如下

    image

    有了这个,那我们合并公因式i,j,k,则可以得到矩阵表示法

    image

    到此,叉乘的内容基本OK了。 值得说明的是,如果对方程组表示成矩阵不熟悉,就会感到不习惯,但是如果多多练习,我想应该是会习惯成自然吧。。。

  • 相关阅读:
    (转)eclipse使用技巧
    smartupload 上传文件时 把页面编码改成gbk 解决乱码
    引入外部js如何通知页面其编码格式
    OGNL表达式中的#、%和$
    javaweb提示框问题
    理解iOS 8中的Self Sizing Cells和Dynamic Type
    淘宝内部的兼容大屏幕iPhone设计流程
    ReactiveCocoa & MVVM 学习总结一
    ReactiveCocoa & MVVM 学习总结二
    Objective-C GCC Code Block Evaluation C Extension ({…})语法
  • 原文地址:https://www.cnblogs.com/qilinzi/p/3068158.html
Copyright © 2011-2022 走看看