Anwenden eines Wirbel- / Strudeleffekts in Box2d / Cocos2d für iPhone

Ich habe benutztDas Tutorial von Nick Vellios Radiale Schwerkraft mit einem Box2D-Objekt erzeugen. Ich bin mir bewusst, dassMachen Sie einen Vortex hier auf SO, aber ich konnte nicht herausfinden, wie ich es in meinem Projekt implementieren kann.

Ich habe ein Wirbelobjekt erstellt, einen Box2D-CircleShape-Sensor, der sich mit einer konstanten Winkelgeschwindigkeit dreht. Wenn andere Box2D-Objekte dieses Wirbelobjekt berühren, sollen sie sich mit der gleichen Winkelgeschwindigkeit wie der Wirbel drehen und sich allmählich dem Zentrum des Wirbels annähern. Im Moment wird das Objekt vom Zentrum des Wirbels angezogen, aber es bewegt sich direkt zum Zentrum des Wirbels, anstatt sich langsam zu drehen, wie ich es möchte. Es bewegt sich auch in die entgegengesetzte Richtung als der Wirbel sowie mit der Rotation des Wirbels.

Wie kann ich bei einem Wirbel und einem Box2D-Körper den Box2D-Körper so einstellen, dass er sich mit dem Wirbel dreht, wenn er "angesaugt" wird?

Ich stelle die Rotation des Wirbels so ein:

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.angle = 2.0f;
bodyDef.angularVelocity = 2.0f;

Hier ist, wie ich die radiale Schwerkraft gemäß anwendeNick Vellios 'Beispielcode.

-(void)applyVortexForcesOnSprite:(CCSpriteSubclass*)sprite spriteBody:(b2Body*)spriteBody withVortex:(Vortex*)vortex VortexBody:(b2Body*)vortexBody vortexCircleShape:(b2CircleShape*)vortexCircleShape{

    //From RadialGravity.xcodeproj
    b2Body* ground = vortexBody;
    b2CircleShape* circle = vortexCircleShape;
    // Get position of our "Planet" - Nick
    b2Vec2 center = ground->GetWorldPoint(circle->m_p);
    // Get position of our current body in the iteration - Nick
    b2Vec2 position = spriteBody->GetPosition();
    // Get the distance between the two objects. - Nick
    b2Vec2 d = center - position;
    // The further away the objects are, the weaker the gravitational force is - Nick
    float force = 1 / d.LengthSquared(); // 150 can be changed to adjust the amount of force - Nick
    d.Normalize();
    b2Vec2 F = force * d;
    // Finally apply a force on the body in the direction of the "Planet" - Nick
    spriteBody->ApplyForce(F, position);
    //end radialGravity.xcodeproj


}

Aktualisieren Ich denke, iForce2d hat mir genug Informationen gegeben, um mich auf den Weg zu machen. Jetzt wird nur noch optimiert. Dies ist, was ich im Moment zusätzlich zum obigen Code mache. Was passiert, ist, dass der Körper genug Geschwindigkeit gewinnt, um die Schwerkraft des Wirbels gut zu verlassen - irgendwo muss ich überprüfen, ob die Geschwindigkeit unter dieser Zahl bleibt. Ich bin ein wenig besorgt, dass ich die Masse des Objekts im Moment nicht berücksichtige.

b2Vec2 vortexVelocity = vortexBody->GetLinearVelocityFromWorldPoint(spriteBody->GetPosition() );

b2Vec2 vortexVelNormal = vortexVelocity;
vortexVelNormal.Normalize();
b2Vec2 bodyVelocity = b2Dot( vortexVelNormal, spriteBody->GetLinearVelocity() ) * vortexVelNormal;

//Using a force
b2Vec2 vel = bodyVelocity;
float forceCircleX =    .6 * bodyVelocity.x;
float forceCircleY =    .6 * bodyVelocity.y;

spriteBody->ApplyForce( b2Vec2(forceCircleX,forceCircleY), spriteBody->GetWorldCenter() );

Antworten auf die Frage(2)

Ihre Antwort auf die Frage