相关疑难解决方法(0)

球与球的碰撞 - 检测和处理

在Stack Overflow社区的帮助下,我写了一个非常基本但有趣的物理模拟器.

替代文字

单击并拖动鼠标以启动球.它会反弹并最终停在"地板"上.

我想要添加的下一个重要特征是球与球的碰撞.球的运动被分解为ax和y速度矢量.我有重力(每一步的y矢量小减少),我有摩擦(每次与墙碰撞的两个矢量的小减少).球真诚地以令人惊讶的逼真方式移动.

我想我的问题有两个部分:

  1. 检测球与球碰撞的最佳方法是什么?
    我是否只有一个O(n ^ 2)循环遍历每个球并检查每个其他球以查看它的半径是否重叠?
  2. 我用什么方程来处理球与球的碰撞?物理101
    它如何影响两个球的速度x/y向量?两个球进入的最终方向是什么?我如何将其应用于每个球?

替代文字

处理"墙壁"的碰撞检测和由此产生的矢量变化很容易,但我发现球 - 球碰撞的并发症更多.对于墙壁,我只需要采取适当的x或y向量的负数,然后关闭它将朝正确的方向前进.有球我认为不是这样.

一些快速澄清:为了简单起见,我现在可以完全弹性碰撞,现在我的所有球都具有相同的质量,但我将来可能会改变它.


编辑:我发现有用的资源

带矢量的2d球物理:无三角碰撞的二维碰撞.pdf
2d球碰撞检测示例:添加碰撞检测


成功!

我的球碰撞检测和响应工作很棒!

相关代码:

碰撞检测:

for (int i = 0; i < ballCount; i++)  
{  
    for (int j = i + 1; j < ballCount; j++)  
    {  
        if (balls[i].colliding(balls[j]))  
        {
            balls[i].resolveCollision(balls[j]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将检查每个球之间的碰撞但跳过多余的检查(如果你必须检查球1是否与球2碰撞,那么你不需要检查球2是否与球1碰撞.此外,它会跳过检查是否与自身发生碰撞).

然后,在我的球类中,我有我的colliding()和resolveCollision()方法:

public boolean colliding(Ball ball)
{
    float xd = position.getX() - ball.position.getX();
    float yd = position.getY() - ball.position.getY();

    float sumRadius = getRadius() + ball.getRadius();
    float sqrRadius …
Run Code Online (Sandbox Code Playgroud)

language-agnostic graphics physics collision-detection

262
推荐指数
7
解决办法
18万
查看次数