球对球碰撞.检测和处理在Stack溢出社区的帮助下,我编写了一个非常基本但有趣的物理模拟器。你点击并拖动鼠标来发射一个球。它会弹来跳去,最后停在“地板”上。我想加入的下一个大特性是球对球的碰撞。球的运动被分解成x和y的速度矢量。我有重力(y矢量的每一步的小约化),我有摩擦力(两个向量的小减缩,每一次与墙的碰撞)。这些球诚实地以一种令人惊讶的现实的方式移动。我想我的问题有两部分:什么是检测球对球碰撞的最佳方法?我是否只有一个O(n^2)循环,对每个球进行迭代,并检查其他每个球的半径是否重叠?我用什么方程来处理球到球的碰撞?物理101它如何影响两个球的速度x/y矢量?这两个球的方向是什么?我该如何把这个应用到每个球上?处理碰撞检测的“墙壁”和由此产生的矢量变化是容易的,但我看到更复杂的球-球碰撞。对于墙壁,我只需取适当的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)));
}源代码:完整的源球到球对撞机。如果有人对如何改进这个基本的物理模拟器有一些建议,请告诉我!有一件事我还没有补充,那就是角动量,所以球会更现实地滚动。还有其他建议吗?留下评论!
添加回答
举报
0/150
提交
取消