【Unity3d游戲開發】Unity3D中的3D數學基礎---向量


向量是2D、3D數學研究的標准工具,在3D游戲中向量是基礎。因此掌握好向量的一些基本概念以及屬性和常用運算方法就顯得尤為重要。在本篇博客中,馬三就來和大家一起回顧和學習一下Unity3D中那些常用的3D數學知識。
 

一、向量概念及基本定義

1、向量的數學定義

  • 向量就是一個數字列表,對於程序員來說一個向量就是一個數組。
  • 向量的維度就是向量包含的“數”的數目,向量可以有任意正數維,標量可以被認為是一維向量。
  • 書寫向量時,用方括號將一列數括起來,如[1,2,3] 水平書寫的向量叫行向量 垂直書寫的向量叫做列向量

2、向量的幾何意義

  • 幾何意義上說,向量是有大小和方向的有向線段。向量的大小就是向量的長度(模)向量有非負的長度。
  • 向量的方向描述了空間中向量的指向。
  • 向量的形式:向量定義的兩大要素——大小和方向,有時候需要引用向量的頭和尾,下圖所示,箭頭是向量的末端,箭尾是向量的開始                                                                                                
  • 向量中的數表達了向量在每個維度上的有向位移,例如2D向量列出的是沿x坐標方向和y坐標方向的位移。

3、向量與點

  • “點”有位置,但沒有實際的大小或厚度,“向量”有大小和方向,但沒有位置。所以使用“點”和“向量”的目的完全不同。”點”描述位置,“向量”描述位移。

4、點和向量的關系:

  • 任意一點都能用 從原點開始的向量來表達。

 

二、向量運算

1、零向量

  • 零向量非常特殊,因為它是唯一大小為零的向量。對於其他任意數m,存在無數多個大小(模)為m的向量,他們構成一個圓。零向量也是唯一一個沒有方向的向量。

2、負向量

  • 負運算符也能應用到向量上。每個向量v都有一個加性逆元-v,它的維數和v一樣,滿足v+(-v)=0。要得到任意維向量的負向量,只需要簡單地將向量的每個分量都變負即可。
  • 幾何解釋:向量變負,將得到一個和向量大小相等,方向相反的向量。

3、向量大小(長度或模)

  • 在線性代數中,向量的大小用向量兩邊加雙豎線表示,向量的大小就是向量各分量平方和的平方根   
      ||v||=√(x^2+y^2)                    (2D向量v)                                                                       
      ||v||=√(x^2+y^2+z^2)           (3D向量v)
  • 幾何解釋:在2D中的任意向量v,能構造一個以v為斜邊的直接三角形,由勾股定理可知,對於任意直角三角形,斜邊的長度平方等於兩直角邊長度的平方和。                                                                                                                                     ||v||^2 = x^2   +  y^2 

4、標量與向量的乘法

  • 雖然標量與向量不能相加,但它們可以相乘。結果將得到一個向量。與原向量平行,但長度不同或者方向相反。
  • 標量與向量的乘法非常直接,將向量的每個分量都與標量相乘即可。如:k[x,y,z] = [xk,yk,zk]
  • 向量也能除以非零向量,效果等同於乘以標量的倒數。如:[x,y,z]/k = [x/k,y/k,z/k]
  1. 標量與向量相乘時,不需要些乘號,將兩個量挨着寫即表示相乘。
  2. 標量與向量的乘法和除法優先級高於加法和乘法
  3. 標量不能除以向量,並且向量不能除以另一個向量。
  4. 負向量能被認為是乘法的特殊情況,乘以標量-1。
  • 幾何解釋:向量乘以標量k的效果是以因子|k|縮放向量的長度,例如:為了使向量的長度加倍,應使向量乘以2.如果k<0,則向量的方向被倒轉。

5、標准化向量

  • 對於許多向量,我們只關心向量的方向不在乎向量的大小,如:“我面向的是什么方向?”,在這樣的情況下,使用單位向量非常方便,單位向量就是大小為1的向量,單位向量經常也被稱作為標准化向量或者法線。
  • 對於任意非零向量v,都能計算出一個和v方向相同的單位向量k,這個過程被稱作向量的“標准化”,要標准化向量,將向量除以它的大小(模)即可。                                                                                    k=v/||v||,v!=0;
  • 零向量不能被標准化,數學上這是不允許的,因為將導致除以零,幾何上也沒有意義,零向量沒有方向。
  • 幾何解釋:2D環境中,如果以原點為尾畫一個單位向量,那么向量的頭將接觸到圓心在原點的單位圓。3D環境中單位向量將接觸單位球。

6、向量的加法和減法

  • 兩個向量的維數相同,那么它們能相加,或者相減。結果向量的維數與原向量相同。向量加減法的記發和標量加減法的記法相同。例如:[x,y,z] + [a,b,c] = [x+a,y+b,z+c]
  • 減法解釋為加負向量,a-b=a+(-b) 例如: [x,y,z] – [a,b,c] = [x-a,y-b,c-z]
  • 向量不能與標量或維數不同的向量相加減。
  • 和標量加法一樣,向量加法滿足交換律,但向量減法不滿足交換律,永遠有a+b = b+a,但a-b=-(b-a),僅當a=b時,a-b = b-a
  • 幾何解釋:向量a和向量b相加的幾何解釋為:平移向量,使向量a的頭連接向量b的尾,接着從a的尾向b的頭畫一個向量。這就是向量加法的“三角形法則”。
  • 計算一個點到另一個點的位移是一種非常普遍的需求,可以使用三角形法則和向量減法來解決這個問題,如: 上圖  d-c 計算出 到 的位移向量。

