1

Box2Dで「チャンク」のシステムを作成しようとしています。つまり、チャンクを自分の体に分割できるように、大きな塊にまとめられた形状です。

現在、私のシステムは非常に基本的であり(実際に開始したばかりです)、Box2Dテストベッドでの「Breakable」テストをモデルにしています。これは、かなりの数の基本的なボックスフィクスチャ(後でポリゴンになります)を備えたボディです。ボディをクリックすると、フィクスチャが削除され、古い「チャンク」と同じ場所に同じフィクスチャ、回転などの新しいボディが作成されます。

ただし、大きなボディの原点
(-> GetWorldCenter)で新しいボディを作成するためにのみ取得できます。私がやりたいのは、削除して置き換えるフィクスチャのグローバルな場所を見つけて、そこで新しいチャンクを作成できるようにすることです。

「図心」を持つb2PolygonShapeについていくつか読んだことがありますが、それにアクセスして使用する方法がわかりません...

簡単に言うと、本体ではなく、フィクスチャのグローバルな場所(x + yまたはb2Vec2など)を見つけたいと思います(簡単です)。フィクスチャは接続されているボディと一緒に移動しますが、現在必要なのは1フレームの位置だけです(更新することも役立ちます)。

4

1 に答える 1

1

Box2D の場合、本体の位置はそれほど重要ではありません。フィクスチャ座標は体位がずれるだけです。シミュレーション プロセスには影響しません。だから、私には理解できません。

私はこのようなものを作りましたが、大きな体の原点を使用するとうまくいくと言えます。Box2D のテストベッドから Breakable のテストを見ることができます。ビッグボディのオリジンもあり。私が見ている新しい座標を計算する唯一の理由は、 SetAngle メソッドの奇妙な動作です。

それでもセントロイドが必要な場合は、b2PolygonShape.cpp にある ComputeCentroid を見てください。b2PolygonShape.h でメソッドが宣言されていないことに注意してください。cpp からコードをコピーして、次のように使用できます。

b2Fixture* chunk = ...;
b2Vec2 chunkCentroidLocal = ComputeCentorid(chunk->m_vertices, 
    chunk->m_vertexCount);
b2Vec2 chunkCentroidWorld = bigBody->GetWorldPoint(chunkCentroidLocal);

ps 新しいボディを作成するときは、ポリゴン ポイントを変換することを忘れないでください。大きな体と新しい体の違いを見つけて、ポリゴンのすべての点から差し引くだけです。

b2Vec2 shift = chunkCentroidWorld - bigBody->GetWorldCenter();
b2Vec2 newVertices = new b2Vec2[chunk->m_vertexCount];
for(int i = 0; i< chunk->m_vertexCount; i++)
{
   newVertices[i] = chunk->m_vertices[i] - shift;
}
于 2012-10-23T19:36:30.193 に答える