【Unity3D】淺談Vector3的點積與叉積
阿新 • • 發佈:2019-02-09
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個向量,返回值為浮點型。
a.normalized表示該方向的單位向量,即方向與向量a相同,長度為1的向量。Mathf.Acos()即數學中的arccos()函式。Mathf.Rad2Deg表示將弧度轉化為角度。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); } }
結果如下圖:
二、叉積(又稱“向量積”、“外積”)
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的距離,在這裡我們可以得到叉積向量的模長。
結果如下圖: