2016-04-24 6 views
1

お互いに積み重なった体(矩形)をたくさん作っても、安定しているわけではありません。返還が0に設定されていても、彼らは弾力があり、お互いに落ちる。密度を非常に低い値に設定しようとしましたが、変化しませんでした。box2d(libgdx)積み重ね体が安定しない

これを修正する可能性はありますか?

shape.setAsBox(0.1f, 0.1f, new Vector2(0, 0), 0); 
    bDef = new BodyDef(); 
    bDef.type = BodyDef.BodyType.DynamicBody; 
    bDef.position.set(0, 0); 

    fDef.shape = shape; 
    fDef.density = 0.001f; 
    fDef.friction = 0.5f; 
    fDef.restitution = 0.0f; 

    for (int i = 1; i < 50; i++) { 
     bDef.position.set(0, i * 0.201f); 
     body1 = world.createBody(bDef); 
     fixture = body1.createFixture(fDef); 
    } 
+0

ボックス間の隙間を広げて、落下させてみましょう。互いの上に置いて横に動かす可能性があります。 –

+0

多くの価値を試しました。また、彼らはお互いに落ちているときに動作しません。 – NuclearVirus

+0

"ground"ブロックの反復も0に設定されていますか?また、より多くの質量を持っている場合は、それが少なくなるように密度を上げてみてください。 –

答えて

0

これが問題である限り、はい、これは修正可能です。他の作業もありますが。しかし短期的には、そうではありません。

Box2D 2.3.2からテストベッドの「垂直スタック」テストを実行すると、複数のボックスが垂直スタック内で互いに重なり合うように表示されます。最初は積み重なり、次に彼らはぐらつき、その後彼らは倒れます。これは、Box2Dがどのように動作するように設計されているかです。私はその行動が気に入らず、私はそれを変更しました。

私はこれが本質的にあなたが見ているのと同じ問題だと思っています。これを修正して安定したスタッキング動作を得るために私が使った "修正"は、内部のBox2Dライブラリコードを変更することを伴います。

アルゴリズム的に言えば、一度に1つの衝突マニフォールドポイントに適用されるインパルスを解決する方法から、侵入深度の順に適用されるインパルスを解決すること、またはそれらがほぼ等しいときに同時に解決する方法を修正しました。コード賢明には、私は本質的に、Erinのb2ContactSolver::SolvePositionConstraintsb2ContactSolver::SolveTOIPositionConstraintsメソッド(Erinのb2ContactSolver.cpp)にこのアルゴリズムの変更を加えました。

この変更されたアルゴリズムのコードはdev branch of my fork of Box2Dです(ContactSolver.cppファイルのSolvePositionConstraint機能を参照)。残念ながら、コードの変更がこれらのメソッドを超えて拡張されているため、これらのメソッドに適用されるdiffはありません。さらに、私が行った変更により、Box2Dライブラリのパブリックインターフェイスが変更され、プラットフォーム用にビルドすることができたとしても、自分の新しいインターフェイスにコードを適合させる必要があります。

関連する問題