一直以來,我都記不住向量叉乘的結(jié)果,每次都要查詢。其根本原因在于,我沒有去研究過叉乘是如何推導(dǎo)出來的。于是,這次想徹底解決一下。首先要感謝維基百科,它已經(jīng)把所有問題都描述清楚了。
http://en.wikipedia.org/wiki/Cross_product
而下面的文字,只是我的讀書筆記,以加深自己的印象。
首先我們知道 ,對(duì)于向量u和v, u x v的結(jié)果,是得到一個(gè)既垂直于u又垂直于v的向量,假設(shè)記作n.
則有下面公式
n = u x v;
而n的方向,是由右手法則決定的。 即伸出右手,四個(gè)手指方向從u繞到v. 此時(shí),大姆指的方向,就是n的方向。 我們通常叫做右向量。
引用一下維基百科的圖來說明問題,有興趣的兄弟可以照?qǐng)D比劃一下。 (注:圖中向量是用的a x b來表示)
有了上面的知識(shí),我們繼續(xù)向下看。
我們假設(shè)向量 u,v,n分別用三個(gè)標(biāo)量來表示。即
u = (Xu,Yu,Zu)
v = (Xv,Yv,Zv)
n = (Xn,Yn,Zn)
則,它們的關(guān)系為
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);
而為了驗(yàn)證n與u和v的垂直性,可以使用點(diǎn)乘進(jìn)行
點(diǎn)乘法則比這個(gè)簡單多了, u*v = (Xu*Xv + Yu*Yv + Zu*Zv) = dotUV;
如果兩個(gè)向量垂直,則dotUV = 0;
代入驗(yàn)證一把
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;
把正負(fù)號(hào)的因式仔細(xì)比對(duì)一下,發(fā)現(xiàn)剛好可以低消。 結(jié)果為0.
v*n 同理可證。
于是,也驗(yàn)證了n與u,v垂直的特性。
如果只是為了應(yīng)用的話,走到這一步就可以停下了。后面的知識(shí),只是為了滿足一下好奇心。
那我們就來看看,這個(gè)結(jié)論是怎么來的呢? 我們接著來推導(dǎo)。
為了更好地推導(dǎo),我們需要加入三個(gè)軸對(duì)齊的單位向量。
i,j,k.
i,j,k滿足以下特點(diǎn)
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是三個(gè)相互垂直的向量。它們剛好可以構(gòu)成一個(gè)坐標(biāo)系。
這三個(gè)向量的特例就是 i = (1,0,0) j = (0,1,0) k = (0,0,1)。
好,那對(duì)于處于i,j,k構(gòu)成的坐標(biāo)系中的向量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三個(gè)向量的特點(diǎn),所以,最后的結(jié)果可以簡化為
u x v = (Yu*Zv – Zu*Yv)*i + (Zu*Xv – Xu*Zv)j + (Xu*Yv – Yu*Xv)k;
于是,在i,j,k構(gòu)成的坐標(biāo)系中。集就是上面的結(jié)果。
當(dāng)i = (1,0,0) j = (0,1,0) k = (0,0,1)時(shí),我們通常省略i,j,k的寫法。最終也就得到了我們的右向量。
叉乘的意義
叉乘表示垂直于uxv的右向量。
使用的地方
可以通過叉乘,修正向量關(guān)系,從而構(gòu)建坐標(biāo)系。 常見的有 攝相機(jī)矩陣和TBN空間轉(zhuǎn)換矩陣的構(gòu)建。
叉乘的矩陣表示法。
很多書上,包括 3D游戲大師編程技巧 上面,都是用的矩陣表示法來說明叉乘。
如下。
它對(duì)應(yīng)的矩陣表示法為
求其代數(shù)余子式,可以表示為如下
有了這個(gè),那我們合并公因式i,j,k,則可以得到矩陣表示法
到此,叉乘的內(nèi)容基本OK了。 值得說明的是,如果對(duì)方程組表示成矩陣不熟悉,就會(huì)感到不習(xí)慣,但是如果多多練習(xí),我想應(yīng)該是會(huì)習(xí)慣成自然吧。。。