我正在尝试使用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);
因此,我讨厌问“我的代码有什么问题”-kinda问题,我在这里做错了什么?
答案 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。