1. 程式人生 > >Unity3D_向量(Vector3)數學基礎

Unity3D_向量(Vector3)數學基礎

向量(Vector3)

在虛擬的遊戲世界中,3D數學決定了遊戲,如何計算和模擬出開發者以及玩家看到的每一幀畫面。學習基礎的3D數學知識可以幫主使用者對遊戲引擎產生更深刻的瞭解。 
向量定義:既有大小又有方向的量叫做向量。在空間中,向量用一段有方向的線段來表示。應用十分廣泛,可用於描述具有大小和方向兩個屬性的物理量,例如物體運動的速度、加速度、攝像機觀察方向、剛體受到的力等都是向量。因此向量是物理、動畫、三維圖形的基礎。 
與向量相對的量成為標量:即只有大小沒有方向的量。例如物體移動中的平均速率、路程。 
:向量的長度標準化(Normalizing):保持方向不變,將向量的長度變為1. 
單位向量

:長度為1的向量。 
零向量:各分量均為0的向量 
向量運算——加減:向量的加法(減法)為各個分量分別相加(相減)。在物理上可以用來計算兩個裡的合力,或者幾個速度份量的疊加。 
這裡寫圖片描述 
向量運算——數乘向量一個標量相乘稱為數乘。數乘可以對向量的長度進行縮放,如果標量大於0,那麼向量的方向不變,若標量小於0,則向量的方向會變為反方向。 
向量運算——點乘兩個向量點乘得到一個標量,數值等於兩個向量長度相乘再乘以兩者夾角的餘弦值。如果兩個向量a,b均為單位向量,那麼a.b等於向量b在向量a方向上的投影的長度(或者說向量a在向量b方向上的投影)。 
這裡寫圖片描述 

叉乘兩個向量的叉乘得到一個新的向量新向量垂直與原來的兩個向量並且長度等於原來向量長度相乘後夾角的正弦值

注意叉乘不滿足交換律 即a×b 不等於 b×a。 

這裡寫圖片描述

  • 屬性

    forward Vector3(0, 0, 1)的簡碼,也就是向z軸。 
    right Vector3(1, 0, 0)的簡碼,也就是向x軸。 
    up Vector3(0, 1, 0)的簡碼,也就是向y軸。 
    zero Vector3(0, 0, 0)的簡碼。 
    one 是 Vector3(1, 1, 1)的簡碼。 
    Vector3.sqrMagnitude

     長度平方(只讀的) 
    【注】計算長度的平方而不是magnitude是非常快的。如果你是比較兩個向量的長度差,你可以比較他們的平方長度。 
    向量的長度是用勾股定理計算出來,計算機計算兩次方和開根的運算量比加減法要費時的多。所以如果是想比較兩個向量的長度,用sqrMagnitude可以快出很多。

  • 向量運算

    向量加法 
    向量加法就是兩個向量對應的x,y,z軸座標進行加法運算 
    例如以下的程式碼

 
  1. Vector3 v1 = new Vector3(1, 2, 3);
    
    Vector3 v2 = new Vector3(4, 2, 1);
    
    Vector3 v3 = v1 + v2; //v3的結果 (5.0, 4.0, 4.0)
    
    Debug.Log(v3);

     

  2.  
  • 如果v1和v2都表示一個點的話,那麼v3的方向是從v1開始指向v2的一個帶有箭頭的射線 此時v3就是一個向量 

如果v1和v2都表示一個向量的話,那麼v3是一個從v1的尾部指向v2的頭部的一個帶有方向箭頭的一條射線 
這裡寫圖片描述 
向量減法 
向量加法就是兩個向量對應的x,y,z軸座標進行減法運算 
例如以下的程式碼

 
  1. Vector3 v1 = new Vector3(1, 2, 3);
    
    Vector3 v2 = new Vector3(4, 2, 1);
    
    Vector3 v3 = v2 - v1; //v3的結果 (3.0, 0.0, -2.0)
    
    Debug.Log(v3);

     

  2.  
  • 其實就是從向量b頭部指向向量a頭部的一個向量 

