一、點積(又稱“數量積”、“內積”)
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的距離,在這裏我們可以得到叉積向量的模長。
結果如下圖: