2017-05-31 17 views
2

私は現在libgxのjavaでbox2dの物理エンジンを使用していますが、私は衝突の問題に直面しています。 問題は、身体が動くのが止まり、フラットエリアにいる間に衝突ポイントが表示されることです。 私が働く方法は、それぞれがブロックを表している複数のボディを作成しており、それらのブロックは並んでいます。ここで、衝突点における ルック:Box2Dの衝突のエラー

enter image description here

体はYのためにここに衝突してはならない体の座標が等しく、それらの側も同じです。

float PPM = 100; 
float side = 45; 
    for (float i = start; i < end; i++) { 
     /** 
     * perlin noise for terrain 
     */ 
     def.type = BodyDef.BodyType.StaticBody; 
     float place = Maths.map(noise.noise(off, off), 0, 1, -10, 50); 
     if (place < 10) { 
      place = 0; 
     } else if (place < 20) { 
      place = side; 
     } else if (place < 30) { 
      place = side * 2; 
     } else if (place < 40) { 
      place = side * 3; 
     } else if (place <= 50) { 
      place = side * 4; 
     } 


     place += side/2; 

     float posx = (i * side); 
     float posy = place; 
     float size = side/2f; 
     def.position.set(posx/PPM, posy/PPM); 
     b = world.createBody(def); 
     shape.setAsBox(size/PPM, size/PPM); 
     fdef.shape = shape; 
     fdef.isSensor = false; 
     b.createFixture(fdef); 
     off += 0.01; 
     toSetLast = posx + side; 

     GrassBlock grass = new GrassBlock(b, new 
     Vector2(b.getPosition().x * PPM, b.getPosition().y * PPM)); 
     //dirt under grass 
     for (float j = (place/side) - 1; j >= -1; j--) { 
      posy = j * side; 

      def.position.set(posx/PPM, posy/PPM); 
      b = world.createBody(def); 
      shape.setAsBox(size/PPM, size/PPM); 
      fdef.isSensor = false; 
      fdef.shape = shape; 
      b.createFixture(fdef); 
      DirtBlock dirt = new DirtBlock(b, new 
      Vector2(b.getPosition().x * PPM, b.getPosition().y * PPM)); 
      addBlock(dirt.getLocation(), dirt); 
     } 
     addBlock(grass.getLocation(), grass); 

    } 

答えて

2

私は何を経験していることは知られている短い来BOX2Dライブラリのであると信じています。

What could cause a sudden stop in Box2D?を参照してください。何が起こっているのかの説明についてはBox2D C++ tutorials - Ghost verticesを参照し、どのような問題を軽減するために行うことができます...基本的に

、テクスチャの代わりに、ポリゴン(多角形または以上)のような地面用チェーン形状を使用するので、あなたの移動ブロックは実際にチェーンの上を移動します。これは、使用しているjava box2d実装のバージョンが、 "ゴースト頂点"をサポートするチェーン形状を持っていることを前提としています。

フードの詳細の下で

...

フード下スムージング、を提供し、ユーザーの視点チェーンの形状からが、それは平滑化を行うために慣れるエッジ形状です。エッジシェイプでは、2つの特殊な余分な頂点(エッジの2つに加えて)を使用してこれを行います。ライブラリが鎖の形とポリゴン(または円)との間の接触を評価しているとき、その接触が起こっている可能性のある鎖のセグメントを特定することによってそれを行います。次に、そのチェーンセグメントを、余分な頂点がチェーン内の隣接する頂点に設定されたエッジに変換します。そして、その変換されたエッジとポリゴン(または円)との間の接触が評価される。これはチェーンシェイプで自動的に行われ、この動作を得るために使用されるチェーンシェイプにはオプションがありません。

チェーンのすべてのセグメントのエッジシェイプを縫い合わせ、すべてのエッジの余分な頂点を論理的に隣接する頂点に設定することで、チェーンシェイプと同じ結果を得ることができます。しかし、これはチェーンの形状よりもかなり多くのメモリを使用し、ユーザーは(少なくとも2つ以上の頂点を持つチェーンの場合)より多くのコードを書く必要があります。

+0

私は今夜これを試してみましょう。しかし、これは私がbox2dの本体をポリゴンとして保持していても、鎖形でポリゴンを作っていればこれでも使えますか? – Liwaa

+0

@Liwaaチェーン形状は、任意の非ソリッド形状を意味します。また、チェイン(およびエッジ)シェイプは、動的ボディに使用するためのものではありません。もしあなたがC++(Javaではなく)を使っていたら、ポリゴンの上を滑っているダイナミックチェーンとエッジシェイプとポリゴンをサポートしている[My fork of Box2D](https://github.com/louis-langholtz/Box2D)を試すことができます。私のフォークはJavaに移植されていません。だからあなたには役に立たない。ちなみに、誰かが興味を持っているなら、私は[この固執する問題を書き留め、それを私のフォークにどのように解決したのか](https://github.com/louis-langholtz/Box2D/blob/dev/Documentation/CollisionHandlng.md) 。 –

+0

@ LousLangholtzそれはチェーンの形状と完璧に動作するように管理し、私は最初にチェーンの形状に問題があった、そして、彼らは動作するように管理しました。ありがとう! – Liwaa

2

ルイ・ランホルツの回答は既に良いですが、私はさらに追加しています。

チェーンやゴーストの頂点は、一般的なアプローチを推奨しますが、されています -

  • 実際に使用するのは難しいです。
  • これらのエッジ/コーナーを手動で結合するには、コーダが必要です。
    (いくつかのシナリオでは退屈な)

は私の代わりにボックスを面取りをお勧めします: -

私がテストしている

enter image description here

(jbox2d) - それはかなりグリッチからの影響を低減することができます。
このアプローチの欠点は、追加の頂点が必要であることです。
(例えば、4頂点→8頂点)

したがって、より多くの計算能力が必要です。

したがって、実務で、私は一般的に2つのグループにすべてのボディを分ける: -

  • OKがグリッチ(例えば破片)を持っている - >(安い)
  • を持つことはできませんグリッチを変更しないでください(例えば文字) - >アプローチ(より高価な)個人的に

を面取り使用し、私はルイLangholtzとしてチェーン/ゴーストを使用する簡単な方法があると思いますけれども、お勧めします。

+0

ポリゴンのエッジを曲線にする必要があることを理解していますか? 多角形でどうやったらいいですか? @javaLover – Liwaa

+0

@Liwaaはい。それは特に難しいことではありません。あなたはそれについて熟考する時間が必要かもしれません。ここにいくつかの似たようなものがあります。 https://www.youtube.com/watch?v=3qMNuoTHNHsとhttp://doc.cgal.org/latest/Straight_skeleton_2/index.html – javaLover

+0

すべての助けをいただき、ありがとうございます:) – Liwaa

関連する問題