2016-03-16 15 views
5

Ho una struttura ad albero arbitrariamente profonda di corpi in box2d. Quando un genitore si scontra con qualcosa, dovrebbe spostare i suoi figli. D'altra parte, se il bambino viene spostato a causa di una collisione, il genitore non deve essere toccato. Un corpo può essere un genitore per un corpo e un bambino per un altro allo stesso tempo.Box2D Connessione gerarchica tra corpi

C'è un modo per implementarlo in Box2D? Nessuna delle articolazioni sembra essere in grado di rappresentarlo, dal momento che sono tutte simmetriche.

+0

Si prega di considerare accettare la mia risposta se risponde alla tua domanda o lasciare un commento che spiega ciò che sembra ancora senza risposta. Grazie! –

+0

Mi dispiace, ma durante quei 9 mesi ho implementato una soluzione diversa che non era più basata su box2d, quindi non posso verificare se la tua soluzione funziona, anche se sembra promettente. – anlumo

risposta

2

Sì. Algoritmicamente parlando, usa mondi concettualmente annidati.

Ecco qualche pseudo codice per questo. Dovrai inserire dettagli come impostare i corpi come dinamici e quali dovrebbero essere le densità. Speriamo che il codice mostri un modo per ottenere questo risultato:

extern void render(b2World& world, b2Vec2 position); 

b2World world(b2Vec2(0, 0)); 
b2World subWorld(b2Vec2(0, 0)); 

b2BodyDef bodyDef; 

// Create body outside of "parent". 
bodyDef.position = b2Vec2(-15, 14); 
b2Body* otherBody = world.CreateBody(&bodyDef); 

// Setup "parent" body. 
b2Body* parentBody = world.CreateBody(&bodyDef); 
b2Vec2 vertices[] = { b2Vec2(10, 10), b2Vec2(-10, 10), b2Vec2(-10, -10), b2Vec2(10, -10) }; 
b2PolygonShape parentShape; 
parentShape.Set(vertices, 4); 
b2FixtureDef parentFixtureDef; 
parentFixtureDef.shape = &parentShape; 
parentBody->CreateFixture(&parentFixtureDef); 

// Setup container for bodies "within" parent body... 
b2BodyDef childBodyDef; 
// set childWorldBody to being static body (all others dynamic) 
b2Body* childWorldBody = subWorld.CreateBody(&childBodyDef); 
b2ChainShape containerShape; 
containerShape.CreateLoop(vertices, 4); 
b2FixtureDef childContainerFixture; 
childContainerFixture.shape = &containerShape; 
childWorldBody->CreateFixture(&childContainerFixture); 

// First example of creating child body "within" the parent body... 
childBodyDef.position = b2Vec2(0, 0); // Inside child world and with childContainerShape. 
b2Body* bodyInChild = subWorld.CreateBody(&childBodyDef); 
// Call subWorld.CreateBody for all the bodies in the child world. 
// Always create those child bodies within the bounds of vertices. 

for (;;) 
{ 
    world.Step(0.1, 8, 3); 
    subWorld.Step(0.1, 8, 3); 

    render(world, b2Vec2(0, 0)); 
    render(subWorld, parentBody->GetPosition()); 
}