1. 程式人生 > >【Unity3D】淺談Vector3的點積與叉積

【Unity3D】淺談Vector3的點積與叉積

    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 = newVector3(3, 0, 0);//x軸方向,長度為3
        b = newVector3(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 = newVector3(3, 0, 0);//x軸方向,長度為3
        b = newVector3(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的距離,在這裡我們可以得到叉積向量的模長。

結果如下圖: