我有两个 box2d 实体,一个是静态的,另一个是动态的。现在我已经通过动态身体加入了静态身体b2revoluteJoint
。所以我的问题是:
1)我如何移动动态体touchMoved
以及连接在动态体上相同位置的静态体。
2)我如何移动两个以上的身体。假设我有一个人的身体,腿和手是连在一起的b2RevoluteJoint
。现在我怎样才能把所有的身体一起移动来创造一个自然的外观。
我是 box2d 的新手,所以遇到了一些困难。任何人请帮助我解决这个问题。谢谢!
我有两个 box2d 实体,一个是静态的,另一个是动态的。现在我已经通过动态身体加入了静态身体b2revoluteJoint
。所以我的问题是:
1)我如何移动动态体touchMoved
以及连接在动态体上相同位置的静态体。
2)我如何移动两个以上的身体。假设我有一个人的身体,腿和手是连在一起的b2RevoluteJoint
。现在我怎样才能把所有的身体一起移动来创造一个自然的外观。
我是 box2d 的新手,所以遇到了一些困难。任何人请帮助我解决这个问题。谢谢!
您可以使用 MouseJoint 来移动动态主体,但该动作可能看起来不“自然”。
您可以使用“Seek”行为将单个实体移向接触点。您将需要限制您希望身体移动的速度,并将屏幕上的触摸点转换为 box2d 世界空间中的一个点。完成此操作后,您可以使用如下所示的功能将身体移向触摸点。在每个物理更新周期对您的实体调用此操作。
void MoveToTarget()
{
// Get the distance to the target.
Vec2 toTarget = GetTargetPos() - GetBody()->GetWorldCenter();
toTarget.Normalize();
Vec2 desiredVel = GetMaxSpeed()*toTarget;
Vec2 currentVel = GetBody()->GetLinearVelocity();
Vec2 thrust = desiredVel - currentVel;
GetBody()->ApplyForceToCenter(GetMaxLinearAcceleration()*thrust);
}
我已经成功地将它用于导弹和移动物体并取得了一些成功(请参阅此处的博客文章)。源代码也可以在网站上找到。
您可以连接多个物体并使用它们纯物理移动它们。但这真的很难。我在为另一个项目创建蜘蛛时遇到了类似的问题,发现最好使用 2-D 骨骼动画工具(Spine),然后在身体上放置一个合理的形状(蜘蛛真的很大,所以球体可以很好地处理它)在 box2d 中处理移动它和碰撞检测。
另一方面,我使用一系列由旋转关节连接的球创建了一条蛇。在第一个(最大的)球上进行搜索时,动作看起来非常好。
这个有帮助吗?
1) 用于在 box2d 中拖动对象的是 mouseJoint。在 touchBegan 中,您使用要移动的对象和任何静态体(例如 groundBody)创建鼠标关节,但在此关节中,这可以是每个静态体。在 touchMoved 中,您可以更改 mouseJoint 的位置。在 touchEnded 破坏关节:)
2)你可以创建更多的revoluteJoints,例如腿和主体是连接的,手臂和主体也是连接的。