0

我正在尝试使用box2dweb在 2D 中创建类似汽车的东西。我有一个用于车身的盒子和两个圆圈,通过旋转接头连接到它,作为车轮。一段时间内一切正常,但车轮中心与它们所连接的盒子上的点之间的间隙逐渐增加。为求解器设置更多迭代无济于事,而且轮子迟早会完全离开盒子。它看起来像是某种累积的错误。此外,车轮与地面上的一些颠簸碰撞似乎是造成这个问题的最主要原因。最初就像左图一样,但在我将它从地面上的大球上开几次后,它就像右图一样,并保持这种状态:

左:初始状态,右:我驾驶它经过大圈数次后。

我之前使用过一个较旧的 bo​​x2djs 库,但那里似乎没有这个问题。将代码移植到box2dweb后出现问题。在这两个库中创建事物的方式有很多不同,所以我一定错过了一些东西,但不知道是什么。

盒子的代码:

function createBox(world, x, y, width, height)
{
    var fixDef = new b2FixtureDef;
    fixDef.density = 1.0;
    fixDef.friction = 1.0;
    fixDef.restitution = 1.0;

    var bodyDef = new b2BodyDef;
    bodyDef.type = b2Body.b2_dynamicBody;
    bodyDef.position.x = x;
    bodyDef.position.y = y;

    fixDef.shape = new b2PolygonShape;
    fixDef.shape.SetAsBox(width, height);

    var b = world.CreateBody(bodyDef);
    b.CreateFixture(fixDef);
    return b;
}

对于轮子(几乎相同,除了它会创建圆圈):

function createBall(world, x, y, r)
{
    var fixDef = new b2FixtureDef;
    fixDef.density = 1.0;
    fixDef.friction = 1.0;
    fixDef.restitution = 1.0;

    var bodyDef = new b2BodyDef;
    bodyDef.type = b2Body.b2_dynamicBody;
    bodyDef.position.x = x;
    bodyDef.position.y = y;

    fixDef.shape = new b2CircleShape(r);

    var b = world.CreateBody(bodyDef);
    b.CreateFixture(fixDef);
    return b;
}

对于关节:

var jointDef_rear = new b2RevoluteJointDef();   
jointDef_rear.Initialize(rear_wheel, car_body, rear_wheel.GetPosition());
jointDef_rear.maxMotorTorque = 10.0;
jointDef_rear.enableMotor = true;

rear_joint = world.CreateJoint(jointDef_rear);

var jointDef_front = new b2RevoluteJointDef();  
jointDef_front.Initialize(front_wheel, car_body, front_wheel.GetPosition());
jointDef_front.maxMotorTorque = 10.0;
jointDef_front.enableMotor = true;

front_joint = world.CreateJoint(jointDef_front);

所以尽管我讨厌问“我的代码有什么问题”——有点问题,我在这里做错了什么?

4

2 回答 2

1

看来问题是由零位置迭代引起的:

world.Step(dt, iterations);

似乎在旧版本的 Box2Djs 中,函数的原型就是这样。但是,在较新的版本中,它已更改为

function (dt, velocityIterations, positionIterations)

所有参数默认为 0。用旧方式调用它,就像world.Step(dt, iterations)然后等于world.Step(dt, iterations, 0),它仍然“有点”工作,但连接体的相对位置没有正确解决。我试着把它称为world.Step(dt, iterations, iterations),然后突然间一切都修复了,即使迭代次数很少,比如 3。

于 2013-01-12T07:06:57.960 回答
0

最有可能的是,原因在于身体的质量。

Box2D maunal 说:
如果较轻的身体支撑较重的身体,由关节连接的身体链条可能会伸展。例如,连接到一连串轻质物体的破坏球可能不稳定。随着质量比超过 10:1,稳定性会降低。

你的前轮太小了,密度和其他车身一样。因此,它的质量与车身的质量有很大不同。例如,尝试将车身密度设置为 0.2,后轮密度设置为 0.5 以上,前轮密度设置为 1.5 以上。或者更好地为每个身体设置质量手册b2Body::SetMassData。我认为,最好让轮子比箱子更重。

于 2012-10-26T13:49:39.187 回答