向量減法圖片 
向量數乘 
實數和向量相乘的過程就是數乘 
如果實數大於0 那麼數乘後的向量的方向和原始向量的方向一致,如果實數小於0 那麼數乘後的向量的方向和原始向量的方向相反  
數乘的幾何意義:就是沿著原始變數的方向或者變數的相反方向放大或者縮小

  • 方法

    Vector3.Dot 點乘 (又稱”點積”,”數量積”,”內積”)(Dot Product, 用*) 
    定義:a·b=|a|·|b|cos< a,b> 【注:粗體小寫字母表示向量,< a,b>表示向量a,b的夾角,取值範圍為[0,180]】 
    幾何意義:是一條邊向另一條邊的投影乘以另一條邊的長度. 
    v1和v2向量的點乘運算:相應元素的乘積的和:v1( x1, y1,z1) v2(x2, y2,z2) = x1x2 + y1y2+z1z2; 
    注意 : 結果不是一個向量,而是一個標量。 
    性質1: ab = |a||b|Cos(θ) ,θ是向量a 和向量 b之間的夾角。 
    性質2: ab = b*a 滿足乘法交換律 
    Unity專案應用: 
    1.根據點乘計算兩個向量的夾角。< a,b>= arccos(a·b / (|a|·|b|)) 
    2.根據點乘的正負值,得到夾角大小範圍,【大於>0,則夾角(0,90)】,【 小於<0,則夾角(90,180)】,可以利用這點判斷一個多邊形是面向攝像機還是背向攝像機。 
    3.根據點乘的大小,得到向量的投影長度,反應了向量的長度關係。 
    4.在生產生活中,點積同樣應用廣泛。利用點積可判斷一個多邊形是否面向攝像機還是背向攝像機。向量的點積與它們夾角的餘弦成正比,因此在聚光燈的效果計算中,可以根據點積來得到光照效果,如果點積越大,說明夾角越小,則物理離光照的軸線越近,光照越強。物理中,點積可以用來計算合力和功。若b為單位向量,則點積即為a在方向b的投影,即給出了力在這個方向上的分解。功即是力和位移的點積。計算機圖形學常用來進行方向性判斷,如兩向量點積大於0,則它們的方向朝向相近;如果小於0,則方向相反。向量內積是人工智慧領域中的神經網路技術的數學基礎之一,此方法還被用於動畫渲染(Animation-Rendering)。

    Vector3.Cross 叉乘 (又稱”叉積”,”向量積”,”外積”)(cross product,用x) 
    定義:c = a x b,其中a b c均為向量 
    幾何意義是:得到一個與這兩個向量都垂直的向量,這個向量的模是以兩個向量為邊的平行四邊形的面積 
    v1和v2向量的叉乘運算:相應元素的乘積的和:v1( x1, y1,z1) x v2(x2, y2, z2) = (y1z2 - y2z1)i+(x2z1 - x1z2)j+(x1y2-x2y1)k; 
    利用三階行列式計算 
    |i j k| 
    |x1 y1 z1| 
    |x2 y2 z2| 
    性質1:c⊥a,c⊥b,即向量c與向量a,b所在平面垂直 
    性質2:模長|c| = |a||b| sin< a,b> 
    性質3:(數學上)滿足右手法則, a x b = -b x a,所以我們可以使用叉乘的正負值來判斷

    Unity當中叉乘的左手法則 
    Unity專案應用: 
    1.根據叉乘得到a,b向量的相對位置,和順時針或逆時針方位。 
    簡單的說: 點乘判斷角度,叉乘判斷方向。 
    形象的說: 當一個敵人在你身後的時候,叉乘可以判斷你是往左轉還是往右轉更好的轉向敵人,點乘得到你當前的面朝向的方向和你到敵人的方向的所成的角度大小。 
    2.得到a,b夾角的正弦值,計算向量的夾角(0,90),可以配合點乘和Angle方法計算出含正負的方向。 
    3.根據叉乘大小,得到a,b向量所形成的平行四邊形的面積大小,根據面積大小得到向量的相對大小。

    Vector3.Distance 距離

     
    1. void Test()
      
      {
      
      Vector3 v1 = new Vector3(0, 0, 2);
      
      Vector3 v2 = new Vector3(2, 0, 0);
      
      //求兩個點之間的距離
      
      Debug.Log(Vector3.Distance(v1,v2));
      
      
      }

       

    2.  
    • Vector3.Lerp 插值 

    obj1的位置是上一幀的位置加上(目標位置-上一幀的位置)*0.1

obj1.transform.position = Vector3.Lerp(obj1.transform.position, obj2.transform.position, 0.1f);
  • 1

Vector3.Normalize 規範化 
使向量程式設計長度為1的單位向量 
- Vector2和Vector4

Vector2 二維向量 
這個結構用於在一些地方表示2D的位置和向量(例如:網格中的紋理座標,或者材質中的紋理偏移)。在其他情況下大多數使用Vector3。其操作基本可Vector3差不多 
靜態變數 
one 
Vector2(1, 1)的簡寫。 
right 
Vector2(1, 0)的簡寫。 
up 
Vector2(0, 1)的簡寫。 
zero 
Vector2(0, 0)的簡寫。

Vector4 二維向量 
表示四維向量。 
這個結構在一些地方用來表示四維向量(例如:網格切線,著色器的引數)。在其他情況下大多數使用Vector3。 
其他操作和Vector3雷同



參考程式碼

點乘

 
using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class Vector3Test : MonoBehaviour {



// Use this for initialization

void Start () {

Vector3 v1 = new Vector3(1, 0, 0);

Vector3 v2 = new Vector3(1, 0, 1);

TestDot(v1, v2);

}



// Update is called once per frame

void Update () {



}



private void TestDot(Vector3 a,Vector3 b)

{

//計算兩個向量點乘的結果 得到的是一個數值

//求得的是向量b在向量a方向上的投影

float result = Vector3.Dot(a,b);

Debug.Log("Result = "+result);

//計算兩個向量的夾角,該方法得到的是一個角度 計算出來的夾角的範圍是0-180度

float angle = Vector3.Angle(a,b);

Debug.Log("angle = " + angle);

//向量b方向上的單位向量在向量a方向單位向量的投影

//計算 a、b 單位向量的點積,得到夾角餘弦值,|a.normalized|*|b.normalized|=1;

result = Vector3.Dot(a.normalized,b.normalized);

Debug.Log("result = " + result);

// 通過反餘弦函式獲取 向量 a、b 夾角(預設為 弧度)

float radians = Mathf.Acos(result);

angle = radians * Mathf.Rad2Deg;

Debug.Log(angle);

}



}
  • 叉乘