Aplicación de un efecto vórtice / whirlpool en Box2d / Cocos2d para iPhone

he usadoTutorial de Nick Vellios para crear gravedad radial con un objeto Box2D. Estoy consciente deHacer un vórtice aquí en SO, pero no pude averiguar cómo implementarlo en mi proyecto.

He creado un objeto vórtice, que es un sensor de forma de círculo Box2D que gira con una velocidad angular constante. Cuando otros objetos de Box2D entran en contacto con este objeto de vórtice, quiero que giren a la misma velocidad angular que el vórtice, acercándose gradualmente al centro del vórtice. En este momento, el objeto se siente atraído por el centro del vórtice, pero se dirigirá directamente hacia el centro del vórtice, en lugar de girar alrededor de él lentamente como yo quisiera. También viajará en la dirección opuesta a la del vórtice, así como con la rotación del vórtice.

Dado un vórtice y un cuerpo box2D, ¿cómo puedo configurar el cuerpo de box2d para que gire con el vórtice a medida que se "aspira"?

Puse la rotación del vórtice cuando lo creo así:

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

Aquí es cómo estoy aplicando la gravedad radial, segúnCódigo de muestra de Nick Vellios.

-(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


}

Actualizar Creo que iForce2d me ha dado suficiente información para seguir mi camino, ahora solo es un ajuste. Esto es lo que estoy haciendo en este momento, además del código anterior. Lo que está sucediendo es que el cuerpo gana la velocidad suficiente para salir del pozo de gravedad del vórtice; en algún lugar necesitaré verificar que la velocidad se mantenga por debajo de esta cifra. Estoy un poco preocupado por no tener en cuenta la masa del objeto en este momento.

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta