2

球体とボックスの 2 つのオブジェクトがあり、一方が他方と衝突すると何らかのアクションを実行します (つまり、ボックスを破壊します)。

私はいくつかの方法を試しました:

  • checkCollideWith は常に true を返します。
  • contactPairTest - これは使い方がわかりません。2 つのオブジェクトとコールバックの 3 つの引数を取ります。コールバックはコード内の任意の関数にすることができると思っていましたが、そのようには機能しません。

2 つの btRigidBodies (つまり bodyA と bodyB) が衝突したときに、CollissionResult() などのメソッドを呼び出す方法の例を教えてください。

4

2 に答える 2

6

おそらく、この例は概念を説明するのに役立ちます。既存の抽象クラスから派生した新しいクラスを定義する必要があります。抽象クラス メソッドの 1 つをコールバック コードでオーバーライドします。次に、派生クラスのオブジェクトを作成し、それをコールバックを呼び出す関数に渡します。これは十分に一般的な C++ 手法です。

struct MyContactResultCallback : public ContactResultCallback
{
    btScalar addSingleResult(btManifoldPoint& cp,
        const btCollisionObjectWrapper* colObj0Wrap,
        int partId0,
        int index0,
        const btCollisionObjectWrapper* colObj1Wrap,
        int partId1,
        in index1)
    {
        // your callback code here
    }
};

MyContactResultCallback callback;
world.contactPairTest(bodyA, bodyB, callback);

このライブラリについては何も知らないことを付け加えておきます。ドキュメントを読んだところです。

編集

にコンテキスト メンバーを追加する方法を示しますMyContactResultCallback

struct MyContactResultCallback : public ContactResultCallback
{
    MyContactResultCallback(some_type* ptr) : context(ptr) {}

    btScalar addSingleResult(btManifoldPoint& cp,
        const btCollisionObjectWrapper* colObj0Wrap,
        int partId0,
        int index0,
        const btCollisionObjectWrapper* colObj1Wrap,
        int partId1,
        in index1)
    {
        context->currentPoints += 10;
    }

    some_type* context;
};

MyContactResultCallback callback(ptr_to_some_object);
world.contactPairTest(bodyA, bodyB, callback);

ptr_to_some_objectcurrentPointsインクリメントするオブジェクトへのポインタです。私はそれがどのタイプのオブジェクトなのかわかりませんsome_type

これが、関数の代わりにオブジェクトをコールバックとして使用するポイントです。コールバックが目的に応じてデータ メンバーを追加できるオブジェクトである場合、関数に対してそれを行うことはできません。

于 2013-11-30T13:26:30.410 に答える