JBox2D - 查找碰撞坐标
JBox2D - Find collision coordinates
我正在 Java 使用 JBox2D 编写程序。我需要找到两个纹理之间的确切碰撞点,如果它们发生碰撞以及何时发生碰撞。
我有确定是否发生碰撞的代码,并且显然可以调用碰撞对象 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){}
}
要知道哪里发生了碰撞,就要知道有时候碰撞的点不是只有一个点,而是一组点。
(图片摘自this manual)
正如上面的手册所说:
Box2D has functions to compute contact points for overlapping shapes. [...] These points [...] groups them into a manifold structure. [...]
Normally you don't need to compute contact manifolds directly, however you will likely use the result produced in the simulation.[...] If you need this data, it is usually best to use the WorldManifold structure [...].
您可以在 Contact c
class:
中访问它
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 "]");
}
}
重要:我从未使用过这个库 (JBox2D),但是,我很熟悉它(因为 libGDX 显然使用了类似的库 (Box2D) ).另外,我不知道 JBox2D 是否是 Java 的 Box2D(C++ 之一),以及 JBox2D 和 Box2D(libGDX 一个)是否相关。所以也许有些方法可以改变(point.x
可能是 point.getX()
)。
你也可以检查 this site,但这是针对 C++ 的(我使用他们的答案来回答你)。
我正在 Java 使用 JBox2D 编写程序。我需要找到两个纹理之间的确切碰撞点,如果它们发生碰撞以及何时发生碰撞。
我有确定是否发生碰撞的代码,并且显然可以调用碰撞对象 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){}
}
要知道哪里发生了碰撞,就要知道有时候碰撞的点不是只有一个点,而是一组点。
(图片摘自this manual)
正如上面的手册所说:
Box2D has functions to compute contact points for overlapping shapes. [...] These points [...] groups them into a manifold structure. [...]
Normally you don't need to compute contact manifolds directly, however you will likely use the result produced in the simulation.[...] If you need this data, it is usually best to use the WorldManifold structure [...].
您可以在 Contact c
class:
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 "]");
}
}
重要:我从未使用过这个库 (JBox2D),但是,我很熟悉它(因为 libGDX 显然使用了类似的库 (Box2D) ).另外,我不知道 JBox2D 是否是 Java 的 Box2D(C++ 之一),以及 JBox2D 和 Box2D(libGDX 一个)是否相关。所以也许有些方法可以改变(point.x
可能是 point.getX()
)。
你也可以检查 this site,但这是针对 C++ 的(我使用他们的答案来回答你)。