这实际上不是一件小事,所以一个'完整'的答案有点希望。 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的动作脚本那么酷,但它对你来说可能更有用,因为它是以教程格式。
您是否尝试过使用[drag equation](http://en.wikipedia.org/wiki/Drag_equation)?横截面积术语* A *将根据船相对于其速度的方向而改变,这应该做你想做的事。你总是可以用一些便宜的启发式来估计* A *。 – Rahul 2012-01-15 04:14:25
@Rahul,谢谢你的提示。我已经通过一些近似技术将阻力方程式添加到代码中(例如使用速度与船的角度来提供参考区域),我可以看到最新代码中模拟的一些防水性,但是当似乎有一些疯狂的运动时船与世界边界相撞。我想在这里寻求进一步帮助之前弄清楚什么是错误的。再次感谢提示。 – Lukman 2012-01-20 04:05:44
一个厚脸皮的解决方法可能是创建大量小质量的非常小的圆体,以填充船周围的空间。我还没有在物理或处理能力方面测试过这种可行性(但是),这就是为什么我没有把它作为正确答案提交。 – Andrey 2012-02-14 12:01:16