基於2D多邊形的碰撞檢測和響應 五

2021-04-15 10:35:51 字數 1494 閱讀 2191

五、處理旋轉

在許多遊戲中都可以發現一些旋轉的物體。與它們的碰撞會有一點複雜。旋轉精靈的標準做法是通過乙個簡單的角度,通常的區間是[0,2*pi]。可以使用矩陣來存貯三角操作,因此乙個角度可以被轉化為2*2的矩陣

乙個簡單的處理旋轉物體碰撞的方法是儲存乙個原始多邊形的副本,並將其轉化到當前位置和角度。這是非常簡單的,因此我決定詳細描述並給出乙個通用的碰撞檢測系統,這個系統同樣可以用於3d的情況

如果你對於矩陣數學,向量,線形代數和三角學不是很熟悉,你可以看看下邊的文章。

為了簡化,通常的做法是將乙個物體轉化到另乙個物體的座標系中,因此在碰撞檢階段僅僅需要乙個轉化過程。轉化到模型空間非常容易使人混淆,但是如果你對於基礎代數比較熟悉,它會變得非常簡單。

進行座標轉化後還要計算乙個物體相對於另乙個物體的相對位置和速度,加入方向將使得事情變得稍微複雜一些。

考慮兩個物體a和b,分別位於pa和pb,方向分別為oa和ob,並且位移為da和db。轉化物體a到它自己的模型空間中,這裡pa=origin,oa=identitymatix,va=vector(0,0),我們需要應用轉化到物體a上,考慮如下的前向轉化,並將其反向,將乙個點從區域性座標轉化到世界座標:

pworld = plocal * oa + pa

(pworld – pa) = plocal * oa

(pworld – pa) * oat = plocal * oa * oat

plocal = (pworld – pa) * oat

同樣使用,前向變換來轉換方向向量

dworld = dlocal * oa

dworld * oat = dlocal * oa * oat d

local = d

world * oa t

同樣方向

oworld = olocal * oa

oworld * oat= olocal * oa * oat o

local = o

world * oa t

現在我們將物體b的位置轉化到a的區域性座標空間中

pb』 = (pb – pa) * oat

db』 = (db – da) * oat

ob』 = (ob) * oat

同樣,當我們測試分離軸時,需要注意的是我們還在區域性座標中,並且需要將分離軸從b的區域性座標中轉換到a的區域性座標空間中。並且為了計算物體b的區域性間隔,使用轉化到物體a的區域性座標空間的軸,我們需要將其反向轉化到b的座標空間中。

這些會使你覺得迷惑,另乙個解決方案基本上不會被區域性座標所迷惑,即所有的操作都在全域性座標中完成。這個方法的確定就是你不得不保持乙個多邊形的副本,因為每乙個多邊形需要分別在世界座標中計算一次。好處是你不需要再每次處理碰撞的時候重新計算變換。這個對2d遊戲來數是非常好的,但是在3d中,你不會想在每一幀中變換一次物體僅僅為了碰撞檢測的目的,尤其是當物體儲存在樹中並有乙個非常複雜的形狀的時候。

基於2D多邊形的碰撞檢測和響應 一

簡介 本文是闡述如何在2d動作遊戲中進行精確而高效的碰撞檢測。這裡的碰撞是基於多邊形而不是基於精靈的。這兩者之間在設計上會有不同。基於精靈的碰撞檢測是通過精靈之間的重疊的畫素來完成的。而多邊形使用向量數學來精確計算交點,時間和碰撞方向。雖然多邊形僅僅是精靈的乙個近似,但是它比精靈系統要高階。特性本文...

基於2D多邊形的碰撞檢測和響應 四

下面要作的是用給定的量將兩個物體分離,並新增一點摩擦和一些靜態摩擦,以便使物體靜止在斜面上。該部分使用簡單的速度影響演算法。同樣,為了使碰撞響應更加真實,物體被賦予了質量 更好的是質量的倒數 質量的倒數是比較常用的,該值為零意味著該物體具有無窮大的質量,並因此不能移動。同時速度響應中使用質量的倒數具...

基於2D多邊形的碰撞檢測和響應 六

六 計算觸點 為了動態的移動剛體,我們需要精確計算兩個碰撞多邊形之間的觸點。對於2d來說這並不複雜,但是在3d場景中會變得非常複雜。在2d情況下,可以考慮兩種情況,點和邊的相交或者是邊和邊的相交。這個處理過程幾乎不需要教程,但是它非常適合於乙個視覺化的演示 這裡,我只考慮交疊的情況,這個原理也適用於...