2012-01-15 57 views
9

我正在制作一款游戏,玩家用手指拖动船只。我使用Box2D作为游戏的物理方面。特别是,我使用b2MouseJoint将触摸事件附加到船上,让触摸事件拖动船只。模拟Box2D中的防水功能

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

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

P.S.我不认为我需要发布我的代码这个问题,但是让我知道如果你想看到代码摘录。

+2

您是否尝试过使用[drag equation](http://en.wikipedia.org/wiki/Drag_equation)?横截面积术语* A *将根据船相对于其速度的方向而改变,这应该做你想做的事。你总是可以用一些便宜的启发式来估计* A *。 – Rahul 2012-01-15 04:14:25

+0

@Rahul,谢谢你的提示。我已经通过一些近似技术将阻力方程式添加到代码中(例如使用速度与船的角度来提供参考区域),我可以看到最新代码中模拟的一些防水性,但是当似乎有一些疯狂的运动时船与世界边界相撞。我想在这里寻求进一步帮助之前弄清楚什么是错误的。再次感谢提示。 – Lukman 2012-01-20 04:05:44

+0

一个厚脸皮的解决方法可能是创建大量小质量的非常小的圆体,以填充船周围的空间。我还没有在物理或处理能力方面测试过这种可行性(但是),这就是为什么我没有把它作为正确答案提交。 – Andrey 2012-02-14 12:01:16

回答

1

我有一个建议可能是微不足道的,但需要大量的粒子,因此也许有一些额外的处理能力。你可能会创建许多有碰撞的小圆圈,但不能画出它们。所以你会得到水的模拟效果,但不是水。圆圈的大小将决定你需要填充屏幕的数量以及你的性能。我知道它有点破解,但它可能值得一试。你会发现一个圆圈大小的快乐媒介,它们都具有良好的性能和动态性。

糟糕,它似乎有人已经提出这个...对不起。

+0

不幸的是,IMO,这些粒子会干扰世界上存在的其他物理对象,所以我宁愿不使用这种黑客技术。 (还是)感谢你的建议。 – Lukman 2012-02-17 10:51:31

+0

@Fred我最终玩弄了它,这是一个巨大的问题,要么保持平衡 - 要么是圈子太大,阻碍所有*运动,要么整个事情对我的处理器来说太重了。请注意,我正在JS端口上尝试它,我认为它通常会慢一点。 – Andrey 2012-02-19 10:16:30

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的动作脚本那么酷,但它对你来说可能更有用,因为它是以教程格式。