私はBulletを使用しており、適切な衝突応答とともに、キューブベースの地形から接触点を生成する衝突アルゴリズムを作成しようとしています。また、ボックス以外の形状も含めるように拡張する予定ですが、現時点では重要ではありません。三角形のメッシュを使用することは、大きなマップにとってはRAMを独占しすぎることを発見しました。
ここでByte56 で概説されている手順を試しましたが、Bulletを使用してこれを実装することについて、いくつか質問があります。
- どのようにして世界の衝突形状を生成しますか?カスタム形状を使用していますか?あなたはそれに何を設定
m_shapeType
しますか? - それとも、あなたはまだ世界のサイズの箱形を使用していますか?
- 連絡先を確実に解放するにはどうすればよいですか?
- どのように正確に変更し
processCollision
ますか?
私がやったこと:
- この形状のみを持つオブジェクトのディスパッチャーに新しい衝突アルゴリズムを登録できるようにするために、terrainShape
that extends
btBoxShape, the only difference being that
m_shapeType = CUSTOM_CONVEX_SHAPE_TYPE` を作成しました。 - 私は拡張しました
btRigidBody
が、(2番目の段落内のリンクを参照してください)彼の質問でByte56と同様にクラスがcheckCollisionWith(CollisionObject * co)
あればtrueを返す任意ののAABBにおけるボクセルがco
空気ではありません。 次のようにして、と
btCollisionAlgorithm
同様の方法でクラスを拡張しました。btCompoundCollisionAlgorithm
processCollision
- 引数として渡された衝突オブジェクトをチェックし、どちらが地形で、どちらがエンティティであるかを判別します。
- 多様体の子アルゴリズムをクリアします。
- コール
resultOut->setPersistantManifold(resultOut)
- 衝突するエンティティが占めるAABBで新しいボックス形状と変換を生成し、を呼び出します
m_dispatcher->findAlgorithm
。AABB内のボクセルごとに、形状、変換、および検出されたアルゴリズムをChild Algorithm構造体に保存します。 - すべての子アルゴリズムを繰り返し、を呼び出し
proccessCollision
ます。 - すべての子アルゴリズムを反復処理し、衝突しているエンティティのAABBの外側にあるものをすべて削除します。(
~btCollisionAlgorithm()
次に呼び出すm_dispatcher->freeCollisionAlgorithm()
) - を呼び出し
resultOut->refreshContactPoints()
ます。
機能するもの:processCollision
プレーヤーのAABBが非空気ボクセルと交差するときに呼び出されます。
できないこと:衝突応答は単なる奇妙なものです...プレイヤーエンティティは上方に浮上し始めます。何かに入ると、激しく跳ね返ります。何かに足を踏み入れた後、1つの軸上で動き続けることができない場合があります。おそらく、プレイヤーエンティティが常にワールドオブジェクトのAABBにあるため、衝突応答後に接点が解放されていないのではないかと思います。に関して正しい木を吠えているprocessCollision
かどうか知りたいです。