好吧,所以我试图模拟二维平面上球的碰撞。使用位置和半径之和的简单比较,我可以很容易地检测到碰撞,但是,有时仿真会领先于自身,圆会重叠,这对其余的仿真造成了破坏。

因此,我想出了基本上需要做的事情,就是在接触点找到两个圆之间的法线向量并将其添加到该方向的位置向量上,幸运的是,我有一个类似的算法来处理碰撞引起的速度变化,因此我因此进行了调整:

Vector2 normal = orgA.getCenterPosition() - orgB.getCenterPosition();
Vector2 tangent = new Vector2((normal.Y * -1), normal.X);

float diff = (orgA.getRadius() + orgB.getRadius()) - normal.Length();

normal.Normalize();

float PAn = Vector2.Dot(normal, orgA.position);
float PAt = Vector2.Dot(tangent, orgA.position);

PAn += diff;

float PBn = Vector2.Dot(normal, orgB.position);
float PBt = Vector2.Dot(tangent, orgB.position);

PBn -= diff;

Vector2 PA = (PAn * normal) + (PAt * tangent);
Vector2 PB = (PBn * normal) + (PBt * tangent);

orgA.position = PA;
orgB.position = PB;


麻烦的是,当我运行模拟并碰到两个球时,整个过程变得很疯狂,突然间他们遍地都是。

谁能看到我算法中的缺陷?我已经查看了它的负载,但仍然找不到导致此问题的原因。

最佳答案

嘿,伙计,我认为您需要的是循环。它之所以疯狂,是因为一旦碰到球,它们就会不断以新的逻辑进行升级。

我对此并不感到惊讶,但尝试将碰撞循环...应该看起来像这样:

if ( diff < (orb radius))
{
Vector2 PA = (PAn * normal) + (PAt * tangent);
Vector2 PB = (PBn * normal) + (PBt * tangent);

orgA.position = PA;
orgB.position = PB;
}


这样的东西...我真的希望这会有所帮助:/

根据我的理解,这是您的更新方法中的内容,因此请记住,更新每毫秒持续运行一次...因此,当您获得球体和尺寸之间的差异,但是在它们发生碰撞并且您希望它们在一定的范围内移动时,这很好一遍又一遍地计算相同方程的方式...

最好还是制作一个像isCollided这样的布尔值,并确保您根据该语句切换对/错

希望它对我有碰撞的示例项目有帮助,如果您希望我可以将其发送给您,samerhachem@hotmail.com

10-08 02:58
查看更多