Unity3D中, Vector3.Dot 表示求兩個(gè)向量的點(diǎn)積; Vector3.Cross 表示求兩個(gè)向量的叉積。
點(diǎn)積計(jì)算的結(jié)果為數(shù)值,而叉積計(jì)算的結(jié)果為向量零如。兩者要注意區(qū)別開來。
在幾何數(shù)學(xué)中:
1.點(diǎn)積
點(diǎn)積的計(jì)算方式為:??a·b=|a|·|b|cos??其中|a|和|b|表示向量的模锄弱,表示兩個(gè)向量的夾角考蕾。另外在?點(diǎn)積?中,和 夾角是不分順序的棵癣。
所以通過點(diǎn)積辕翰,我們其實(shí)是可以計(jì)算兩個(gè)向量的夾角的。
另外通過點(diǎn)積的計(jì)算我們可以簡單粗略的判斷當(dāng)前物體是否朝向另外一個(gè)物體: 只需要計(jì)算當(dāng)前物體的transform.forward向量與 (otherObj.transform.position – transform.position)的點(diǎn)積即可狈谊, 大于0則面對,否則則背對著。當(dāng)然這個(gè)計(jì)算也會(huì)有一點(diǎn)誤差河劝,但大致夠用壁榕。
2.叉積
叉積的定義:?c =a x b??其中a,b,c均為向量。即兩個(gè)向量的叉積得到的還是向量赎瞎!
性質(zhì)1:?c⊥a牌里,c⊥b,即向量c垂直與向量a,b所在的平面?务甥。
性質(zhì)2:?模長|c|=|a||b|sin
性質(zhì)3:?滿足右手法則?牡辽。從這點(diǎn)我們有axb ≠ bxa,而axb = – bxa敞临。所以我們可以使用叉積的正負(fù)值來判斷向量a态辛,b的相對位置,即向量b是處于向量a的順時(shí)針方向還是逆時(shí)針方向挺尿。
根據(jù)上面的性質(zhì)2奏黑,我們也同樣的可以計(jì)算出兩個(gè)向量的夾角。
下面是示例代碼:
usingUnityEngine;usingSystem.Collections;publicclassMainScript : MonoBehaviour
{//向量aprivateVector3 a;//向量bprivateVector3 b;voidStart ()
{//向量的初始化a =newVector3 (1,2,1);
b=newVector3 (5,6,0);
}voidOnGUI ()
{//點(diǎn)積的返回值floatc =Vector3.Dot (a, b);//向量a,b的夾角,得到的值為弧度编矾,我們將其轉(zhuǎn)換為角度熟史,便于查看!floatangle = Mathf.Acos (Vector3.Dot (a.normalized, b.normalized)) *Mathf.Rad2Deg;
GUILayout.Label ("向量a窄俏,b的點(diǎn)積為:"+c);
GUILayout.Label ("向量a蹂匹,b的夾角為:"+angle);//叉積的返回值Vector3 e =Vector3.Cross (a, b);
Vector3 d=Vector3.Cross (b, a);//向量a,b的夾角,得到的值為弧度,我們將其轉(zhuǎn)換為角度凹蜈,便于查看怒详!angle = Mathf.Asin (Vector3.Distance (Vector3.zero, Vector3.Cross (a.normalized, b.normalized))) *Mathf.Rad2Deg;
GUILayout.Label ("向量axb為:"+e);
GUILayout.Label ("向量bxa為:"+d);
GUILayout.Label ("向量a,b的夾角為:"+angle);
}
}
上面的示例中踪区,我們定義了兩個(gè)向量a和b昆烁。分別求出了他們的點(diǎn)積和叉積,并通過點(diǎn)積和叉積來反過來計(jì)算他們的夾角缎岗。
這里要?說明?的是:
1.?a.normalized??和??b.normalized??表示的是兩個(gè)向量的單位向量, 因?yàn)樵诠嚼锞材幔邢蛄亢湍5某ǎ贸鰜淼慕Y(jié)果就是單位向量传泊,所以我們這里和后面都直接用單位向量來計(jì)算鼠渺,省去不少麻煩。
2.?Mathf.Rad2Deg?表示的是 單位弧度的度數(shù)眷细。詳情請見作者文章:Unity3D之Mathf.Rad2Deg和Mathf.Deg2Rad
3.通過叉積計(jì)算度數(shù)是通過公式?|c|=|a||b|sin?來逆向求值拦盹。|c| 其實(shí)就是叉積的模,換句話說溪椎,也代表著?Vector3.Distance (Vector3.zero, Vector3.Cross (a.normalized, b.normalized))的值普舆。
結(jié)果圖如下: