Unity中的數學基礎——向量

一:概念

——向量也稱爲矢量,是具有大小和方向的量(零向量比較特殊,是唯一一個大小爲0並且沒有方向的向量)。向量的大小(長度)稱爲模,長度爲1的向量稱爲單位向量
——書寫向量時,水平書寫的向量([1,2,3])叫做行向量,垂直書寫的向量叫做列向量


二:點與向量的關係

點代表了一個位置,他沒有大小和方向的概念。而向量具有大小和方向的概念。Unity中的transform.position代表了一個點,它不具有方向。transform.forward代表了一個向量,它代表了當前物體在世界座標z軸上的指向。但是他們在Unity中都是通過(x,y,z)來表示的


三:向量的幾種關係

——向量AB不等於向量BA,因爲方向不同
——向量AB等於負的向量BA,因爲方向相同
——向量AB的長度等於向量BA的長度
——向量AB+向量BA=零向量,因爲兩個向量相反


四:單位向量

長度爲1的向量稱爲單位向量。當我們只關心向量方向,不關心向量大小時,則可以使用單位向量。
普通向量變換爲單位向量的過程稱爲向量歸一化

Vector3 A = new Vector3(1, 2, 3);
Vector3 B = new Vector3(2, 4, 5);

Vector3 v = (B - A).normalized;
Debug.Log("AB向量歸一化後的座標:" + v);    //AB向量歸一化後的座標:(1/3,2/3,2/3)

五:向量的長度

Vector3 A = new Vector3(1, 2, 3);
Vector3 B = new Vector3(2, 4, 5);

//第一種方法:Vector3.Magnitude,Vector3.SqrMagnitude求出的是長度的平方
float dis = Vector3.Magnitude(B - A);

//第二種方法:Vector3.Distance
//float dis = Vector3.Distance(A, B);

Debug.Log("AB向量的長度:" + dis);    //AB向量的長度:3

六:向量的點積(內積)

向量點積後的結果是一個標量

點乘的結果越大,兩向量越接近,可以使用點乘來計算兩個向量之間的夾角大小(Vector3.Angle求得的夾角在0度到180度之間)
點乘的結果大於0,則兩個向量的夾角0<=θ<90
點乘的結果等於0,則兩個向量的夾角θ=90,互相垂直
點乘的結果小於0,則兩個向量的夾角90<θ<=180

Vector3 A = new Vector3(1, 1);
Vector3 B = new Vector3(1, 0);

float dot = Vector3.Dot(A, B);
Debug.Log("A向量與B向量的點乘爲:" + dot);    //A向量與B向量的點乘爲:1

float angle = Vector3.Angle(A, B);
Debug.Log("A向量與B向量的夾角爲:" + angle);  //A向量與B向量的夾角爲:45

七:向量的叉積(外積)

叉乘只能用於3D向量,向量叉積後的結果是一個向量

叉乘求得的向量是垂直於A向量與B向量的(叉乘求得的向量與A向量和B向量的點積爲0),求得的是一個平面的法向量

以下結論都是以左手定則爲準的:(二維向量比較叉積的Z值,三維向量比較叉積的Y值)
叉乘的結果大於0,則向量旋轉到向量B是順時針
叉乘的結果等於0,則向量A與向量B是共線的
叉乘的結果小於0,則向量A旋轉到向量B是逆時針

Vector3 A = new Vector3(1, 2, 3);
Vector3 B = new Vector3(-2, -2, 3);

Vector3 cross = Vector3.Cross(A, B);
Debug.Log("A向量與B向量的叉乘爲:" + cross);    //A向量與B向量的叉乘爲:(12,-9,2)


點積與叉積總結:
向量的點積可以求得
——兩個向量的夾角大小
——兩個向量的位置遠近


向量的叉積可以求得
——由一個向量旋轉到另一個向量是順時針還是逆時針
——兩個向量組成平面的法向量


八:求一個向量在另一個向量上的投影以及投影長度

求一個向量在另一個向量上的投影長度以及投影:

Vector3 projection = Vector3.Project(new Vector3(4, 4, 4), new Vector3(0, 0, 1));
float projectionDis = projection.magnitude;

Debug.Log("向量(4,4,4)在向量(0,0,1)上的投影向量爲:" + projection);
Debug.Log("向量(4,4,4)在向量(0,0,1)上的投影長度爲:" + projectionDis);

九:向量叉積的程序示意


由向量A旋轉到向量B其實沒有所謂的順時針與逆時針,A向量順時針或逆時針都可以旋轉到向量B,所以定義了旋轉的方向只能大於等於0小於等於180°。unity左手座標系中的叉積計算遵循左手定則,即左手微握,大拇指伸出,向量A按四指旋轉方向旋轉到向量B時,且小於等於180°,則向量C沿着大拇指方向,大於180°小於等於360°則與大拇指反方向,這點剛好和叉積的右手定則反過來了

using UnityEngine;

public class CrossTest : MonoBehaviour
{
    public Transform a;
    public Transform b;
    private Vector3 worldCenter = Vector3.zero;

    private void Update()
    {
        a.RotateAround(worldCenter, Vector3.up, 30 * Time.deltaTime);
        Vector3 cross = Vector3.Cross(a.position, b.position);

        Debug.DrawLine(worldCenter, a.position - worldCenter, Color.yellow);
        Debug.DrawLine(worldCenter, b.position - worldCenter, Color.blue);
        Debug.DrawLine(worldCenter, cross, Color.red);
    }
}

 

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