2012-04-05 129 views
2

我需要爲body創建橢圓形狀,並且不知道如何在box2d中創建橢圓形狀。如何在box2d中創建橢圓形狀?

任何想法如何做到這一點通過使用b2PolygonShape有很多頂點的

+2

在這些演示中有一個蛋形,也許你可以看看他是怎麼做到的:http://www.sideroller.com/wck/ – iforce2d 2012-04-06 17:36:29

+1

「定義一個」可拉伸「的圓圈,如果高度和寬度相同,則使用規則的圓形形狀,否則將創建多邊形近似。「 它來自世界建築工具包的文件。我希望他們完成水漬... – Pavel 2012-08-13 15:07:52

+0

我發佈了一個答案...對不起,它花了一段時間...不得不想一點... – FuzzyBunnySlippers 2013-12-13 02:22:28

回答

5

**選項1 **

利用一款機身搭配兩場比賽:第一是中央圓形給身體一些質量。第二個是橢圓形,頂點由鏈狀構成。

第一個夾具可以使您的身體像一個有質量的身體一樣行動,而第二個夾具可以讓您正確處理碰撞。

我最近做了一個輪盤賭的例子。我發佈了下面的代碼來創建它。將橢圓的常數值(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限制要解決,超過此限制,您需要使用多個固定裝置來定義橢圓。此外,無論如何,這個圈子的重點是什麼?直接設置質量並丟棄完全未使用的圓形。 – 2013-12-13 02:28:19

+0

如果您閱讀Box2dCode中的註釋,說:「您不能增加太多,因爲b2BlockAllocator具有最大的對象大小。」爲b2_maxPolygonVertices定義。此外,您可以將對象設置爲「項目符號」,並使用固定的時間步驟來減少隧道可能性。沒有解決方案是完美的但這應該工作。 – FuzzyBunnySlippers 2013-12-13 02:37:14

+0

也許你不需要這個圓圈......我以爲你無法爲連鎖形狀設置質量...我會檢查一下。 – FuzzyBunnySlippers 2013-12-13 02:39:13