2012-04-05 31 views
2

私は体の楕円形を作成する必要があり、それをbox2dで作る方法を理解していません。box2dで楕円形を作成する方法は?

どのようにするか考えてください。ではなく、多くの頂点を持つb2PolygonShapeを使用してください。

+2

これらのデモのいずれかに卵形があります。多分、彼がどのようにそれをしたのかチェックすることができます:http://www.sideroller.com/wck/ – iforce2d

+1

"伸縮可能な"円を定義します。幅が同じであれば、通常の円の形が使用されます。そうでない場合は、ポリゴンの近似が作成されます。 世界建設キットの文書に記載されています。私は彼らが新しいことをしてほしかった... – Pavel

+0

私は答えを投稿しました...しばらく時間がかかりました...少し考えなければなりませんでした... – FuzzyBunnySlippers

答えて

5

**オプション#1 **

は、二つの固定具を有する本体を使用する:最初は身体にいくつかの質量を与えるために、中央円形であろう。 2つ目は、楕円であり、頂点はチェーン形状で作られています。

最初のフィクスチャでは、ボディをある程度の質量のボディのように動作させることができますが、2番目のフィクスチャでは衝突を適切に処理できます。

私は最近、ルーレットホイールの例を行った。私はそれを作成するために以下のコードを投稿しました。半径(OUTER_RADIUS)の定数値を楕円の半径の極座標found here on wikipediaに置き換えます。

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); 

} 

また、ルーレット盤(プラス映像の良さ)ソリューションのthis postをチェックアウトすることができます。

オプション#2 チェーン/エッジシェイプを使用する代わりに、フィクスチャの三角ファンを作成できます。楕円の頂点を作成したら、次のようなことができます:

b2Vec2 triVerts[3]; 
triVerts[0] = Vec2(0,0); 
for(int idx = 1; idx < vertices.size(); idx++) 
{ 
    b2PolygonShape triangle; 
    fixtureDef.shape = &triangle; 
    // 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); 
} 

この情報は役に立ちましたか?

+0

このようなサウンドはもっと問題になりやすいはずですポリゴンベースのボディが単一のポリゴンフィクスチャである場合は "シーム"が存在しません)、ポリゴンを定義するために非常に同じチェーンジオメトリを使用するよりもエレガントではありません。しかし、楕円を定義するために複数の什器を使用する必要がある場合には、これと競合するb2_maxpolygonverticesの制限があります。さらに、とにかくサークルのポイントは何ですか?単に質量を直接設定し、完全に使用されていない円の形を捨ててください。 –

+0

Box2dCodeの注釈を読むと、は言っています: "b2BlockAllocatorが最大オブジェクトサイズを持っているので、これをあまりにも大きくすることはできません。" b2_maxPolygonVerticesの定義については、また、オブジェクトを「弾丸」として設定し、固定時間ステップを使用してトンネルの可能性を減らすこともできます。完全な解決策はありません。しかし、これはうまくいくはずです。 – FuzzyBunnySlippers

+0

多分あなたはサークルを必要としないかもしれません...私はあなたがチェーンの形状のための質量を設定することができないと思った...私はそれを確認します。 – FuzzyBunnySlippers

関連する問題