2014-03-14 45 views
0

我正在研究一個簡單的碰撞系統,重點是膠囊碰撞。使用許多資源,但主要是this site我已經能夠得到兩個膠囊相互碰撞。這種方法給了我兩條線段之間的最短距離。然後檢查兩個膠囊的組合半徑,看看是否發生碰撞。如何獲得兩個膠囊碰撞的時間

這是工作,但有兩個問題與此解決方案:

  1. 如果對象是移動速度非常快,在那裏他們將通過相互移動的點,半徑檢查會失敗,並且對象將通過對方。
  2. 當發生碰撞時,我無法知道如何使物體齊平以實際觸摸(例如,當角色落地時)。

我有另一個功能,我發現here使用球體,這將返回兩個球體將發生碰撞的時間。當使用此功能,並且我檢測到碰撞(時間< 1)時,我可以將該幀的對象速度乘以該時間,並使對象變爲齊平。我正在尋找一種方法來修改該網站中的段碰撞函數,以便爲該段提供與段相同的信息以分段碰撞。

回答

0

希望這是有益的...

通常,問題#1沒有直接的解決方案,將永遠纏着你。時間積分步驟必須足夠小以防止它與您使用的速度發生。 (這是尤其如此,如果你只能計算正距離= | x2-x1 | ...)

我真的沒有得到膠囊和球體之間的區別,但 不是你計算的距離,之前和DT後,每個維度:

dx = obj1.x - obj2.x; 
    dy = obj1.y - obj2.y; 
    dz = obj1.z - obj2.y; 
    dxlater = obj1.x + obj1.vx*dt - (obj2.x + obj2.vx*dt); 
    dylater = obj1.x + obj1.vy*dt - (obj2.y + obj2.vy*dt); 
    dzlater = obj1.x + obj1.vz*dt - (obj2.z + obj2.vz*dt); 

如果dx和dxlater有不同的標誌,該不明物體相撞,也就是說,如果:

if (dx*dxlater < 0) // collision occured 

,如果你想知道當碰撞發生,解決距離= T的RAD_SUM:(對於所有尺寸)

obj1.x + obj1.vx*tc - (obj2.x + obj2.vx*tc) = RAD_SUM 

應該是:

tc = (RAD_SUM + obj2.x - obj1.x)/(obj1.vx - obj2.vx) 

計算位置點爲正常,那麼新的速度,然後應用newspeeds直到那dt

+0

這聽起來像它會工作結束,但我沒有最近行的點(在你的例子中是obj1和obj2)。我只有距離。第一個鏈接中提供的算法使用矢量數學來獲取距離,而沒有辦法獲取該線的兩個端點。如果我能得到兩條線之間距離的終點,我可以嘗試你的解決方案。 – PicklesIIDX

+0

「兩條線之間的距離」是obj2.x-obj1.x,對吧? – Exceptyon