模拟Box2D的防水性

时间:2012-01-15 01:33:24

标签: box2d box2d-iphone

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

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

可以在Box2D中模拟它吗?线性阻尼和角度阻尼简单地使船难以移动,但我只是希望船在一个方向上易于移动,它应该只能抵抗改变方向。

P.S。我认为我不需要发布此问题的代码,但如果您想查看代码摘录,请告诉我。

2 个答案:

答案 0 :(得分:2)

这实际上并不是一件容易的事,所以一个“完整”的答案有点希望。 Here是指向box2d中汽车示例的链接。查看绅士的demoreel(卷轴中的第三个演示是最相关的),并采取他的源代码。他的模拟比你需要完成的更先进,所以如果你能理解它是如何工作的,你就可以创建一个更简单的版本。

在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);
}

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

答案 1 :(得分:1)

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

哎呀,看来有人已经建议过了......抱歉。