ボクセル地形との衝突を有効にするためにbtCollisionAlgorithmを拡張するにはどうすればよいですか?


8

私はBulletを使用しており、適切な衝突応答とともに、キューブベースの地形から接触点を生成する衝突アルゴリズムを作成しようとしています。また、ボックス以外の形状も含めるように拡張する予定ですが、現時点では重要ではありません。三角形のメッシュを使用することは、大きなマップにとってはRAMを独占しすぎることを発見しました。

ここでByte56 概説されている手順を試しましたが、Bulletを使用してこれを実装することについて、いくつか質問があります。

  • どのようにして世界の衝突形状を生成しますか?カスタム形状を使用していますか?あなたはそれに何を設定m_shapeTypeしますか?
  • それとも、あなたはまだ世界のサイズの箱形を使用していますか?
  • 連絡先を確実に解放するにはどうすればよいですか?
  • どのように正確に変更しprocessCollisionますか?

私がやったこと:

  • この形状のみを持つオブジェクトのディスパッチャーに新しい衝突アルゴリズムを登録できるようにするために、terrainShape that extendsbtBoxShape , the only difference being thatm_shapeType = CUSTOM_CONVEX_SHAPE_TYPE` を作成しました。
  • 私は拡張しましたbtRigidBodyが、(2番目の段落内のリンクを参照してください)彼の質問でByte56と同様にクラスがcheckCollisionWith(CollisionObject * co)あればtrueを返す任意ののAABBにおけるボクセルがco空気ではありません。
  • 次のようにして、とbtCollisionAlgorithm同様の方法でクラスを拡張しました。btCompoundCollisionAlgorithmprocessCollision

    1. 引数として渡された衝突オブジェクトをチェックし、どちらが地形で、どちらがエンティティであるかを判別します。
    2. 多様体の子アルゴリズムをクリアします。
    3. コール resultOut->setPersistantManifold(resultOut)
    4. 衝突するエンティティが占めるAABBで新しいボックス形状と変換を生成し、を呼び出しますm_dispatcher->findAlgorithm。AABB内のボクセルごとに、形状、変換、および検出されたアルゴリズムをChild Algorithm構造体に保存します。
    5. すべての子アルゴリズムを繰り返し、を呼び出しproccessCollisionます。
    6. すべての子アルゴリズムを反復処理し、衝突しているエンティティのAABBの外側にあるものをすべて削除します。(~btCollisionAlgorithm()次に呼び出すm_dispatcher->freeCollisionAlgorithm()
    7. を呼び出しresultOut->refreshContactPoints()ます。

機能するもの:processCollisionプレーヤーのAABBが非空気ボクセルと交差するときに呼び出されます。

できないこと:衝突応答は単なる奇妙なものです...プレイヤーエンティティは上方に浮上し始めます。何かに入ると、激しく跳ね返ります。何かに足を踏み入れた後、1つの軸上で動き続けることができない場合があります。おそらく、プレイヤーエンティティが常にワールドオブジェクトのAABBにあるため、衝突応答後に接点が解放されていないのではないかと思います。に関して正しい木を吠えているprocessCollisionかどうか知りたいです。


これをまったく整理しましたか?非常によく似た問題が発生しています。
timoxley 2013年

少し遅れて申し訳ありませんが、あなたの質問は見つかりませんでした。これをまだ理解していない場合、物理ボディのデバッグ描画を試しましたか?衝突を検出するために使用しているAABBは、使用している物理ボディをバインドしていません。したがって、衝突を検出するまでに、オブジェクトはすでにその内部にあります。これは、衝突反応が奇妙である理由を説明しています。
MichaelHouse

1
私の質問に私の最新の回答を参照してください。gamedev.stackexchange.com/questions/27405/...
MichaelHouse

回答:


1

残念ながら、あなたが参照している回答に記載されいる方法から信頼できる結果を得ることができませんでした。あなたと同じように、私は奇妙な浮遊イベント、またはボクセルを削除するとその上に浮遊しているオブジェクトが空中に浮遊したままになる、または奇妙な振動する羽毛が地面に落ちる状況が発生します。新しい戦略のためにその戦略を放棄しました。

ボクセル地形のチャンクごとにカスタム衝突メッシュの作成を開始しました。私はそれをしBvhTriangleMeshShapeます。これはかなりうまくいきます:

ここに画像の説明を入力してください

ここでは、カスタム衝突メッシュの実装について詳しく説明します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.