2011-04-05 75 views
1

我有两个圆圈的碰撞下面的工作代码,但现在我有特殊的圈子不应该移动。当试图将它们与现有的代码一起使用时,移动的圆圈开始围绕静止的“螺栓”,不动的圆圈(当我说绕轨道时,我的意思是圆圈围绕圆圈旋转,同时触摸它一段时间,直到它到达另一边,然后继续它的原始方向)。我试图让静态代码的一部分工作(参见巨大的注释部分),但它只有一半工作。我的正常大小的圆圈在大多数时间都工作正常,但有时它仍然在轨道上。另外,我还有另一个不受摩擦影响的特殊圆圈,它更小,而且几乎总是绕着轨道旋转。有谁知道我的问题是什么?我有一半理解这里的数学运算,我从一些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()); 
+0

重新格式化的代码;如果不正确请回复。 – trashgod 2011-04-05 00:15:26

+0

@trashgod:你改变了代码,或者你只是更好地看待? – 2011-04-05 00:17:13

+0

我相信只是压痕。 – trashgod 2011-04-05 00:19:39

回答

1

要理解向量的方法是如何工作的,你可以从中得到articleexample一些见解。这种“轨道”异常的一个来源是可变向量的不正确实现;彻底的单元测试至关重要。没有简单的方法来调试这样的代码片段;你可能需要准备一个sscce

+0

我读过那篇文章,甚至试图使用这些相同的步骤来实现它,但它比我已经注释掉的代码差。我一定在做错事 – 2011-04-05 00:50:42

+0

我猜你的圈子在你检查碰撞时多半重叠了一个半径,尝试更频繁地检查或每次迭代移动更少的像素。 – trashgod 2011-04-05 01:10:13

+0

这没有意义?它们如何重叠超过半径? – 2011-04-05 01:56:17