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

2021-04-15 10:29:23 字數 1950 閱讀 4376

下面要作的是用給定的量將兩個物體分離,並新增一點摩擦和一些靜態摩擦,以便使物體靜止在斜面上。

該部分使用簡單的速度影響演算法。同樣,為了使碰撞響應更加真實,物體被賦予了質量(更好的是質量的倒數)。

質量的倒數是比較常用的,該值為零意味著該物體具有無窮大的質量,並因此不能移動。同時速度響應中使用質量的倒數具有更好的物理精確性。

現在我們知道多邊形

a在位置

pa具有速度

va,與位置

pb速度

vb的多邊形

b發生碰撞。

ncoll

和tcoll

定義了碰撞平面。如果碰撞前是交疊的,首先分離兩個物體,如下:

if (tcoll < 0) }

然後可以呼叫碰撞響應的**,為了簡化,我們可以考慮乙個粒子碰到乙個平面上

這裡v表示粒子的進入速度,

v』是粒子發生碰撞後的速度,

n為平面的法向。

v』 = v – (2 * (v . n)) * n

理想狀態下,碰撞前後粒子的能量是相同的。但是我們可以給粒子的碰撞加入彈性係數

v』 = v – ((1 + elasticity) * (v . n)) * n

彈性係數的範圍為[0,

1]如果為零意味著粒子將沿著平面滑動,如果為

1,粒子將沒有能量損耗的彈開。

同樣我們可以加入一些摩擦。如果我們沿著碰撞的法線和碰撞平面方向分解速度,我們可以同時計算彈性係數和摩擦力。

這裡,速度被沿著平面的法向和平面分解。彈性係數將影響沿著平面法向的響應

(vn)

,摩擦力將影響速度的切向(

vt)。

同樣摩擦係數的範圍為[0,

1]. 0

意味著沒有摩擦力,

1意味著粒子將突然停止。

vn = (v . n) * n;

vt = v – vn;

v』 = vt * (1 – friction) + vn  * -(elasticity);

對於靜摩擦力,簡單地在速度

vt小於給定的值時設定vt為

(0,0),

或者設定摩擦係數稍微比1大

( 1.001f

)。現在,計算兩個物體間的碰撞響應。原理是相同的。然而,計算是基於物體的相對速度的,物體將象上述一樣受到影響。結果將新增到每乙個物體上。

現在我們需要修改一下係數,因為現在我們使用了相對的概念

vector v = va – vb; // relative velocity

vn = (v . n) * n;

vt = v – vn;

if (vt.length() <

0.01f

) friction =

1.01f

;// response

v』 = vt * -(friction) + vn  * -(1 + elasticity);

va += v』 *

0.5f

;vb -= v』 *

0.5f

; 這裡使物體

a和物體

b具有相同的響應結果。

為了使結果更加有趣,a和

b可以有不同質量。顯然較輕的物體會受到較大影響,較重的物體被碰撞影響較小。所以我們可以使用質量來確定兩個物體碰撞響應效果。較大的物體具有較小的質量的倒數,如果質量為無窮大質量的倒數為零。

va += v』 * (invmassa) / (invmassa + invmassb);

vb -= v』 * (invmassb) / (invmassa + invmassb);

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

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

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

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

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

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