Unity3D Vector3.Dot 點乘 與 Vector3.Cross 叉乘

一、點積(又稱“數量積”、“內積”)

    1、理論知識

   在數學中,點積的定義爲a·b=|a|·|b|cos<a,b> 【注:粗體小寫字母表示向量,<a,b>表示向量a,b的夾角,取值範圍爲[0,π]】。從定義上,我們知道向量的點積得到的是一個數值。而不是向量(這點大家要注意了!要與叉積進行區別)。另外點積中的夾角<a,b>沒有順序可言,即<a,b>=<b,a>(或a·b=b·a)。所以我們可以通過點積得到兩個向量之間的夾角。<a,b>= arccos(a·b / (|a|·|b|))。並且通過點積的正負值,我們可以判斷兩個向量的方向關係。如果爲正,即>0,他們夾角爲(0,π/2)。如果爲負,夾角爲(π/2,π)。

   2、Unity3D中應用

   在Unity中,點積表示爲Vector3.Dot(Vector3,Vector3):float——參數爲2個向量,返回值爲浮點型。

using UnityEngine;  
using System.Collections;  
   
public class Vector3_Dot : MonoBehaviour {  
       
    //向量a  
    Vector3 a;  
    //向量b  
    Vector3 b;  
       
    void Start()  
    {  
        //向量的初始化  
        a = new Vector3(3, 0, 0);//x軸方向,長度爲3  
        b = new Vector3(Mathf.Sqrt(2), Mathf.Sqrt(2), 0);//(根號2,根號2,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);  
    }  
       
}  

a.normalized表示該方向的單位向量,即方向與向量a相同,長度爲1的向量。Mathf.Acos()即數學中的arccos()函數。Mathf.Rad2Deg表示將弧度轉化爲角度。

結果如下圖:

二、叉積(又稱“向量積”、“外積”)

   1、理論知識

   數學上的定義:c=axb【注:粗體小寫字母表示向量】其中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、Unity中應用

   在Unity中,叉積表示爲Vector3.Cross(Vector3,Vector3):Vector3——參數爲2個向量,返回值也爲向量。

using UnityEngine;  
using System.Collections;  
   
public class Vector3_Cross : MonoBehaviour {  
   
    //向量a  
    Vector3 a;  
    //向量b  
    Vector3 b;  
   
    void Start()  
    {  
        //向量的初始化  
        a = new Vector3(3, 0, 0);//x軸方向,長度爲3  
        b = new Vector3(0, 4, 0);//y軸方向,長度爲4  
    }  
   
    void OnGUI()  
    {  
        //叉積的返回值  
        Vector3 c = Vector3.Cross(a, b);  
        Vector3 d = Vector3.Cross(b, a);  
        //向量a,b的夾角,得到的值爲弧度,我們將其轉換爲角度,便於查看!  
        float angle = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized))) * Mathf.Rad2Deg;  
        GUILayout.Label("向量axb爲:" + c);  
        GUILayout.Label("向量bxa爲:" + d);  
        GUILayout.Label("向量a,b的夾角爲:" + angle);  
    }  
}  

Vector3.Distance()用於計算2個Vector3的距離,在這裏我們可以得到叉積向量的模長。

結果如下圖:




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