0

敬礼、私は現在、物理シミュレーションに box2d を使用してフラッシュでビリヤード ゲームに取り組んでおり、コリジョン フィルタリングで立ち往生しています。

私がやろうとしているのは、ボールがポケットに入ったときにボールのコリジョン マスク ビットを変更して、他のボールと衝突しないようにすることです (物理オブジェクトを削除したくありません。これは、前にいくつかの効果を行う必要があるためです)。 )。

コリジョン マスク ビットは適切に変更されたように見えますが、ポケットに入れられたボールが完全にコリジョン不能になる前にまだしばらくコリジョンしているため、すぐには効果がありません。

理由はわかりませんが、実行時にマスク ビットを変更することは本当に可能ですか?

ありがとうございました。

4

1 に答える 1

0

2 つのフィクスチャが互いに近づくと (具体的には、AABB がオーバーラップし始めると)、b2Contact が作成されて、それらの間の相互作用が管理されます。衝突に関連するデータ (摩擦、反発など) は、この b2Contact にコピーされ、AABB がオーバーラップしなくなるまで保持されます。これは効率化のために行われますが、副作用として、2 つの AABB がオーバーラップしている限り、衝突マスク ビットがチェックされなくなります。

これを回避する 1 つの方法は、ポケット ボールとの衝突の PreSolve コールバックで contact->SetEnabled(false) を呼び出して、デフォルトの衝突応答を手動でキャンセルすることです。これは、PreSolve 呼び出しを受けるたびに実行する必要があります。

于 2012-06-15T05:04:14.723 に答える