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

2021-04-15 10:40:09 字數 1729 閱讀 8810

六、計算觸點

為了動態的移動剛體,我們需要精確計算兩個碰撞多邊形之間的觸點。對於2d來說這並不複雜,但是在3d場景中會變得非常複雜。在2d情況下,可以考慮兩種情況,點和邊的相交或者是邊和邊的相交。

這個處理過程幾乎不需要教程,但是它非常適合於乙個視覺化的演示

這裡,我只考慮交疊的情況,這個原理也適用於碰撞的情況。

現在給出乙個碰撞的法向,在點邊接觸的情況下,如何求得觸點?

對於接觸點a,它是直接向前的。我們需要呼叫乙個支撐對映函式,他將返回多邊形在制定方向上的最低點,非常類似於第乙個例子中的calculateinterval()函式

int findsupportpoints(const vector& n, float t,

const vector* a, int anum,

const vector& pa, const vector& va,

const matrix& oa, vector* s) }

int snum = 0;

const float threshold = 1.0e-3f;

for(int i = 0; i < anum; i ++) }

return snum; }

這裡,函式的第一部分找到多邊形的最小值。第二部分簡單的找到接近最小值的所有點,因此如果碰撞法線垂直於一條邊,將返回兩個點。這兩個點將以世界座標存貯,變換函式將確保多邊形的觸點被轉化為世界座標,並且如果是乙個未來的碰撞,這個點將被轉化為碰撞時刻的

vector transform(const vector& vertex, const vector& p, const vector& v, const matrix& xorient, float t)

對於b上的點,你只需要簡單地在反方向找到乙個支撐點,在以後的處理中我們需要一對位於兩個物體上的支撐點來做物理模擬推力並使物體旋轉,你可以從上圖中發現在不同的碰撞情況下你需要得到的一對觸點。

現在,呼叫findsupportpoint()函式在每個物體上返回乙個或兩個觸點。在一對一觸點的情況下,不需要做任何事情,現在,還不支援一對一的接觸,但是它能夠非常容易的擴充套件到分離軸演算法中。

在一對二接觸的情況下,它是乙個簡單的點對邊的碰撞,如上圖中的第乙個圖

在二對一接觸的情況下,可以同樣運用上述情況,除了物體被交換外

在二對二接觸的情況下,他是乙個邊邊碰撞,你需要找到兩個邊的交疊區域。

首先對於點邊碰撞,在這種情況下,一對碰撞點可以簡單的通過將a上的碰撞點投影到b的邊上來實現,或者說是b的邊上最接近a觸點的點

vector findclosestpoint(const vector& v, const vector& a, const vector& b, float* pt)

在邊對邊碰撞的情況下,處理過程非常類似。只是你需要沿著沿著碰撞法線的垂直方向排序點,並得到兩個中間點。然後,將它們投影到另外的邊上以便得到一對觸點。

有了這些觸點,你就可以編寫乙個基本的剛體系統,物體將比以前更真實的相互碰撞並響應碰撞。

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

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

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

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

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

五 處理旋轉 在許多遊戲中都可以發現一些旋轉的物體。與它們的碰撞會有一點複雜。旋轉精靈的標準做法是通過乙個簡單的角度,通常的區間是 0,2 pi 可以使用矩陣來存貯三角操作,因此乙個角度可以被轉化為2 2的矩陣 乙個簡單的處理旋轉物體碰撞的方法是儲存乙個原始多邊形的副本,並將其轉化到當前位置和角度。...