物体即使在子弹模式下也能穿透

时间:2014-05-18 10:21:16

标签: c++ box2d collision-detection physics

我在Box2D中有两个圆形的动态物体,都是通过调用这个例程:

Disk *World::AddDisk(float32 x, float32 y, float32 radius, float32 density) {
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(x, y);
    bodyDef.bullet = true;
    b2Body *body = this->world.CreateBody(&bodyDef);

    b2CircleShape shape;
    shape.m_p.Set(0, 0);
    shape.m_radius = radius;

    b2FixtureDef fixtureDef;
    fixtureDef.shape = &shape;
    fixtureDef.density = density;
    fixtureDef.restitution = 0.8;
    b2Fixture *fixture = body->CreateFixture(&fixtureDef);

    Disk *d = new Disk(this, body, fixture);
    this->disks.push_back(d);
    return d;
}

这些是创建我的两个圈子的电话:

world.AddDisk(0, 0, 10, 5.97219e+12);
world.AddDisk(20, 20, 5, 1);

我尝试通过在重力为零时对一个施加一定的力来对抗较小的一个圆盘。圆圈穿透了一个显着的数量(虽然不是很小)。

我也尝试使用法向重力,将较大的圆的重力缩放到零。另一个正常移动,但是经过一次小小的穿透之后再次被击退。

不是子弹模式(即CCD)应该消除渗透吗?起初我认为圆圈穿透的原因是我对一个人施加一个恒定的力,而不是在他们触碰时不考虑法向力。但后来我发现Box2D的引力也是如此。任何想法在这里发生了什么?

1 个答案:

答案 0 :(得分:2)

CCD旨在消除隧道效应,而不是相互渗透。当动态物体与静止物体碰撞时,它特别消除了隧道效应。它对两个动态实体的作用不同。

我见过的每一种游戏物理引擎都有相互渗透,特别是当身体的质量差异很大时。避免这种情况的一个好的经验法则是保持身体的质量比小于10:1(当然,如果Box2D手册建议不同的比例,那么就这样)。降低时间步长也有帮助。