水/海洋模拟与物理


42

我正在寻找有关水模拟的参考资料,以及如何模拟水与物体(如船,船,潜艇)的相互作用。

我发现了很多关于水的视觉方面(波浪,反射等)的参考,但是关于如何处理水与人体相互作用的方式却很少。我在游戏开发方面的经验非常有限,我真的很固守在这里。

Bascally我希望能够使船的位置根据波浪而变化。我怎样才能做到这一点?

我正在使用Panda3D,但希望听到有关任何可用技术中使用的技术和实现的信息。

Answers:


79

基本上,您正在为船建模6个对象:俯仰,偏航,侧倾,升沉,摇摆和喘振。

替代文字

俯仰,偏航和横滚是船舶在波浪的波折中上下旋转时可以进行的旋转。升沉,摇摆和浪涌是由波浪引起的运动,这些波浪将船舶推向周围和/或船舶沿波浪面滑动。

“就像在山上驾驶汽车...”

想象一下,一条水上的小船就像一辆汽车驶过丘陵地带。如果汽车在起伏的山丘上行驶(就像一艘翻过波浪的船),则它将随着其在山坡上的上下倾斜和倾斜。这就是俯仰,偏航和滚动。如果山丘(海浪)很大,则汽车(船)将随着行驶而上下行驶,俯仰,偏航和滚动。如果山(浪)真的很小(比汽车/船小),那么汽车(船)将只是越过它们,而不是俯仰,偏航或侧倾。

一艘大船只能在较小的波浪中耕作,而一艘小船会在波浪中上下运动。以我们的汽车为例,想象一下有人在一组小山丘(海浪)上骑自行车(小船)。他们会随着走动而上下滚动。然后有人开着一辆大卡车在他们上面。卡车比山丘大,因此在越过山坡时并不会真正上下颠簸。

但是,与汽车不同的是,船在水中,但它的运动会有所减弱。想象一下,一辆拥有柔软海绵轮胎的汽车。当它驶过狭窄的山丘时,海绵状轮胎会使其平滑。船的运动也受到抑制,因此小浪不会使其像在岩石道路上的汽车一样上下反弹。潜艇有点像是最终的减震船,因为潜入水中几乎不受表面波的影响。但是,如果它在表面,它将被海浪移动。

船也将在海浪上滑动。例如,顺着波浪驶下的船只将向前猛冲。因此,为了扩展我们的汽车示例,请使其成为具有大的海绵状车轮的汽车,该车轮在略微光滑的表面上行驶。除非汽车运行发动机来补偿打滑,否则它将滑下山坡。即使正在运行引擎,也会有一些打滑。

汽车和山坡类比存在问题的一个地方是,波浪随时间变化的形状。波浪在波涛汹涌时,一艘固定的船会上下摆动。

海浪移动船

如果船上没有风吹动它,并且波浪是理想的正弦波形状,则船在波浪中摆动时基本上不会移动。它沿波浪的一面滑动,然后沿波浪的背面一面滑动。

但是,如果波浪不是对称的(如下图所示),则波浪将使船舶移动。因为波浪的一侧很陡,所以船将迅速滑下该面并被波浪的面推动。但是,波浪的缓和后坡不会有太大运动。

替代文字

这不是影响船舶运动的最完美的波浪运动和形状模型,但可能会进行粗略的模拟。

风的影响

风也将以不依赖于波动或船舶运动的方式推动船舶航行。风的方向和作用力可能与波浪的方向和作用力不同。

浮力

浮力是您的船如何漂浮。非常浮力的船在水面高高漂浮,而那些不是浮力的船。中性浮力的船(潜艇)基本上可以在水下的任何位置“悬停”,既不下沉也不上升。如果要模拟船沉没,请使其变为负浮力,然后它将开始沉没。

浮力还影响船运动的衰减。一艘非常浮力的船会在水面上跳来跳去,并受到波浪的强烈影响。浮力较小的船将被部分淹没,并且不会受到太大影响。考虑一下漂浮在水面上的乒乓球与漂浮但部分在水下的苹果之间的区别。每次打球时,乒乓球都会上下摆动。另一方面,苹果并没有对每个波浪细节做出反应。

倾覆

如果俯仰,偏航和/或横滚超过某个值,则您的飞船将倾翻。翻倒时,可能会充满水,从而降低浮力,从而使其不再漂浮。

晕船了:o〜

平行于波浪运动方向的船舶“处于低谷”,至少以我的经验,它将产生最令人恶心的效果:)如果您沿波浪运动的方向行驶,则可以平稳行驶-就像背风一样。如果您沿着与海浪相反的方向行驶,那么您将遇到非常艰难的旅程,因为每一次海浪撞击着您时都将其击中。虽然使一个令人兴奋的旅程!

进一步阅读

这里有三篇文章介绍了背后的科学知识,可能会给您一些见解。尽管他们在数学和科学方面投入大量精力,但它们可以使您了解不同的因素是什么。

第一条:船舶横摇动力学建模及其与升沉和俯仰的耦合

第2条: 海洋水面船舶动力学建模与仿真

第3条: 海洋水面船舶动力学建模与仿真

作者进行实地研究

这是大约20年前15年前当我在研究船上工作时:)

替代文字


13
您如何看起来与个人资料中的狗完全相同?:-P
Notabene 2011年

大声笑我没注意到,但是...
蒂姆·霍尔特

这真可笑 !
BlueTrin 2014年

4

你有水模拟吗?

我的建议是

  • 用弹簧伪造它。水面上的每个顶点耦合在一起成为弹簧网格。拉下一个,它们全部开始振荡。您可以限制x,z运动,并且只允许y(或上/下运动)
  • 通过对不同幅度和频率的正弦波求和来伪造它。像这样的东西:

    rez = 32;
    for(i=-rez; i<rez; i++)
       for(j=-rez; j<rez; j++)
       {
          yofs = 0;
          yofs += 1.0 * sin( t + j*0.5 + i*0.125);
          yofs += 2.0 * sin( t + (rez-j)*0.125 + i*0.25 );
          yofs += 2.0 * sin( t + (j)*0.125 + (rez-i)*0.125 );
          yofs += 0.5 * sin( t + (rez+j)*0.125 + (rez+i)*0.125 );
          glVertex(i/rez, yofs, j/rez);
       }
    
  • 模拟2D波动方程,这在GPU上可以非常快。有关Java applet和一些伪代码的信息,请参见本页。还要检查此版本,相同但更简单。带有代码的加工草图。

从波动方程sim中,您可以得出波动在其中传播的方向(dx,dz)

dx = h[x-1][z] - h[x+1][z] 
dz = h[x][z-1]- h[x][x+1] 

其中ha 2D数组,其波高为[x] [z]

您可以将其添加到船的位置以使其随波浪行进...我已经尝试过,但是运动变得生涩,所以我用一个简单的3x3框式滤镜对其进行了平滑处理(平滑了dx dz的差异/速度)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.