体の楕円形を作成する必要がありますが、box2d で作成する方法がわかりません。
多くの頂点を使用しないでそれを行う方法のアイデア。b2PolygonShape
** オプション1 **
2 つのフィクスチャを持つボディを使用します。最初のフィクスチャは、ボディにある程度の質量を与えるための中央の円形状です。2 つ目は楕円で、頂点がチェーン シェイプから作成されます。
最初のフィクスチャを使用すると、ボディをある程度の質量を持つボディのように振る舞わせることができ、2 番目のフィクスチャを使用すると、衝突を適切に処理できます。
最近、ルーレット盤の例を作りました。それを作成するために以下のコードを投稿しました。半径の定数値 (OUTER_RADIUS) を、ウィキペディアでここにある楕円の半径の極形式に置き換えます。
void MainScene::CreateBody()
{
const float32 INNER_RADIUS = 2.50;
const float32 OUTER_RADIUS = 3.0;
const float32 BALL_RADIUS = 0.1;
const uint32 DIVISIONS = 36;
Vec2 position(0,0);
// Create the body.
b2BodyDef bodyDef;
bodyDef.position = position;
bodyDef.type = b2_dynamicBody;
_body = _world->CreateBody(&bodyDef);
assert(_body != NULL);
// Now attach fixtures to the body.
FixtureDef fixtureDef;
fixtureDef.density = 1.0;
fixtureDef.friction = 1.0;
fixtureDef.restitution = 0.9;
fixtureDef.isSensor = false;
// Inner circle.
b2CircleShape circleShape;
circleShape.m_radius = INNER_RADIUS;
fixtureDef.shape = &circleShape;
_body->CreateFixture(&fixtureDef);
// Outer shape.
b2ChainShape chainShape;
vector<Vec2> vertices;
const float32 SPIKE_DEGREE = 2*M_PI/180;
for(int idx = 0; idx < DIVISIONS; idx++)
{
float32 angle = ((M_PI*2)/DIVISIONS)*idx;
float32 xPos, yPos;
xPos = OUTER_RADIUS*cosf(angle);
yPos = OUTER_RADIUS*sinf(angle);
vertices.push_back(Vec2(xPos,yPos));
}
vertices.push_back(vertices[0]);
chainShape.CreateChain(&vertices[0], vertices.size());
fixtureDef.shape = &chainShape;
_body->CreateFixture(&fixtureDef);
}
ルーレットホイール (プラス画像の良さ) ソリューションについては、この投稿をチェックすることもできます。
オプション #2 チェーン/エッジ形状を使用する代わりに、フィクスチャの三角形ファンを作成できます。楕円の頂点を取得したら、次のようなことができます。
b2Vec2 triVerts[3];
triVerts[0] = Vec2(0,0);
for(int idx = 1; idx < vertices.size(); idx++)
{
b2PolygonShape triangle;
fixtureDef.shape = ▵
// Assumes the vertices are going around
// the ellipse clockwise as angle increases.
triVerts[1] = vertices[idx-1];
triVerts[2] = vertices[idx];
triangle.Set(triVerts,3);
_body->CreateFixture(&fixtureDef);
}
これは役に立ちましたか?