Unity3D之Vector3.Dot和Vector3.Cross的使用


原文鏈接:https://blog.csdn.net/wingfourever/article/details/27714311

在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))的值。
  結果圖如下:
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章