我正在使用JBox2D用Java编写程序。我需要找到两个纹理之间的确切碰撞点,如果它们碰撞的话。
我有代码来确定是否发生了碰撞,并且显然可以调用碰撞对象ID来确定哪些纹理发生碰撞。
我似乎无法弄清楚如何抓住碰撞本身的实际坐标。我阅读了文档,但它非常复杂,并没有直接解决这个问题。
这是我的代码:
import org.jbox2d.callbacks.ContactImpulse;
import org.jbox2d.callbacks.ContactListener;
import org.jbox2d.collision.Manifold;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Fixture;
import org.jbox2d.dynamics.contacts.Contact;
public class MyContactListener implements ContactListener{
//When they start to collide
public void beginContact(Contact c) {
System.out.println("CONTACT");
Fixture fa = c.getFixtureA();
Fixture fb = c.getFixtureB();
Vec2 posA = fa.getBody().getPosition();
Vec2 posB = fb.getBody().getPosition();
}
public void endContact(Contact c) {
}
public void preSolve(Contact c, Manifold m) {}
public void postSolve(Contact c, ContactImpulse ci){}
}
答案 0 :(得分:1)
要知道发生碰撞的位置,你应该知道有时不仅有一个碰撞点,而且还有一组点。
(从this manual中提取的图像)
正如上面的手册所说:
Box2D具有计算重叠形状的接触点的功能。 [......]这些要点将它们分为多种结构。 [...]
通常,您不需要直接计算接触流形,但是您可能会使用模拟中产生的结果。[...]如果您需要这些数据,通常最好使用{{3结构[...]。
您可以在return (new MyClass()).Select(x => x);
课程中访问它:
Contact c
重要:我从未使用过这个库(JBox2D),但我熟悉它(因为libGDX显然使用类似的(Box2D))。另外,我不知道JBox2D是否是Java的Box2D(C ++版),如果JBox2D和Box2D(libGDX版本)完全相关。因此,某些方法可能会发生变化(public void beginContact(Contact c) {
System.out.println("CONTACT");
WorldManifold worldmanifold;
worldmanifold = c.getWorldManifold();
for(Vec2 point : worldmanifold.points){
System.out.println("Contact at : [" + point.x + ", " + point.y "]");
}
}
可能是point.x
)。
您也可以查看WorldManifold,但这是针对C ++的(我用他们的答案回答你)。