球对球碰撞.检测和处理

球对球碰撞.检测和处理

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


你点击并拖动鼠标来发射一个球。它会弹来跳去,最后停在“地板”上。

我想加入的下一个大特性是球对球的碰撞。球的运动被分解成x和y的速度矢量。我有重力(y矢量的每一步的小约化),我有摩擦力(两个向量的小减缩,每一次与墙的碰撞)。这些球诚实地以一种令人惊讶的现实的方式移动。

我想我的问题有两部分:

  1. 什么是检测球对球碰撞的最佳方法?

    我是否只有一个O(n^2)循环,对每个球进行迭代,并检查其他每个球的半径是否重叠?
  2. 我用什么方程来处理球到球的碰撞?物理101

    它如何影响两个球的速度x/y矢量?这两个球的方向是什么?我该如何把这个应用到每个球上?

https://img3.mukewang.com/5d1193f500019d1503500200.jpg

处理碰撞检测的“墙壁”和由此产生的矢量变化是容易的,但我看到更复杂的球-球碰撞。对于墙壁,我只需取适当的x或y向量的负数,它就会朝正确的方向走。我不认为是这样的。

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


编辑:我发现有用的资源

带矢量的二维球物理:没有三角函数的二维碰撞
二维球碰撞检测实例:加碰撞检测


成功!

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

相关守则:

碰撞检测:

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

这将检查每个球之间的碰撞,但跳过冗余检查(如果必须检查球1是否与球2发生碰撞,则不需要检查球2是否与球1发生碰撞。而且,它跳过了检查与自身的碰撞)。

然后,在我的球类中,我有了CONICING()方法和RESSIVE Collision()方法:

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 = sumRadius * sumRadius;

    float distSqr = (xd * xd) + (yd * yd);

    if (distSqr <= sqrRadius)
    {
        return true;
    }

    return false;
}

public void resolveCollision(Ball ball)
{
    // get the mtd
    Vector2d delta = (position.subtract(ball.position));
    float d = delta.getLength();
    // minimum translation distance to push balls apart after intersecting
    Vector2d mtd = delta.multiply(((getRadius() + ball.getRadius())-d)/d); 


    // resolve intersection --
    // inverse mass quantities
    float im1 = 1 / getMass(); 
    float im2 = 1 / ball.getMass();

    // push-pull them apart based off their mass
    position = position.add(mtd.multiply(im1 / (im1 + im2)));
    ball.position = ball.position.subtract(mtd.multiply(im2 / (im1 + im2)));


}

源代码:完整的源球到球对撞机。

如果有人对如何改进这个基本的物理模拟器有一些建议,请告诉我!有一件事我还没有补充,那就是角动量,所以球会更现实地滚动。还有其他建议吗?留下评论!


暮色呼如
浏览 686回答 0
0回答
打开App,查看更多内容
随时随地看视频慕课网APP