分離軸測試基於凸體:給定兩凸體集a和
b,若兩集合不存在交集,則必定存在乙個軸使得兩凸體投影無重疊。若找不到該軸,則兩凸體集相交。
對於對稱幾何體如線段、aabb
、obb
、球體等,其包含中心
c且為投影軸上投影區間的中心位置,只需計算其投影區間的
1/2寬度或半徑,求和並於二中心投影間的距離進行比較,若和小於中心投影間距離,則物體物件處於分離。如下圖:
總體上講,多面體物件間的分離測試需要考查下列軸:
平行於物體a的面法線的軸
平行於物體b
的面法線的軸
平行於物體a、b
各邊生成的叉積向量的軸
一旦找到分離軸,測試即可立刻退出並返回「分離」資訊。若全測試完且不存在,則物件間必定相交。
對於2d
物體,只需要考查兩物體所有邊的法向量即可。
分離軸測試的健壯性:
物體間相應邊的叉積向量可以構造分離軸,但是若兩向量平行,則叉積結果為0
向量,此時不適合用於分離軸。普遍採用以下方案:檢測叉積向量是否為(準)
0向量。若是,則重新生成與兩個邊向量垂直的新軸,或者僅忽略該軸。
下列**片段針對邊ab和cd
,給出健壯的分離軸測試的實現方式
:[cpp]view plain
copy
//commpute a tentative separating axis for ab and cd
vector m = cross(ab,cd);
if(!iszerovector(m)) else
//ab and ac are parallel too, so edges must be on a line. ignore testing
//the axis for this combination of edges as it won』t be a separating axis.
//(alternatively, lest if edges overlap on this line, in which case the
...
} 另外,若叉積向量過大,會導致計算過程中精度損失。如果並未限定輸入向量的範圍,則應在叉積計算之前對向量執行範化操作以保持相應的精度。
python碰撞檢測演算法 GJK碰撞檢測演算法
現實世界裡我們對於是否碰撞的判斷可以說極其容易而且準確,比如下圖。在二進位制的世界裡,一切就沒這麼直觀了。gjk gilbert johnson keerthi distance algorithm gjk 就是此次要實現的碰撞檢測演算法。如果對碰撞演算法有過了解的話,大概率聽過另乙個碰撞檢測演算法...
H5 JS 遊戲常用演算法 碰撞檢測 畫素檢測演算法
使用畫素碰撞檢測法算是最精確的演算法了,當然,帶來的代價也是比較明顯的,那就是效率上的低下。除非是在極為特殊的情況下,要求使用非常精確的碰撞,否則,一般情況下在遊戲中是不建議使用這種演算法,特別是在執行效率不太高的html5遊戲中。一般來說在使用畫素碰撞檢測之前會使用aabb矩形包圍盒先檢測兩個精靈...
J2ME中的基礎碰撞檢測演算法
j2me 中的基礎碰撞檢測演算法 出自 http blog.csdn.net mailbomb 在遊戲中,經常需要進行碰撞檢測的實現,例如判斷前面是否有障礙以及判斷子彈是否擊中飛機,都是檢測兩個物體是否發生碰撞,然後根據檢測的結果做出不同的處理。進行碰撞檢測的物體可能有些的形狀和複雜,這些需要進行組...