Применение эффекта вихря / водоворота в Box2d / Cocos2d для iPhone

Я использовалНик Веллиос & apos; руководство создать радиальную гравитацию с помощью объекта Box2D. Я в курсеСделать вихрь здесь на SO, но я не мог понять, как реализовать это в моем проекте.

Я сделал вихревой объект, который представляет собой датчик Box2D circleShape, который вращается с постоянной угловой скоростью. Когда другие объекты Box2D контактируют с этим вихревым объектом, я хочу, чтобы они вращались с той же угловой скоростью, что и вихрь, постепенно приближаясь к центру вихря. В данный момент объект притягивается к центру вихря, но он направляется прямо к центру вихря, а не вращается вокруг него медленно, как я хочу. Он также будет перемещаться в направлении, противоположном вихревому, а также при вращении вихря.

Учитывая вихрь и тело box2D, как я могу настроить тело box2d, чтобы оно вращалось вместе с вихрем, когда оно «всасывается».

Я устанавливаю вращение вихря, когда создаю его так:

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

Вот как я применяю радиальную гравитацию согласноНик Веллиос & apos; образец кода.

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


}

Update Я думаю, что iForce2d дал мне достаточно информации, чтобы встать у меня на пути, теперь он просто настраивается. Это то, чем я сейчас занимаюсь, в дополнение к приведенному выше коду. То, что происходит, состоит в том, что тело набирает достаточную скорость, чтобы хорошо выйти из вихревой гравитации - где-то мне нужно проверить, чтобы скорость оставалась ниже этой цифры. Я немного обеспокоен тем, что не принимаю во внимание массу объекта в данный момент.

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

Ответы на вопрос(2)

Ваш ответ на вопрос