box2dwebを使用して2Dで車のようなものを作成しようとしています。車体用の箱と2つの円があり、車輪として回転ジョイントで接続されています。しばらくの間はすべて正常に機能しますが、ホイールの中心とホイールが取り付けられているボックスのポイントとの間のギャップが徐々に大きくなります。ソルバーにさらに反復を設定しても効果はなく、遅かれ早かれ、ホイールはボックスから完全に離れます。ある種の累積エラーのように見えます。また、車輪と地面の凹凸との衝突がこの問題の最大の原因のようです。最初は左の写真のようですが、地面にある大きなボールの上を数回運転すると、右の写真のようになり、そのままになります。
以前に古いbox2djsライブラリを使用しましたが、この問題は発生しなかったようです。コードをbox2dwebに移植した後、問題が発生しました。これらの2つのライブラリでの作成方法にはかなりの違いがあるので、何かを見逃したに違いありませんが、何がわからないのです。
ボックスのコード:
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);
「コードの何が問題になっているのか」という質問が嫌いなのと同じくらい、ちょっとした質問ですが、ここで何が間違っているのでしょうか。