【发布时间】:2012-05-20 05:21:26
【问题描述】:
我使用Nick Vellios' tutorial 使用 Box2D 对象创建径向重力。我在 SO 上知道Make a Vortex,但我不知道如何在我的项目中实现它。
我制作了一个涡流对象,它是一个 Box2D 圆形传感器,它以一致的角速度旋转。当其他 Box2D 对象接触这个涡旋对象时,我希望它们以与涡旋相同的角速度旋转,逐渐靠近涡旋的中心。此刻物体被吸引到漩涡的中心,但它会直奔漩涡的中心,而不是像我想要的那样缓慢地绕着它旋转。它也将沿与涡旋相反的方向以及涡旋的旋转运动。
给定一个漩涡和一个 box2D 体,我如何设置 box2d 体在它被“吸入”时随漩涡一起旋转。
当我这样创建漩涡时,我设置了它的旋转:
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.angle = 2.0f;
bodyDef.angularVelocity = 2.0f;
根据Nick Vellios' sample code,这是我应用径向重力的方式。
-(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() );
【问题讨论】:
标签: objective-c math cocos2d-iphone box2d