Andre Lamothe說:“向量幾何是遊戲程序員最好的朋友”。一點不假,向量幾何在遊戲編程中的地位不容忽視,因為在遊戲程序員的眼中,顯示屏幕就是一個坐标系,運動物體的軌迹就是物體在這個坐标系曲線運動結果,而描述這些曲線運動的,就是向量。使用向量可以很好的模拟物理現象以及基本的AI。
首先我們先需要複習一下中學的向量知識
向量v 也叫矢量,是一個有大小有方向的量。
長度為1的向量稱為單位向量,也叫幺矢,這裡即為E。
長度為0的向量叫做零向量,記為0,零向量沒有确定方向,換句話說,它的方向是任意的。
1、向量加法:a b等于使b的始點與a的終點重合時,以a的始點為始點,以b的終點為終點的向量。2、向量減法:a-b等于使b的始點與a的始點重合時,以b的終點為始點,以a的終點為終點的向量。3、 數量乘向量:k*a,k>0時,等于a的長度擴大k倍;k=0時,等于0向量;k<0時,等于a的長度擴大|k|倍然後反向。4、向量的内積(數量積、點積): a.b=|a|*|b|*cosA 等于向量a的長度乘上b的長度再乘上a與b之間夾角的餘弦。 它的幾何意義就是a的長度與b在a上的投影長度的乘積,或者是b的長度與a在b上投影長的乘積,它是一個标量,而且可正可負。因此互相垂直的向量的内積為0。
5、向量的矢積(叉積): a x b = |a|*|b|*sinA*v = c, |a|是a的長度,|b|是b的長度,A是a和b之間的不大于180的夾角,v是與a,b所決定的平面垂直的幺矢,即axb與a、b都垂直。在右手坐标系下,a,b,c構成右手系,即右手拇指伸直,其餘四指按由a到b的不大于180度的角卷曲,此時拇指所指方向就是c的方向。因此axb!=bxa。如果是左手系,那麼上圖中a x b = -c ,即a,b和-c構成左手系。a x b的行列式計算公式如上圖右邊所示。兩個向量的矢積是一個向量。6、正交向量的内積:互相垂直的兩個向量是正交的,正交向量的内積為零。a.b = |a|.|b|*cos(PI/2) = |a|.|b|*0 = 0。
二、向量的性質
沒有下面的這些性質做基礎,我們後面向量技巧的推導将無法進行。
1) a b = b a2) (a b) c = a (b c)3) a 0 = 0 a = a4) a (-a) = 05) k*(l*a) = (k*l)*a = a*(k*l)6) k*(a b) = k*a k*b7) (k l)*a = k*a l*a8) 1*a = a
9) a.b = b.a10)a.(b c) = a.b a.c11)k*(a.b) = (k*a).b = a.(k*b)12)0.a = 013)a.a = |a|^2
三、自由向量的代數(分量)表示
1、向量在直角坐标中的代數表示方法:a=(x,y)
其中x,y分别是向量在x軸和y軸上的分量。任何一個在直角坐标軸上的分量為(x,y)的向量都相等。比如上圖中的每個向量都表示為(-2,1)。或者寫成a=x*i y*j,即i和j的線性組合,這裡i是x軸方向的單位向量(1,0),j是y軸方向的單位向量(0,1),因此i正交于j。任意一個2-D向量都可以變成i與j的線性組合。|i| = |j| = 1
2、向量的代數(分量)表示的運算:向量加法分量表示:a b=(xa,ya) (xb,yb)=(xa xb,ya yb)向量減法分量表示:a-b=(xa,ya)-(xb,yb)=(xa-xb,ya-yb)向量的内積(數量積、點積)分量表示:a.b=(xa * i ya * j).(xb * i yb * j)= xa * i * xb * i xa * i * yb * j ya * j * xb * i ya * j * yb * j=(xa * xb) * (i * i) (xa * yb) * (i * j) (xb * ya) * (i * j) (ya * yb) * (j * j)= xa * xb ya * yb
3、向量長度(模)的計算以及單位化(歸一化):設a=(x,y),則|a| = |(x,y)| = |x*i y*j| = sqrt(x^2*i^2 y^2*j^2) = sqrt(x^2 y^2),這裡sqrt是開平方符号。a的單位向量為a/|a|,即(x,y)/sqrt(x^2 y^2)。
現在假設你正在編寫一個飛行射擊遊戲,你的敵人需要一種很厲害的武器-跟蹤導彈,這種武器在行進的同時不斷的修正自己與目标之間的位置關系,使得指向的方向總是玩家,而不論玩家的位置在哪裡,這對一個水平不高的玩家(我?)來說可能将是滅頂之災,玩家可能很詫異敵人會擁有這麼先進的秘密武器,但對于你來說隻需要在程序循環中加入幾行代碼,它們的原理是向量的單位化和基本向量運算。
首先我們要知道玩家的位置(x_player, y_player),然後,我們的導彈就可以通過計算得到一個有初始方向的速度,速度的方向根據玩家的位置不斷修正,它的實質是一個向量減法的計算過程。速度的大小我們自己來設置,它可快可慢,視遊戲難易度而定,它的實質就是向量單位化和數乘向量的過程。具體算法是:導彈的更新速度(vx_missile, vy_missile) = 玩家的位置(x_player, y_player) - 導彈的位置(x_missile, y_missile),然後再對(vx_missile, vy_missile)做縮小處理,導彈移動,判斷是否追到玩家,重新更新速度,縮小...
看一下這個簡單算法的代碼:
// 假設x_player,y_player是玩家位置分量// x_missile,y_missile是導彈位置分量// xv_missile,yv_missile是導彈的速度分量// 讓我們開始吧!float n_missile ; // 這是玩家位置與導彈位置之間向量的長度float v_rate ; // 這是導彈的速率縮放比率// 計算一下玩家與導彈之間的位置向量xv_missile = x_player-x_missile ; // 向量減法,方向由導彈指向玩家,x分量yv_missile = y_player-y_missile ; // y分量// 計算一下它的長度n_missile = sqrt( xv_missile*xv_missile yv_missile*yv_missile ) ;// 歸一化導彈的速度向量:xv_missile /= n_missile ;yv_missile /= n_missile ;// 此時導彈的速率為1,注意這裡用速率。// 導彈的速度分量滿足xv_missile^2 yv_missile^2=1// 好!現在導彈的速度方向已經被修正,它指向玩家。// 由于現在的導彈速度太快,為了緩解一下緊張的氣氛,我要給導彈減速v_rate = 0.2f ; // 減速比率xv_missile *= v_rate ; // 這裡的速率縮放比率,你可以任意調整大小yv_missile *= v_rate ; // 可以加速:v_rate大于1;減速v_rate大于0小于1,這裡就這麼做!// 導彈行進!導彈勇敢的沖向玩家!x_missile = xv_missile ;y_missile = yv_missile ;// 然後判斷是否攻擊成功現在,你編寫的敵人可以用跟蹤導彈攻擊玩家了。你也可以稍加修改,變為直線攻擊武器。這樣比較普遍。基本的跟蹤效果用向量可以很好的模拟。此時,我們隻用到了所述向量知識的很少的一部分。其他的知識會慢慢用到遊戲中。這次先介紹到這裡。
在遊戲的運動中我們常用的方法就是向量的加減,這個可以大大簡化我們的程序。對于向量你還有什麼需要了解的嗎?歡迎 關注,私信.
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!