2012-04-05 10 views
2

Ich muss Ellipse Form für den Körper erstellen und nicht verstehen, wie man das in Box2d macht.Wie Ellipsenformen in Box2d erstellen?

Alle Ideen, wie man das macht nicht mit b2PolygonShape mit vielen Spitzen.

+2

Es gibt eine Eiform in einem dieser Demos, vielleicht könntest du überprüfen, wie er das gemacht hat: http://www.siderroller.com/wck/ – iforce2d

+1

"Definiert einen" dehnbaren "Kreis. Wenn die Höhe und Breite sind gleich, es wird eine normale Kreisform verwendet. Ansonsten wird eine Polygonapproximation erzeugt. " Es von der Dokumentation des Weltbaukastens. Ich hoffte, dass sie etwas Neues gemacht haben ... – Pavel

+0

Ich habe eine Antwort geschrieben ... Entschuldigung, es hat eine Weile gedauert ... musste ein wenig nachdenken ... – FuzzyBunnySlippers

Antwort

5

** OPTION # 1 **

einen Körper mit zwei Leuchten verwendet: Die erste ist eine zentrale Kreisform sein würde, um dem Körper etwas Masse zu geben. Die zweite wäre die Ellipse, mit den Eckpunkten aus einer Kettenform.

Die erste Vorrichtung ermöglicht es Ihnen, dass der Körper wie ein Körper mit etwas Masse wirkt, während die zweite Vorrichtung Ihnen erlaubt, Kollisionen richtig zu behandeln.

Ich habe kürzlich ein Beispiel für ein Rouletterad gemacht. Ich habe den folgenden Code veröffentlicht, um das zu erstellen. Ersetzen Sie den konstanten Wert für den Radius (OUTER_RADIUS) durch die polare Form des Radius für eine Ellipse 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); 

} 

Sie können auch this post für die Roulette-Rad überprüfen (plus Bild Güte) Lösung.

OPTION # 2 Anstatt eine Kette/Kantenform zu verwenden, können Sie ein Dreieck Fan von Armaturen erstellen. Sobald Sie die Scheitelpunkte für die Ellipse haben, können Sie Folgendes tun:

War dies hilfreich?

+0

Klingt so, als sollte das anfälliger für Probleme sein (Dinge können leichter tunneln) die Kette bleibt dann in den "Nähten" in einer Polygonform stecken, und es gibt keine "Nähte", wenn der polygonbasierte Körper eine einzelne Polygonhalterung ist, und weniger elegant als die Verwendung derselben Kettengeometrie zum Definieren eines Polygons. Allerdings gibt es die Grenze b2_maxpolygonvertices, mit der man konkurrieren muss, darüber hinaus müssen mehrere Fixtures zum Definieren der Ellipse verwendet werden. Außerdem, was ist der Sinn des Kreises überhaupt? Stellen Sie einfach die Masse direkt ein und werfen Sie die völlig unbenutzte Kreisform weg. –

+0

Wenn Sie die Hinweise in Box2dCode lesen, sagt: "Sie können dies nicht zu viel erhöhen, weil b2BlockAllocator eine maximale Objektgröße hat." für die b2_maxPolygonVertices-Definition. Außerdem können Sie Objekte als "Aufzählungszeichen" festlegen und feste Zeitschritte verwenden, um die Tunnelwahrscheinlichkeit zu verringern. Keine Lösung ist perfekt. Aber das sollte funktionieren. – FuzzyBunnySlippers

+0

Vielleicht brauchst du den Kreis nicht ... Ich dachte, du könntest keine Masse für eine Kettenform einstellen ... Ich werde das überprüfen. – FuzzyBunnySlippers