子弹和敌人之间的碰撞检测

时间:2012-11-22 11:28:35

标签: collision-detection

我一直在尝试将碰撞检测实现到我正在进行的简单游戏中。我环顾四周,一切都让我回到了我为我所做的事情。但是它不太有用。我错过了什么吗?或者我完全错了?

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;
}

2 个答案:

答案 0 :(得分:1)

此代码的哪些方案不起作用?我想这个算法可以工作(找到两个物体之间的距离小于它们的半径),遇到速度大的物体时也可能存在严重的不准确性。

您可能遇到的一个问题是您无法准确确定碰撞时间,因为您假设碰撞只能发生在动画帧的末尾而不是帧中。动画帧假定速度在0 - >之间恒定。 1已经使用加速度来计算V。

为了简单起见,我建议将两个物体近似为半径为R1和R2的球体。

如果是这种情况,您需要考虑:

1 - 两个身体的半径。在这种情况下,敌人将是半径为0的点,子弹将具有半径getBulletSize();

2 - 动画帧期间子弹和敌人的速度在0&lt; = t&lt; = 1之间。

当| r1 + r2 |发生碰撞时&LT; d,其中d是两个物体质心之间的距离。

d为P(t)-Q(t),Q和P为两个物体的质心。 P(t)= P0 + Vp * t。 Q(t)= Q0 + Vq * t。

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

=&GT; d = P(t) - Q(t)

求解情况(R1 + R2)^ 2 =(P(t) - Q(t))^ 2将产生碰撞时间。不要害怕这个公式!它解决了一个简单的二阶多项式,其二次方程式将解决t。如果B ^ 2>在公式中0,当时间最小时,第一次发生表面碰撞!

碰撞案例:

在以下情况下发生:

1)0 <= t <= 1。

初步检查:

2)最小d(半径条件的导数= 0)必须<1。 R1 + R2

希望这会有所帮助!!!如果我误解了你或者说的是胡言乱语,请告诉我。)

答案 1 :(得分:0)

仅仅是对dist的比较太小,我没有注意到。 感谢。