向量幾何在遊戲程式設計中的使用1

2021-10-05 02:48:40 字數 4607 閱讀 4619

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 + a

2) (a + b) + c = a + (b + c)

3) a + 0 = 0 + a = a

4) a + (-a) = 0

5) k*(l*a) = (k*l)*a = a*(k*l)

6) k*(a + b) = k*a + k*b

7) (k + l)*a = k*a + l*a

8) 1*a = a

9) a.b = b.a

10)a.(b + c) = a.b + a.c

11)k*(a.b) = (k*a).b = a.(k*b)

12)0.a = 0

13)a.a = |a|^2

三、自由向量的代數(分量)表示

1、向量在直角座標中的代數表示方法:

其中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)。

四、簡單的2-d追蹤

現在,有了向量的基本知識,我們就可以分析乙個常見的問題-螢幕上一點到另一點的追蹤,其實這一問題也可理解為畫線問題,畫線的演算法有很多:dda畫線法、中點畫線法以及高效的bresenham演算法。但這些演算法一般只是畫一些兩端固定的線段時所使用的方法,再做一些動態的點與點之間的跟蹤時顯得不很靈活。使用向量的方法可以很好的解決此類問題。

現在假設你正在編寫乙個飛行射擊遊戲,你的敵人需要一種很厲害的**-跟蹤飛彈,這種**在行進的同時不斷的修正自己與目標之間的位置關係,使得指向的方向總是玩家,而不論玩家的位置在**,這對乙個水平不高的玩家(我?)來說可能將是滅頂之災,玩家可能很詫異敵人會擁有這麼先進的秘密**,但對於你來說只需要再程式迴圈中加入幾行**

,它們的原理是向量的單位化和基本向量運算。

首先我們要知道玩家的位置(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 ;

// 然後判斷是否攻擊成功

現在,你編寫的敵人可以用跟蹤飛彈攻擊玩家了。你也可以稍加修改,變為直線攻擊**。這樣比較普遍。

基本的跟蹤效果用向量可以很好的模擬。

此時,我們只用到了所述向量知識的很少的一部分。其他的知識會慢慢用到遊戲中。這次先介紹到這裡。

下次我將說說利用向量模擬2-d物體任意角度返彈的技巧:)但是!別忘了複習一下向量的基礎知識,我們要用到它們。

向量幾何在遊戲程式設計中的使用1

1 簡單的2 d追蹤 andre lamothe說 向量幾何是遊戲程式設計師最好的朋友 一點不假,向量幾何在遊戲程式設計中的地位不容忽視,因為在遊戲程式設計師的眼中,顯示螢幕就是乙個座標 系,運動物體的軌跡就是物體在這個座標系曲線運動結果,而描述這些曲線運動的,就是向量。使用向量可以很好的模擬物理現...

向量幾何在遊戲程式設計中的使用1

1 簡單的2 d追蹤 andre lamothe說 向量幾何是遊戲程式設計師最好的朋友 一點不假,向量幾何在遊戲程式設計中的地位不容忽視,因為在遊戲程式設計師的眼中,顯示螢幕就是乙個座標 系,運動物體的軌跡就是物體在這個座標系曲線運動結果,而描述這些曲線運動的,就是向量。使用向量可以很好的模擬物理現...

向量幾何在遊戲程式設計中的使用3

3 2 d邊界碰撞檢測 一 使用向量進行障礙檢測的原理 在遊戲中進行障礙碰撞檢測,基本思路是這樣的 給定乙個障礙範圍,判斷物體在這次移動後會不會進入這個範圍,如果會,就發生碰撞,否則不發生碰撞。在實際操作中,是用物體的邊界來判斷還是其他部位判斷完全取決於程式設計者。這時候,就可以從這個部位沿著速度的...