9

我正在制作一个游戏,玩家用手指拖船。我将 Box2D 用于游戏的物理方面。特别是,我使用b2MouseJoint将触摸事件附加到船以让触摸事件拖动船。

但是有一个问题,船在被拖的时候移动的方式是不现实的;它可以简单地向任何方向拖动,而在现实世界中,船只能沿其长度移动,并且会有水阻力,因此很难改变船的运动方向。因此,我需要一种模拟水阻力的方法,以使船的运动逼真。

是否可以在 Box2D 中模拟它?线性阻尼和角阻尼只是让船很难移动,但我只是希望船容易向一个方向移动,它应该只抵抗方向的改变。

PS我认为我不需要为这个问题发布我的代码,但是如果您想查看代码摘录,请告诉我。

4

2 回答 2

2

这实际上不是一件微不足道的事情,因此“完整”的答案有点令人期待。是 box2d 中汽车示例的链接。查看那个绅士的演示(卷轴中的第三个演示是最相关的),并看看他的源代码。他的模拟比你需要完成的要先进一点,所以如果你能理解它是如何工作的,那么创建一个更简单的版本就没有问题了。

dougk16 的 box2d 扩展中有很多代码(可以理解),因此可能很难弄清楚他的汽车是如何工作的。所以这里有一个简单的起点:您想模拟一个可以前后移动以及转动的身体。因此,这是一种从您的船体当前朝向向前或向后延伸的力,以及一种使船体向左或向右转动的扭矩。这应该是您获得非常酷的东西所需的全部内容。下面是一些伪代码,可以作为一个合理的起点:

if( needs_to_turn )
{
   // turn_direction will either be -1 (left) or 1 (right), boat_torque can be a constant to start with, but should probably be controlled by the user
   body.ApplyTorque(turn_direction * boat_torque);
}

if( needs_to_move )
{
   // facing_vector should be a vector pointing in the direction the boat is facing, the boat_force could be a constant, but again should be controlled by the user
   body.ApplyForce(facing_vector * boat_force);
}

我将以另一个链接结束我的答案,这次是相关教程。它不像 dougk16 的动作脚本那么酷,但它可能对你更有用,因为它是教程格式的。

于 2012-02-19T04:21:39.427 回答
1

我有一个建议,它可能是微不足道的,但需要大量的粒子,因此可能需要一些额外的处理能力。您可能会创建许多带有碰撞的小圆圈,但不要绘制它们。所以你会得到水的模拟效果,但不是水。圆圈的大小将决定你需要多少个圆圈来填满屏幕,从而决定你的表现。我知道它有点像黑客解决方案,但它可能值得一试。你会找到一个适合圆圈大小的快乐媒介,它既可以实现良好的性能,又可以实现流畅的动态。

糟糕,似乎有人已经提出了这个建议……抱歉。

于 2012-02-16T22:36:29.413 回答