0

我一直在尝试在我正在制作的简单游戏中实现碰撞检测。我环顾四周,一切都让我回到了我为我的 dist 所做的方程式。然而,它并不完全奏效。我错过了什么吗?还是我完全错了?

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

2 回答 2

1

此代码不适用于哪些场景?我想这个算法会起作用(发现两个物体之间的距离小于它们的半径),当遇到大速度的物体时可能会出现严重的错误。

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

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

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

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

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

|r1 + r2| 时会发生碰撞的情况。< 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;

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

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

碰撞案例:

在以下情况下发生:

1) 0 <= t <= 1。

初步检查:

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

希望这可以帮助!!!让我知道我是否误解了你或在胡言乱语:)

于 2013-02-25T23:20:40.287 回答
0

只是与 dist 的比较太小了,我没有注意到。谢谢。

于 2012-12-01T17:03:51.340 回答