1

最近、長期にわたるプロジェクトで box2d のバージョンを v2.2.1 にアップグレードしましたが、既存のプロジェクト コードとの下位互換性の問題が多数発生しました。これを除いて、ほとんどが解決されました

b2Fixture *f = body->GetFixtureList();
b2RayCastOutput output;
b2RayCastInput input;
f->RayCast(&output, input) // broken call

3 番目の引数を期待して壊れています。box2d のソース コードで、関数のシグネチャが

inline bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const;

しかし、私はあるべきものの例を見つけることができませんchildIndex。この更新された RayCast 関数を使用する方法の例を誰か提供できますか?

編集: 0 に設定childIndexするとうまくいくように見えますが、その理由はわかりません。

4

1 に答える 1

3

このパラメーターは、b2ChainShape フィクスチャにのみ関連します。他の形状タイプの場合、仮想関数シグネチャに準拠するだけです。

チェーン シェイプの機能は、実際には複数の b2EdgeShapes によって実行されます。チェーン シェイプ自体は、これらのエッジ シェイプの「子」を編成するためのヘルパーと考えることができます。メモリを割り当て、ゴースト頂点をセットアップし、衝突チェックなどをエッジ シェイプに委任します。

チェーン シェイプに対してレイをキャストしない場合は、これをゼロのままにしておくことができます。そうであれば、b2ChainShape のこれらの関数を使用して、各子エッジに対してレイをキャストできます。

int32 GetChildCount() const;
void GetChildEdge(b2EdgeShape* edge, int32 index) const;

それらの 2 番目は次のように使用されます。

b2EdgeShape edgeShape;
chainShape->GetChildEdge(&edgeShape, 123);

最初に形状を b2ChainShape* にキャストする必要があります。

if ( e_chain == fixture->GetType() ) {
    b2ChainShape* chainShape = (b2ChainShape*)fixture->GetShape();
    ....
}

... b2World の RayCast 関数を使用する方が簡単で効率的です :)

于 2012-07-09T15:46:08.073 に答える