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

单击并拖动鼠标以启动球.它会反弹并最终停在"地板"上.
我想要添加的下一个重要特征是球与球的碰撞.球的运动被分解为ax和y速度矢量.我有重力(每一步的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)