我有两个box2d主体,一个是静态的,另一个是动态的。现在我通过b2revoluteJoint
加入了具有动态体的静态体。所以我的问题是:
1)如何在touchMoved
上移动Dynamic Body以及附着在动态主体上相同位置的静态主体。
2)我如何移动两个以上的尸体。假设我有一个人体,腿和手与b2RevoluteJoint
结合在一起。现在我如何将所有的身体移动到一起以创造自然的外观。
我在box2d中是全新的,所以遇到了一些困难。关于这个问题请任何人帮助我。谢谢!
答案 0 :(得分:2)
您可以使用MouseJoint移动动态主体,但动作可能看起来不“自然”。
您可以使用“搜寻”行为将单个身体移向触控点。您需要建立对身体移动速度的限制,并将屏幕上的触摸点转换为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);
}
我已经成功地将它用于导弹和移动事物并取得了一些成功(see blog post here)。源代码也可在网站上找到。
您可以连接多个实体并使用纯物理移动它们。但这很难真的。我有一个类似的问题为另一个项目创建蜘蛛,并发现最好使用二维骨架动画工具(Spine),然后只是铺设一个合理的形状(蜘蛛是非常大的斑点,所以一个球体很好地处理它)在box2d的主体上方处理移动它和碰撞检测。
另一方面,我用一系列通过旋转关节连接的球创造了一条蛇。通过对第一个(最大)球的搜索行为,动作看起来非常好。
这有用吗?
答案 1 :(得分:1)
1)在box2d中拖动对象是mouseJoint。在touchBegan中,您可以使用要移动的对象和任何静态体(例如groundBody)创建鼠标关节,但在此关节中,这可以是每个静态体。在touchMoved中,您可以更改mouseJoint的位置。在touchEnded中销毁联合:)
2)你可以创建更多的revoluteJoints,例如腿和主体连接,手臂和主体也连接。