Nick Velliosのチュートリアルを使用して、Box2Dオブジェクトで放射状の重力を作成しました。ここSOでMakeaVortexを知っていますが、プロジェクトに実装する方法がわかりませんでした。
一定の角速度で回転するBox2DcircleShapeセンサーである渦オブジェクトを作成しました。他のBox2Dオブジェクトがこの渦オブジェクトに接触するとき、渦と同じ角速度で回転させ、徐々に渦の中心に近づけてほしいと思います。現時点では、オブジェクトは渦の中心に引き付けられていますが、私が望むようにゆっくりと回転するのではなく、渦の中心に向かってまっすぐに向かいます。また、渦の回転と同様に、渦とは反対の方向に移動します。
渦とbox2Dボディが与えられた場合、box2dボディが「吸い込まれた」ときに渦とともに回転するように設定するにはどうすればよいですか。
次のように作成するときに、渦の回転を設定します。
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.angle = 2.0f;
bodyDef.angularVelocity = 2.0f;
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
}
更新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() );