Javascript Box2dWeb旋转接头“;“拉伸”;

Javascript Box2dWeb旋转接头“;“拉伸”;,javascript,box2d,Javascript,Box2d,我正在尝试创建一个汽车一样的东西在二维使用。我有一个用于车身的盒子和两个圆圈,通过旋转接头连接到它,作为车轮。在一段时间内,一切正常,但车轮中心和它们连接到的箱子上的点之间的间隙逐渐增大。为解算器设置更多的迭代没有帮助,轮子迟早会完全离开长方体。这看起来像是某种累积的错误。此外,车轮与地面上的一些颠簸碰撞似乎是导致此问题的最主要因素。一开始就像左图一样,但在我把它打过地面上的大球几次之后,它就变成了右图一样,并保持这样: 我以前使用过一个旧的box2djs库,似乎没有这个问题。问题出现在我将代

我正在尝试创建一个汽车一样的东西在二维使用。我有一个用于车身的盒子和两个圆圈,通过旋转接头连接到它,作为车轮。在一段时间内,一切正常,但车轮中心和它们连接到的箱子上的点之间的间隙逐渐增大。为解算器设置更多的迭代没有帮助,轮子迟早会完全离开长方体。这看起来像是某种累积的错误。此外,车轮与地面上的一些颠簸碰撞似乎是导致此问题的最主要因素。一开始就像左图一样,但在我把它打过地面上的大球几次之后,它就变成了右图一样,并保持这样:

我以前使用过一个旧的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;
}
对于轮子(几乎相同,只是它创建了圆):

对于接头:

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);

所以,尽管我不喜欢问“我的代码出了什么问题”-这类问题,我在这里做错了什么?

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

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


你的前轮太小,密度和其他物体相当。所以,它的质量和车身的质量非常不同。例如,尝试将车身密度设置为0.2,后轮密度设置为0.5,前轮密度设置为1.5。或者最好通过
b2Body::SetMassData
为每个车身设置质量手册。我认为,车轮比箱子更重更好。

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

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次。

我试过了,没有任何帮助。它们仍然很长,而且达到了相当荒谬的程度。你能上传代码让我看到它的运行吗?当然。查看拉伸的最快方法是使用“A”和“D”键数次将前轮撞击地面(ASD控制后轮,JKL-前轮)。这里我有另一个示例,它使用box2djs而不是box2dweb,完全没有拉伸。
function (dt, velocityIterations, positionIterations)