碰撞檢測 膠囊體碰撞檢測

2021-07-24 21:15:38 字數 1120 閱讀 1260

膠囊體:給定一條線段l,所有道l的距離為r的點的集合。

由定義可知,膠囊體由半徑r和線段l標識。檢測兩個膠囊體是否發生碰撞,即檢測兩條線段l1、l2的最短距離d是否大於l1、l2的半徑r1、r2之和,d  > r1 + r2 ,則未碰撞,否則發生碰撞。

設線段l1端點為a1、a2,線段l2端點為b1、b2,「 * 」號表示兩向量做叉積。

1、如果線段l1、l2共線,直接比較端點距離,得到最小值。

判斷共線條件:向量  a1a2 * b1b2 = 0,a1a2  *  a1b1 = 0   (四個點任意組合成兩個向量,都平行)

2、如果l1、l2共面(不共線),取l1的中點c1,並做垂線垂直於l2,垂足為c1,保留c1、c2;

因為c1、c2不一定存在於線段l1、l2上,此時最短距離d有9種可能(見下面偽**)

if c1if c2else if b2else  d=|a1c2|;

else if a2if c2else if b2else  d=|a2c2|;

else

if c2else if b2else  d=|c1c2|;

判斷共面條件:a1a2  *  b1b2  =  0 (即兩個向量平行)

3、如果l1、l2異面,求出共垂線與l1、l2的交點c1、c2

空間中兩異面直線共垂線及其交點求解過程

為了方便程式設計,我用向量進行求解:

l1、l2的方向向量v1、v2(即向量a1a2、b1b2單位化)作叉積得到共垂線方向向量v3 = v1 * v2,

v1、v3作叉積得到l1與共垂線組成的平面的法向量 n = v1 * v3 ,平面方程為  n * (x , y , z) + q = 0

q = -( n * (x , y , z))

令 k = (n * b1 + q) /  (n * b0b1)

l1與共垂線交點 c1 = k * q + b0 ,

用同樣的方法可求得l2與共垂線的交點 c2.

同共面(不共線)的情況,因為上述求共垂線交點是基於l1、l2是直線,而我們實際情況是l1、l2是線段,c1、c2不一定位於線段l1、l2上,此時最短距離同樣是9中情況,判斷方法與共面(不共線)的情況相同。

到此,只需要比較最短距離d與兩個膠囊體半徑r1、r2的大小即可判斷兩膠囊體是否碰撞。

Unity碰撞檢測

碰撞個必要條件為兩個角色必須都掛載 rigibody 剛體元件,至少乙個角色掛載 collider指令碼 第一種 觸發器,必須開啟 collider的 istrigger 為 true 兩個碰撞物件會相互穿過 void ontriggerenter collider collider 開始觸發器 v...

cocos碰撞檢測

兩個矩形的碰撞檢測,主要看boundingbox是否接觸 rect rc1 spriteauto getboundingbox rect rc2 spritectrl getboundingbox if rc1.intersectsrect rc2 則認為碰撞 兩個圓的碰撞檢測,看圓心距離 poin...

碰撞檢測問題

我們在進行碰撞檢測的時候,可以使用collider方法 即碰撞器 通常使用collider時,兩物體檢測碰撞器時,兩物體中至少有乙個應為剛體元件。我們一般建議移動物體設定為剛體,因為物體長時間不運動其剛體元件可能會休眠。collider通常是根據判斷目標的tag來執行不同的方法。以下為判斷碰撞後的方...