2012-11-22 47 views
0

我一直在嘗試將碰撞檢測實現爲一個簡單的遊戲。我環顧四周,所有事情都回到了我爲我的發明做的等式上。然而它並不完美。我錯過了什麼嗎?還是我完全錯了?子彈和敵人之間的碰撞檢測

bool collisionquery(enemy z){ 
    double dist = sqrt((px - z.getpx()) * (px - z.getpx()) + 
         (py - z.getpy()) * (py - z.getpy()) + 
         (pz - z.getpz()) * (pz - z.getpz())); 

    if (dist < 0.1*getbulletsize()) 
    { 
     cout << "hit\n"; 
     return true; 
    } 
    return false; 
} 
+0

它看起來OK;也許增加你比較'dist'的邊際?你只考慮子彈大小,而不是敵人的大小。 – Kos

+0

謝謝你,生病讓我去:) –

+0

我假設你的子彈正在移動?它可能只是移動得太快,以至於在檢查它在敵人的前面或後面的離散時間裏,從來沒有註冊過命中。子彈的大小,你也不會給自己很大的空間。 – Bart

回答

1

此代碼不適用於哪些情況?我想這個算法會起作用(發現兩個物體之間的距離小於它們的半徑),當遇到速度很大的物體時可能會有嚴重的不準確性。

可能會遇到的一個問題是,不能準確地確定碰撞的時間,因爲你正在承擔碰撞可以只發生在一個動畫幀的末端,而不是在該幀期間。一個動畫幀假定的速度爲0之間恆定 - 在加速度已經被用於計算V.

爲了簡單起見> 1,我建議近似兩個機構與半徑R1和R2的球體。

如果是這樣的話,你就需要考慮:

1 - 這兩個機構的半徑。在這種情況下,敵人將是半徑爲0的點,並且子彈將具有半徑getBulletSize();

2 - 動畫幀中子彈和敵人的速度介於0 < = t < = 1之間。

碰撞的情況時纔會發生| R1 + R2 | d,其中d是兩個物體質心之間的距離。

d被給定爲P(噸) - Q(t)的,Q和P是兩個對象的質心。 P(t)= P 0 + V p * t。 Q(t)= Q0 + Vq * t。

Vp = P1-P0; Vq = Q1-Q0;

=> d = P(T) - Q(t)的

求解的情況下(R1 + R2)^ 2 =(P(T) - Q(t))的^ 2將產生時間的碰撞。不要害怕這個公式!它解決了一個二次公式將解決t的簡單二階多項式問題。如果公式中的B^2> 0,則當時間最小時發生第一次表面碰撞!

碰撞例:

時發生,如果:

1)0 < =噸< = 1

初步檢查:

2)最小d(半徑條件衍生物= 0 )必須< R1 + R2

希望這有助於!讓我知道如果我誤解你或者是說廢話:)

0

簡直太小了,我沒有注意到dist的比較。 謝謝。