0

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

「コードの何が問題になっているのか」という質問が嫌いなのと同じくらい、ちょっとした質問ですが、ここで何が間違っているのでしょうか。

4

2 に答える 2

1

問題はゼロ位置の反復が原因であると思われます。

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回のように少なくても、突然すべてが修正されました。

于 2013-01-12T07:06:57.960 に答える
0

おそらく、理由は体の塊にあります。

Box2D maunalによると:
軽いボディが重いボディをサポートしている場合、ジョイントで接続されたボディのチェーンが伸びる可能性があります。たとえば、軽量ボディのチェーンに接続されたレッキングボールは安定していない可能性があります。質量比が10:1を超えると、安定性が低下します。

前輪が小さすぎて、密度が他のボディと同じです。ですから、その質量は車体の質量とは大きく異なります。たとえば、車体の密度を0.2に、後輪の密度を0.5に、前輪の密度を1.5に設定してみてください。または、各ボディにマスマニュアルを設定することをお勧めしb2Body::SetMassDataます。ボックスよりもホイールを重くしたほうがいいと思います。

于 2012-10-26T13:49:39.187 に答える