【问题标题】:Simulating water resistance in Box2D在 Box2D 中模拟防水性
【发布时间】:2012-01-15 01:33:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否尝试过使用drag equation?横截面积项 A 将根据船相对于其速度的方向而变化,这应该可以满足您的需求。而且你总是可以用一些廉价的启发式方法来估计 A
  • @Rahul,感谢您的提示。我已经使用一些近似技术将阻力方程添加到代码中(例如使用速度与船的角度来得出参考区域),我可以看到在最新代码中模拟了一些水阻力,但似乎有一些疯狂的运动时船与世界边界相撞。在在这里寻求进一步帮助之前,我试图弄清楚出了什么问题。再次感谢您的提示。
  • 一个厚颜无耻的解决方法可能是创建许多质量很小的非常小的圆形物体来填充船周围的空间。我还没有在物理或处理能力方面测试它的可行性(尚未),这就是为什么我没有将其作为正确答案提交。

标签: box2d box2d-iphone


【解决方案1】:

这实际上不是一件微不足道的事情,因此“完整”的答案有点令人期待。 Here 是 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);
}

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 不幸的是,IMO,这些粒子会干扰世界上存在的其他物理对象,所以我宁愿不使用这种骇人听闻的技术。不过感谢您的建议。
    • @Fred 我最终玩弄了它,但要保持平衡是个大问题 - 要么圆圈太大而阻碍 all 运动,要么整个事情对我的处理器来说太重了。请注意,我是在 JS 端口上尝试的,我认为这通常会慢一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多