在Unity3D中, Vector3.Dot 表示求兩個向量的點積; Vector3.Cross 表示求兩個向量的叉積。
點積計算的結果為數值,而叉積計算的結果為向量。兩者要注意區別開來。
在幾何數學中:
1.點積
點積的計算方式為: a·b=|a|·|b|cos<a,b> 其中|a|和|b|表示向量的模,<a,b>表示兩個向量的夾角。另外在 點積 中,<a,b>和<b,a> 夾角是不分順序的。
所以通過點積,我們其實是可以計算兩個向量的夾角的。
另外通過點積的計算我們可以簡單粗略的判斷當前物體是否朝向另外一個物體: 只需要計算當前物體的transform.forward向量與 (otherObj.transform.position – transform.position)的點積即可, 大於0則面對,否則則背對着。當然這個計算也會有一點誤差,但大致夠用。
2.叉積
叉積的定義: c =a x b 其中a,b,c均為向量。即兩個向量的叉積得到的還是向量!
性質1: c⊥a,c⊥b,即向量c垂直與向量a,b所在的平面 。
性質2: 模長|c|=|a||b|sin<a,b>
性質3: 滿足右手法則 。從這點我們有axb ≠ bxa,而axb = – bxa。所以我們可以使用叉積的正負值來判斷向量a,b的相對位置,即向量b是處於向量a的順時針方向還是逆時針方向。
根據上面的性質2,我們也同樣的可以計算出兩個向量的夾角。
下面是示例代碼:
using UnityEngine; using System.Collections; public class MainScript : MonoBehaviour { //向量a private Vector3 a; //向量b private Vector3 b; void Start () { //向量的初始化 a = new Vector3 (1, 2, 1); b = new Vector3 (5, 6, 0); } void OnGUI () { //點積的返回值 float c = Vector3.Dot (a, b); //向量a,b的夾角,得到的值為弧度,我們將其轉換為角度,便於查看! float angle = Mathf.Acos (Vector3.Dot (a.normalized, b.normalized)) * Mathf.Rad2Deg; GUILayout.Label ("向量a,b的點積為:" + c); GUILayout.Label ("向量a,b的夾角為:" + angle); //叉積的返回值 Vector3 e = Vector3.Cross (a, b); Vector3 d = Vector3.Cross (b, a); //向量a,b的夾角,得到的值為弧度,我們將其轉換為角度,便於查看! 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); } }
上面的示例中,我們定義了兩個向量a和b。分別求出了他們的點積和叉積,並通過點積和叉積來反過來計算他們的夾角。
這里要 說明 的是:
1. a.normalized 和 b.normalized 表示的是兩個向量的單位向量, 因為在公式里,有向量和模的除法,得出來的結果就是單位向量,所以我們這里和后面都直接用單位向量來計算,省去不少麻煩。
2. Mathf.Rad2Deg 表示的是 單位弧度的度數。詳情請見作者文章: Unity3D之Mathf.Rad2Deg和Mathf.Deg2Rad
3.通過叉積計算度數是通過公式 |c|=|a||b|sin<a,b> 來逆向求值。|c| 其實就是叉積的模,換句話說,也代表着 Vector3.Distance (Vector3.zero, Vector3.Cross (a.normalized, b.normalized))的值。
結果圖如下: