Zastosowanie efektu wir / wir w Box2d / Cocos2d dla iPhone'a

UżyłemSamouczek Nicka Velliosa stworzyć grawitację promieniową za pomocą obiektu Box2D. Jestem świadomyZrób wir tutaj na SO, ale nie mogłem wymyślić, jak go wdrożyć w moim projekcie.

Zrobiłem obiekt wirowy, który jest czujnikiem Box2D circleShape, który obraca się ze stałą prędkością kątową. Kiedy inne obiekty Box2D kontaktują się z tym obiektem wirowym, chcę, aby obracały się wokół z taką samą prędkością kątową jak wir, stopniowo zbliżając się do środka wiru. W tym momencie obiekt jest przyciągany do środka wiru, ale będzie kierował się prosto do środka wiru, zamiast obracać się wokół niego powoli, tak jak tego chcę. Będzie również podróżować w przeciwnym kierunku niż wir, jak również z rotacją wiru.

Biorąc pod uwagę wir i ciało box2D, jak mogę ustawić ciało box2d tak, aby obracało się z wirem, gdy zostanie „wessane”.

Ustawiam obrót wiru, kiedy tworzę go tak:

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

Oto jak stosuję grawitację promieniową, jak naPrzykładowy kod Nicka Velliosa.

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


}

Aktualizacja Myślę, że iForce2d dał mi wystarczającą ilość informacji, aby dostać się na drogę, teraz to tylko ulepszanie. To właśnie robię w tej chwili, oprócz powyższego kodu. Dzieje się tak, ponieważ ciało zyskuje wystarczającą prędkość, aby opuścić studnię grawitacyjną wiru - gdzieś będę musiał sprawdzić, czy prędkość pozostaje poniżej tej wartości. Jestem trochę zaniepokojony, że w tej chwili nie biorę pod uwagę masy obiektu.

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