big*_*zer 7 java physics collision box2d jbox2d
我正在使用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){}
}
Run Code Online (Sandbox Code Playgroud)
要知道碰撞发生在哪里,您应该知道有时碰撞不仅是一个点,而是一组点。
(图片摘自本手册)
正如上面的手册所说:
Box2D 具有计算重叠形状接触点的函数。[...]这些点[...]将它们组合成一个流形结构。[...]
通常您不需要直接计算接触流形,但是您可能会使用模拟中生成的结果。[...]如果您需要此数据,通常最好使用WorldManifold结构[...]。
您可以在类中访问它Contact c:
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 "]");
}
}
Run Code Online (Sandbox Code Playgroud)
重要提示:我从未使用过这个库(JBox2D),但是,我很熟悉它(因为 libGDX 显然使用了类似的库(Box2D))。另外,我不知道 JBox2D 是否是 Java 的 Box2D(C++ 版本),以及 JBox2D 和 Box2D(libGDX 版本)是否相关。所以也许有些方法可以改变(point.x可能是point.getX())。
你也可以查看这个网站,但这是针对 C++ 的(我用他们的答案来回答你)。
| 归档时间: |
|
| 查看次数: |
405 次 |
| 最近记录: |