Box2dWeb旋转关节“拉伸”

时间:2012-10-26 12:40:59

标签: javascript box2d

我正在尝试使用box2dweb在2D中创建类似汽车的东西。我有一个车身和两个圆圈的盒子,通过旋转接头连接到它,作为车轮。一切都很好,但是轮子的中心和它们所附的盒子上的点之间的间隙逐渐增大。为求解器设置更多迭代没有帮助,轮子迟早会完全离开盒子。它看起来像某种积累的错误。此外,车轮与地面上的一些碰撞碰撞似乎是导致这个问题的最主要因素。最初它就像在左边的图片上,但是在我将它在地面上的大球上开了几次之后,就像在右边的图片上一样,并保持这种状态:

Left: initial state, right: after I drive it over the big circle several times.

之前我使用过较旧的box2djs库,似乎没有这个问题。我将代码移植到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);

因此,我讨厌问“我的代码有什么问题”-kinda问题,我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

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

  

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

前轮太小,密度与其他机身相同。因此,它的质量与车身的质量非常不同。例如,尝试设置车身密度0.2,后轮密度超过0.5,密度前轮超过1.5。或者通过b2Body::SetMassData更好地为每个身体设置质量手册。我认为,最好让车轮比箱子更重。

答案 1 :(得分:0)

问题似乎是零位置迭代引起的:

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。