球碰撞:球粘在一起

10

我按照这个例子http://www.emanueleferonato.com/2007/08/19/managing-ball-vs-ball-collision-with-flash/创建了在Android上的球碰撞,
我的代码组织如下:

int N = 6; // number of balls
for (int i=0; i<N; i++) {
    // move ball
    // as in line 10~39

    // collision detection
    for(int j=i+1; j<N; j++) {
        // as in line 66~77
    } // end for
} // end for

然而,有时我的球可能会粘在一起(重叠)。 在这个例子中没有发生同样的情况。 为什么? 我需要为每个球启动一个线程吗?


7
使用婴儿爽身粉。 - Glendon Trullinger
2个回答

2

这个问题会在两个球具有足够的速度相撞并且无法完全分离的情况下出现。我发现处理这个问题的最佳方法是在检测到碰撞时将它们之间的距离规范化为(r1 + r2),其中r是球的半径。这确保了它们在后续的动作循环中会分离,但如果有很多球在一个非常狭小的空间内,则存在一些可能导致额外碰撞的潜在风险。


我不擅长数学, 我不知道如何在计算中应用你的归一化。 你能给我演示一下吗? - user538565

1

这可能是

ball.xspeed = Math.random()*8-4;
ball.yspeed = Math.random()*8-4;

这些生成浮点数的xspeed和yspeed。它们的四舍五入/浮点数/向上取整值用于在屏幕上绘制。我认为当碰撞检测例程运行并检查碰撞时,如果球只有很小的计算距离,则无法找到碰撞,但是当速度更高时,下一步将把球推向其边界。一旦它们相互包含,function manage_bounce(ball, ball2)将在每个增量上被调用,并尝试调整反弹方向,但只会发现另一个碰撞。

我认为主要问题是由于速度大而两个球之间的距离很小,它们被推到彼此内部,而不是浮点计算。

在计算过程中,当您检测到碰撞时,应确保此时它们不相互包含,如果是,则将它们取出并重新定位。或者,如果两个球之间的距离比添加的距离更远,则可以考虑速度增量,或类似的解决方案。

if the balls are `dn` pixels apart 
  if the speed in direction `n` is `n_speed`
     then
       if `dn` < `n_speed`
         `n = n + dn`
       else
          `n = n + n_speed`
       endif
  endif
endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接