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