1

私はbox2dに比較的慣れていないので、box2dwebバージョンを使用しています。キネマティック ボディがステージの境界から出たことを検出できるようにしたいと考えています。Box2D.Dynamics.b2BoundaryListener は明らかな答えですが、box2dweb ビルドではサポートされていないようです。

update() を呼び出すたびに各ボディの座標をプリミティブにチェックするのではなく、リスナーを作成する効率的な方法はありますか? 静的な物体をセンサーとして使用しようとしましたが、それらは運動学的な物体を検出しません。

4

1 に答える 1

0

私が知る限り、b2BoundaryListener は以前のバージョンの Box2D の一部であり、Box2D の世界には境界がなくなったため削除されました。

これらはキネマティック ボディも検出するため、動的センサーを使用できます。あなたの世界が重力を使用している場合は、体を修正する必要があります。

重力に対抗する力を適用するか、これらの動的センサー ボディをジョイント (溶接ジョイントなど) によって静的ボディに固定することによって、これを行うことができます。

新しい Box2D Javascript ポートには、重力の影響を受けない動的なボディを作成できる setGravityScale メソッドも含まれています (例: JSBox2D ) 。

しかし、b2AABB クラスを使用する場合は、更新時に手動でこれを行う方がおそらく良い考えであり、非常に簡単であると思います。これにより、境界ボックスが境界の外にある場合にオブジェクトが削除されます。

次のようなことができます (テストされていないコード):

var body = world.GetBodyList();
        while (body != null) {
            var fixture = body.GetFixtureList();
            var bodyIsInBounds = false;
            while (fixture != null) {
                // bounds AABB are your boundaries (as b2AABB object)
                if (fixture.GetAABB().TestOverlap(boundsAABB)) { 
                    bodyIsInBounds = true;
                    break;
                }
                fixture = fixture.GetNext();
            }
            if (!bodyIsInBounds) {
                world.DestroyBody(body);
            }
            body = body.GetNext();
        }

b2AABB.Contains も確認する必要がある場合があります。boundsAABB に他の b2AABB オブジェクトが完全に含まれている場合、TestOverlap が true を返すかどうかはわかりません。

于 2014-05-14T22:08:42.680 に答える