下面要作的是用給定的量將兩個物體分離,並新增一點摩擦和一些靜態摩擦,以便使物體靜止在斜面上。
該部分使用簡單的速度影響演算法。同樣,為了使碰撞響應更加真實,物體被賦予了質量(更好的是質量的倒數)。
質量的倒數是比較常用的,該值為零意味著該物體具有無窮大的質量,並因此不能移動。同時速度響應中使用質量的倒數具有更好的物理精確性。
現在我們知道多邊形
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情況下,可以考慮兩種情況,點和邊的相交或者是邊和邊的相交。這個處理過程幾乎不需要教程,但是它非常適合於乙個視覺化的演示 這裡,我只考慮交疊的情況,這個原理也適用於...