圆形碰撞错误,圆圈轨道不动圈
我有两个圆圈的碰撞下面的工作代码,但现在我有特殊的圈子不应该移动。当试图将它们与现有的代码一起使用时,移动的圆圈开始围绕静止的“螺栓”,不动的圆圈(当我说绕轨道时,我的意思是圆圈围绕圆圈旋转,同时触摸它一段时间,直到它到达另一边,然后继续它的原始方向)。我试图让静态代码的一部分工作(参见巨大的注释部分),但它只有一半工作。我的正常大小的圆圈在大多数时间都工作正常,但有时它仍然在轨道上。另外,我还有另一个不受摩擦影响的特殊圆圈,它更小,而且几乎总是绕着轨道旋转。有谁知道我的问题是什么?我有一半理解这里的数学运算,我从一些gamasutra文章中得到了它。圆形碰撞错误,圆圈轨道不动圈
//move them apart so they don't intersect anymore
float distance = (float) Math.sqrt(((circleA.getCenterX() - circleB.getCenterX()) * (circleA.getCenterX() - circleB.getCenterX())) + ((circleA.getCenterY() - circleB.getCenterY()) * (circleA.getCenterY() - circleB.getCenterY())));
float separation = (circleA.getRadius() + circleB.getRadius()) - distance;
float xSepA = separation * (circleA.getCenterX() - circleB.getCenterX())/distance/2; //distance to move circleA in x dir
float ySepA = separation * (circleA.getCenterY() - circleB.getCenterY())/distance/2; //distance to move A in y dir
float xSepB = separation * (circleB.getCenterX() - circleA.getCenterX())/distance/2; //same for B
float ySepB = separation * (circleB.getCenterY() - circleA.getCenterY())/distance/2;
if (circleA.isStatic()) {
xSepA = 0;
ySepA = 0;
xSepB = separation * (circleB.getCenterX() - circleA.getCenterX())/distance; //same for B
ySepB = separation * (circleB.getCenterY() - circleA.getCenterY())/distance;
}
if (circleB.isStatic()) {
xSepA = separation * (circleA.getCenterX() - circleB.getCenterX())/distance;
ySepA = separation * (circleA.getCenterY() - circleB.getCenterY())/distance;
xSepB = 0;
ySepB = 0;
}
//moving them
circleA.setX(circleA.getX() + xSepA);
circleA.setY(circleA.getY() + ySepA);
circleB.setX(circleB.getX() + xSepB);
circleB.setY(circleB.getY() + ySepB);
//change velocity to bounce
Vector2f va = circleA.getVelocityVector();
Vector2f vb = circleB.getVelocityVector();
Vector2f vn = MathUtil.sub(circleA.getPositionVector(), circleB.getPositionVector());
vn.normalise();
float aa = va.dot(vn);
float ab = vb.dot(vn);
float optimizedPA = (2f * (aa - ab))/(circleA.getMass() + circleB.getMass());
float optimizedPB = (2f * (ab - aa))/(circleA.getMass() + circleB.getMass());
Vector2f newVA = MathUtil.sub(va, MathUtil.scale(vn, optimizedPA * circleB.getMass()));
Vector2f newVB = MathUtil.sub(vb, MathUtil.scale(vn, optimizedPB * circleA.getMass()));
// if (circleA.isStatic()) {
// optimizedPB = (2f * (ab - aa))/(circleB.getMass());
// newVA = va;
// newVB = MathUtil.sub(vb, MathUtil.scale(vn, optimizedPB));
// System.out.println(vb + " " + newVB);
// } else if (circleB.isStatic()) {
// optimizedPA = (2f * (aa - ab))/(circleA.getMass() + circleB.getMass());
// newVA = MathUtil.sub(va, MathUtil.scale(vn, optimizedPA));
// newVB = vb;
// System.out.println(va + " " + newVA);
// }
circleA.setVX(newVA.getX());
circleA.setVY(newVA.getY());
circleB.setVX(newVB.getX());
circleB.setVY(newVB.getY());
要理解向量的方法是如何工作的,你可以从中得到article和example一些见解。这种“轨道”异常的一个来源是可变向量的不正确实现;彻底的单元测试至关重要。没有简单的方法来调试这样的代码片段;你可能需要准备一个sscce。
我读过那篇文章,甚至试图使用这些相同的步骤来实现它,但它比我已经注释掉的代码差。我一定在做错事 – 2011-04-05 00:50:42
我猜你的圈子在你检查碰撞时多半重叠了一个半径,尝试更频繁地检查或每次迭代移动更少的像素。 – trashgod 2011-04-05 01:10:13
这没有意义?它们如何重叠超过半径? – 2011-04-05 01:56:17
重新格式化的代码;如果不正确请回复。 – trashgod 2011-04-05 00:15:26
@trashgod:你改变了代码,或者你只是更好地看待? – 2011-04-05 00:17:13
我相信只是压痕。 – trashgod 2011-04-05 00:19:39