Box2D 库 - 为什么当动态物体卡在静态物体和另一个动态物体之间时碰撞不能正常工作?
Box2D library - Why the collision doesn't work properly when a dynamic body is stuck between a static body and another dynamic body?
例如,一个动态物体在一个角落里,并且正在无限地走向那个角落里的墙壁(需要是一个静态物体)。如果另一个物体正朝同一个方向行走,并与第一个物体发生碰撞,则碰撞将被完全忽略。这是唯一会发生这种情况的情况。
下面是照片:
到下一个世界步时,绿色矩形与红色球重叠。如果没有静态物体,碰撞就可以正常进行。
提前致谢。
是Box2D特有的。如果一个动态物体垂直向另一个动态物体移动,并且在它们的路径上有一个静态物体,动态物体无论如何都会相互重叠。
要修复这个bug,可以使用contact listener来捕捉body碰撞的瞬间,直接根据red body的位置设置green body的位置。类似的东西:
public class CoreClass extends Game {
Array<Body> bodies = new Array<Body>();
World world = new World(new Vector2(0.0f, 0.0f), true);
Body bodyRed;
Body bodyGreen;
private float prevX;
private float prevY;
@Override
public void create() {
BodyDef bodyBD = new BodyDef();
bodyBD.type = BodyType.DynamicBody;
FixtureDef bodyFD = new FixtureDef();
bodyFD.density = 1.0f;
bodyFD.friction = 1.0f;
bodyFD.restitution = 1.0f;
bodyRed = world.createBody(bodyBD);
bodyGreen = world.createBody(bodyBD);
bodyRed.createFixture(bodyFD);
bodyGreen.createFixture(bodyFD);
prevX = bodyGreen.getPosition().x; prevY = bodyGreen.getPosition().y;
world.setContactListener(new ContactListener() {
@Override
public void beginContact(Contact contact) {
world.getBodies(bodies);
bodies.get(contact.getChildIndexA()).getPosition().set(prevX, prevY);
}
@Override
public void endContact(Contact contact) {
}
@Override
public void preSolve(Contact contact, Manifold oldManifold) {
}
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
}
});
}
@Override
public void render() {
super.render();
prevX = bodyGreen.getPosition().x;
prevY = bodyGreen.getPosition().y;
world.step(1/45f, 2, 6);
}
例如,一个动态物体在一个角落里,并且正在无限地走向那个角落里的墙壁(需要是一个静态物体)。如果另一个物体正朝同一个方向行走,并与第一个物体发生碰撞,则碰撞将被完全忽略。这是唯一会发生这种情况的情况。
下面是照片:
到下一个世界步时,绿色矩形与红色球重叠。如果没有静态物体,碰撞就可以正常进行。
提前致谢。
是Box2D特有的。如果一个动态物体垂直向另一个动态物体移动,并且在它们的路径上有一个静态物体,动态物体无论如何都会相互重叠。 要修复这个bug,可以使用contact listener来捕捉body碰撞的瞬间,直接根据red body的位置设置green body的位置。类似的东西:
public class CoreClass extends Game {
Array<Body> bodies = new Array<Body>();
World world = new World(new Vector2(0.0f, 0.0f), true);
Body bodyRed;
Body bodyGreen;
private float prevX;
private float prevY;
@Override
public void create() {
BodyDef bodyBD = new BodyDef();
bodyBD.type = BodyType.DynamicBody;
FixtureDef bodyFD = new FixtureDef();
bodyFD.density = 1.0f;
bodyFD.friction = 1.0f;
bodyFD.restitution = 1.0f;
bodyRed = world.createBody(bodyBD);
bodyGreen = world.createBody(bodyBD);
bodyRed.createFixture(bodyFD);
bodyGreen.createFixture(bodyFD);
prevX = bodyGreen.getPosition().x; prevY = bodyGreen.getPosition().y;
world.setContactListener(new ContactListener() {
@Override
public void beginContact(Contact contact) {
world.getBodies(bodies);
bodies.get(contact.getChildIndexA()).getPosition().set(prevX, prevY);
}
@Override
public void endContact(Contact contact) {
}
@Override
public void preSolve(Contact contact, Manifold oldManifold) {
}
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
}
});
}
@Override
public void render() {
super.render();
prevX = bodyGreen.getPosition().x;
prevY = bodyGreen.getPosition().y;
world.step(1/45f, 2, 6);
}