7、距離公式

  • 距離公式用來計算兩點之間的距離。從上面可以得知兩點間的位移向量通過向量減法可以得知,既然得到了兩點間的位移向量,那么求出位移向量的模,就能計算出兩點間的位移。

8、向量點乘

兩個向量相乘的結果是一個標量。此標量是等於兩個向量長度相乘結果再乘上向量之間的夾角的余弦。當兩個向量都為單位向量時,余弦的定義就表示為第一個向量在第二個向量上面的投影長度(或反之亦然 ,參數的順序並不重要) 。

  • 標量和向量可以相乘,向量和向量也可以相乘。有兩種不同類型的乘法,點乘、叉乘
  • 點乘的記法來至a·b中的點。與標量和向量的乘法一樣,向量點乘的優先級高於加法和減法。標量乘法和標量與向量的乘法可以省略乘號,但在向量點乘中不能省略點乘號。向量點乘就是對應分量乘積的和。其結果是一個標量.     [x,y,z] · [a,b,c] = ax+by+cz;
  • 幾何解釋:一般來說,點乘結果描述了兩個向量的“相似”程度,點乘結果越大,兩個向量越相近,點乘和向量間的夾角相關 計算兩向量間的夾角    θ = arccos(a·b)
  • 下面圖標中的一些主要的余弦值是會經常用到的:

9、向量投影

  • 給定兩個向量v和n,能夠將v分解成兩個分量, 它們分別垂直和平行於向量n,並且滿足 兩向量相加等於向量v,一般稱平行分量為v在向量n上的投影。
  • 平行分量公式: 平行分量 = n(v·n)/||n||^2
  • 垂直分量公式:    垂直分量 = ||v|| –  n(v·n)/||n||^2

10、向量叉乘

叉乘只能用來計算3D向量,它需要輸入兩個向量返回結果是另一個向量。得到的結果垂直於輸入的兩個向量。"左手坐標系"可以用來表示輸入和輸出的向量的方向。如果第一個參數匹配手的拇指和食指匹配第二個參數,結果將是中指的方向。如果參數的順序是相反的結果向量將指向正好相反的方向,但將有相同長度。向量叉乘的結果的大小等於輸入向量的乘積,然后通過它們之間的角度的正弦值乘以該值的大小。

  • 向量叉乘得到一個向量,並且不滿足交換律。  它滿足反交換律 a × b =  -(b × a)                                           叉乘公式:[x,y,z] × [a,b,c] = [yc-zb , za-xc , xb-ya]
  • 當點乘和叉乘在一起時,叉乘優先計算, a · b × c = a·(b×c)  因為點乘返回一個標量,同時標量和向量間不能叉乘。
  • 幾何解釋:叉乘得到的向量垂直於原來的兩個向量。
  • a × b 的長度等於向量的大小與向量夾角sin值的積,||a × b|| = ||a|| ||b|| sinθ                               ||a × b||也等於以ab為兩邊的平時四邊形的面積。
  • 叉乘最重要的應用就是創建垂直於平面、三角形、多邊形的向量。

11、標量乘法和除法

  • 當我們討論的向量,它常用他的標量作為一個普通的數字(例如,一個float值) 。這表示標量只有大小,而沒有向量的大小和方向。
  • 向量乘以一個標量方向和位置仍為原來的方向和位置。然而,新的向量的大小等於原來的大小乘以標量。
  • 同樣,標量的除法結果就是標量的幾分之一。
  • 向量代表一個移動或力時,這些運算是非常有用的。他們允許你改變向量的大小而不影響其方向。

任何向量除以他自己的大小,其結果是一個長度為1的向量,這被稱為單位向量。如果一個單位向量乘以一個標量,那么結果的長度將標量的大小。當力的方向是不變的,但力是可控的時.這是非常有用的.(例如,一輛車的車輪的力總是向前的,但力的大小是由司機控制) 。                                                                                                                                                                                                                                                                                                                          

Tips:

點乘和叉乘的應用
點乘:兩個向量點乘得到一個標量 ,數值等於兩個向量長度相乘后再乘以二者夾角的余弦值 。如果兩個向量a,b均 為單位 向量 ,那么a.b等於向量b在向量a方向上的投影的長度。

點乘后得到的是一個值:

若結果 = 0,則兩向量互相垂直 。
若結果 < 0 ,則兩向量夾角大於90°。
若結果 >0 ,則兩向量夾角小於 90°。

叉乘:兩個向量的叉乘得到一個新的向量 ,新向量垂直於原來的兩個向量再乘夾角的正弦值。

叉乘后得到的還是一個向量:

在Unity3D里面。兩個向量的點乘所得到的是兩個向量的余弦值,也就是-1 到1之間,0表示垂直,-1表示相反,1表示相同方向。 兩個向量的叉乘所得到的是兩個向量所組成的面的垂直向量,分兩個方向。 簡單的說,點乘判斷角度,叉乘判斷方向。 形象的說當一個敵人在你身后的時候,叉乘可以判斷你是往左轉還是往右轉更好的轉向敵人,點乘得到你當前的面朝向的方向和你到敵人的方向的所成的角度大小。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

作者:馬三小伙兒
出處:http://www.cnblogs.com/msxh/p/6156004.html 
請尊重別人的勞動成果,讓分享成為一種美德,歡迎轉載。另外,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM