膠囊體:給定一條線段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來執行不同的方法。以下為判斷碰撞後的方...