Objective c 在适用于iPhone的Box2d/Cocos2d中应用漩涡/漩涡效果

Objective c 在适用于iPhone的Box2d/Cocos2d中应用漩涡/漩涡效果,objective-c,math,cocos2d-iphone,box2d,Objective C,Math,Cocos2d Iphone,Box2d,我曾经使用Box2D对象创建径向重力。我知道这一点,但我不知道如何在我的项目中实现它 我制作了一个漩涡物体,它是一个Box2D圆形传感器,以一致的角速度旋转。当其他Box2D对象接触这个漩涡对象时,我希望它们以与漩涡相同的角速度旋转,逐渐接近漩涡的中心。此时物体被吸引到漩涡的中心,但它会笔直地朝向漩涡的中心,而不是像我希望的那样缓慢地绕着它旋转。它也将以与漩涡相反的方向移动,并伴随着漩涡的旋转 给定一个漩涡和一个box2D实体,如何设置box2D实体在“吸入”漩涡时随漩涡旋转 我在创建漩涡时设置

我曾经使用Box2D对象创建径向重力。我知道这一点,但我不知道如何在我的项目中实现它

我制作了一个漩涡物体,它是一个Box2D圆形传感器,以一致的角速度旋转。当其他Box2D对象接触这个漩涡对象时,我希望它们以与漩涡相同的角速度旋转,逐渐接近漩涡的中心。此时物体被吸引到漩涡的中心,但它会笔直地朝向漩涡的中心,而不是像我希望的那样缓慢地绕着它旋转。它也将以与漩涡相反的方向移动,并伴随着漩涡的旋转

给定一个漩涡和一个box2D实体,如何设置box2D实体在“吸入”漩涡时随漩涡旋转

我在创建漩涡时设置了漩涡的旋转,如下所示:

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.angle = 2.0f;
bodyDef.angularVelocity = 2.0f;
下面是我如何应用径向重力,根据

更新我想如果Force2D已经给了我足够的信息让我上路,现在它只是在调整。这就是我目前正在做的,除了上面的代码。现在发生的事情是物体获得足够的速度离开漩涡的重力井-在某个地方我需要检查速度是否保持在这个数字以下。我有点担心我没有考虑到物体目前的质量

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

听起来你只需要根据身体当前点的漩涡方向施加另一个力。您可以使用b2Body::GetLinearVelocityFromWorldPoint来查找世界上任何一点的漩涡速度。从Box2D来源:

/// Get the world linear velocity of a world point attached to this body.
/// @param a point in world coordinates.
/// @return the world velocity of a point.
b2Vec2 GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const;
这就是:

b2Vec2 vortexVelocity = vortexBody->GetLinearVelocityFromWorldPoint( suckedInBody->GetPosition() );
一旦你知道了你的目标速度,你就可以计算出从当前速度到期望速度需要多少力。这可能会有帮助:

该链接中的主题仅讨论一维情况。在你的例子中,如果你将被吸入物体的当前速度投射到涡流速度矢量上,它基本上也是一维的:

b2Vec2 vortexVelNormal = vortexVelocity;
vortexVelNormal.Normalize();
b2Vec2 bodyVelocity = b2Dot( vortexVelNormal, suckedInBody->GetLinearVelocity() ) * vortexVelNormal;
现在,体速度和涡流速度将在同一个方向,你可以计算出要施加多少力。然而,如果你只是简单地施加足够的力来精确匹配漩涡的速度,那么被吸入的物体很可能会进入围绕漩涡的轨道,并且永远不会真正被吸入。我想你会想让力稍微小一点,我也会根据重力强度来缩小它,否则被吸入的物体一旦接触到旋涡的外缘就会被甩到一边。这可能需要大量的调整才能达到你想要的效果

编辑:

应用的力应基于当前速度(bodyVelocity)和所需速度(vortexVelocity)之间的差值,即,如果物体已随漩涡移动,则无需应用任何力。看看我上面给出的链接中标题为“使用力”的小节中的最后一个代码块。如果你将“vel”和“desiredVel”替换为你的体速度和涡流速度向量的大小,那么最后三行就可以满足你的需要:

float desiredVel = vortexVelocity.Length();
float currentVel = bodyVelocity.Length();
float velChange = desiredVel - currentVel;
float force = body->GetMass() * velChange / (1/60.0); //for a 1/60 sec timestep
body->ApplyForce( b2Vec2(force,0), body->GetWorldCenter() );

但请记住,这可能会使物体进入轨道,因此在这一过程中的某个地方,你会希望减小你施加的力的大小,例如,将“期望水平”降低一定百分比,将“力”减少一些百分比,等等。如果你也可以缩小力的比例,使其在漩涡的外缘为零,可能看起来会更好。

我有一个项目,其中小行星围绕一个中心点旋转(有东西在它们之间跳跃……这是一个不同的点)

  • 它们通过B2DistanceJoint连接到“中心”车身
  • 可以控制关节长度,使其缓慢向内(或向外)螺旋。这会使您找到谷物控制,而不是平衡力控制,这可能很困难
  • 还可以应用切向力使它们围绕中心旋转
  • 通过应用不同(或随机更改)的切向力,可以使 相撞等

我对这个问题给出了一个更完整的答案。

这看起来是个很好的答案,今晚我会试一试,让你知道我的进展如何。谢谢为了澄清我应该做的不是我现在做的,而是在我的路上,谢谢,我想我在路上了。我想我需要根据你给我的链接设定一个最大可能的速度,这样物体就不能像现在那样离开重力。如果你看到我做了一些明显愚蠢的事情,请让我知道,否则我会继续玩下去,并在我弄明白后将其标记为正确。再次感谢你的帮助。
float desiredVel = vortexVelocity.Length();
float currentVel = bodyVelocity.Length();
float velChange = desiredVel - currentVel;
float force = body->GetMass() * velChange / (1/60.0); //for a 1/60 sec timestep
body->ApplyForce( b2Vec2(force,0), body->GetWorldCenter() );