如何防止碰撞中的两个物体同时交叉
Posted
技术标签:
【中文标题】如何防止碰撞中的两个物体同时交叉【英文标题】:How to prevent two objects in collisions from crossing both 【发布时间】:2015-04-15 19:40:12 【问题描述】:我想知道如何防止一个物体穿过另一个物体。我有一个球和一个正方形,我可以用鼠标移动它们。当我的球在我的方格上时,如果我走得很慢,我会移动它(例如在顶部),如果没有穿过它,球就会留在方格上。
【问题讨论】:
【参考方案1】:如果您的 2 个对象都定义了一个固定装置,它们将无法相互交叉,这是一个示例,说明如何必须创建一个受 BOX2D 世界中物理影响的动态对象,并且该对象也可以不要通过传感器隧道:
public Ball (World world)
this.world = world;
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.DYNAMIC;
bodyDef.position.set(0.0f/RATE, 0.0f/RATE);
Ballbody = world.createBody(bodyDef);
CircleShape circle = new CircleShape();
radius = (int) (Math.random()*30+15); // you can set a non randum raduis
circle.m_radius = radius/RATE;
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = circle;
fixtureDef.restitution = 0.8f;
fixtureDef.density = 2.0f;
fixtureDef.friction = 0.3f;
fixtureDef.filter.groupIndex = -1;
Ballbody.createFixture(fixtureDef);
Ballbody.getFixtureList().setUserData("Ballounaton"); // optional
Vec2 ballVec = new Vec2((float) (Math.random()*8+2),0.0f);
Ballbody.setLinearVelocity(ballVec);
确保为您的 box2d 动态或静态对象定义一个夹具,以避免像本示例中那样通过传感器隧道:
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = circle;
fixtureDef.restitution = 0.8f;
fixtureDef.density = 2.0f;
fixtureDef.friction = 0.3f;
fixtureDef.filter.groupIndex = -1;
Ballbody.createFixture(fixtureDef);
根据BOX2D官方文档:
回想一下,形状不了解物体,可以使用 独立于物理模拟。因此 Box2D 提供了 b2Fixture 类将形状附加到主体。夹具保持 以下:
单一形状 广泛阶段代理 密度、摩擦和恢复 冲突过滤标志 返回到父正文的指针 用户数据 传感器标志
【讨论】:
当我不移动方球时它不起作用,但如果我缓慢移动它(到顶部)它会停留但很快它不会停留 运动:if (body.getUserData().getClass() == Square.class) if (Mouse.isButtonDown(0)) System.out.println("ok"); Vec2 mousePosition = new Vec2(Mouse.getX(), Mouse.getY()).mul(0.5f).mul(1/3f); PhysicalObject newPhysicalObject = new Square(world,mousePosition.x,mousePosition.y); physicalObjects.set(index, newPhysicalObject); world.destroyBody(object.getBody());
将代码添加到您的问题中,请格式化!
提供了一个链接到管理身体创建的班级,我可以看到你是如何实现它们的!!
我修复了我的世界步法(60hz)的问题以上是关于如何防止碰撞中的两个物体同时交叉的主要内容,如果未能解决你的问题,请参考以下文章