我一直在尝试将碰撞检测实现到我正在进行的简单游戏中。我环顾四周,一切都让我回到了我为我所做的事情。但是它不太有用。我错过了什么吗?或者我完全错了?
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 :(得分: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的比较太小,我没有注意到。 感谢。