Aplicando um efeito vortex / whirlpool no Box2d / Cocos2d para iPhone

Eu useiTutorial de Nick Vellios para criar gravidade radial com um objeto Box2D. Estou cienteFaça um Vortex aqui no SO, mas não consegui descobrir como implementá-lo no meu projeto.

Fiz um objeto de vórtice, que é um sensor CircleShape Box2D que gira com uma velocidade angular consistente. Quando outros objetos Box2D entram em contato com esse objeto de vórtice, eu quero que eles girem na mesma velocidade angular que o vórtice, gradualmente se aproximando do centro do vórtice. No momento em que o objeto é atraído para o centro do vórtice, ele vai direto para o centro do vórtice, em vez de girar lentamente como eu quero. Ele também viajará na direção oposta ao vórtice, assim como na rotação do vórtice.

Dado um vórtice e um corpo box2D, como posso definir o corpo da caixa2 para girar com o vórtice quando ele for sugado para dentro.

Eu defino a rotação do vórtice quando o crio assim:

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

Aqui está como eu estou aplicando a gravidade radial, conformeCódigo de exemplo 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


}

Atualizar Eu acho que o iForce2d me deu informações suficientes para seguir meu caminho, agora é apenas um ajuste. Isso é o que estou fazendo no momento, além do código acima. O que está acontecendo é que o corpo ganha velocidade suficiente para sair bem da gravidade do vórtice - em algum lugar, eu precisarei verificar se a velocidade permanece abaixo dessa figura. Estou um pouco preocupado por não estar levando em conta a massa do objeto no 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() );

questionAnswers(2)

yourAnswerToTheQuestion