2D降雨创建(和流体动力学)


11

我在一个我的游戏中试验天气条件,Starbound处理雨的方式给我留下了深刻的印象。基本上,当雨水撞击地面时,它要么水平分散(并被地面吸收),要么会产生一堆水(当雨滴落在地面上的洞中时)。

该视频清楚地展示了这一点:http : //imgur.com/gallery/CKCGKbG

我知道如何使雨水落下并检查雨水落在地面上的位置,但这就是我被卡住的地方。我的问题是:如何创建?怎样才能完美地模拟水流而又不影响性能呢?

提前致谢!


1
关键是流体动力学系统。我怀疑当雨滴落到地面上时,会在那个位置产生少量水,然后像往常一样由流体动力学系统处理。在平坦的表面上,它可以通过蒸发来抵消,但是当斜坡导致水集中在某个区域时,涌入比蒸发更强,并且开始形成水坑。
菲利普

Answers:


9

Starbound的供水系统实际上是基于2D Tile的细胞自动机。屏幕上的每个不包含前瓷砖层的瓷砖都可以容纳水。水的量通过细胞自动机计算。

有关此技术的更多信息,请参见:

http://www.gamasutra.com/view/feature/134736/an_intro_to_cellular_automation.php

http://www.jgallant.com/2d-liquid-simulator-with-cellular-automaton-in-unity/

至于雨滴,那是颗粒。它们主要是用来伪造实际上有水从天上掉下来的现象。水积聚只是因为游戏知道当前正在下雨。单个水滴与水池的实际形成无关。

他们积聚的方式是确定地面顶层是否有洞。如果存在可以积水的区域,则该区域中的细胞会相应地增加其水位。

Starbound还处理水压,其渲染技术非常出色。他们拥有我所见过的使用元胞自动机进行水模拟物理学的最佳2D实现。

这是利用上述细胞自动机技术的液体物理引擎的原始视图。渲染部分变得更加复杂,因为您的水用数值表示。

http://www.jgallant.com/images/pressuretest.gif

在此示例中,一个非常简单的改进将是隐藏如果瓷砖下面没有实心瓷砖的情况下,其瓷砖中的水单元少于1个完整单位的水单元。但是,那时您隐藏了水流。除了隐藏水,您还必须确定水的流动方式,然后在其位置绘制适当的水精灵。


2
更重要的是,雨滴颗粒会伪造水滴效果:表面上飞溅的小水滴也与实际的雨滴无关,而是单独的效果。这种结合使它看起来像是小滴在飞溅。
Felsir

哇,那正是我想要的。我以为我不得不诉诸基于粒子的过于复杂的流体系统,但网格系统似乎也能正常工作。但是,要增加水压,我想您只需要第二个数组即可存储压力值并从高压流向低压位置?如果是这样,那对于计算机来说应该还不算太难。
熊猫达奇

不,您需要施加压力,就是添加一条规则,例如,允许一块瓷砖容纳超过1个完整单位的液体。如果该瓷砖具有超过1个完整单位的液体,并且无法按照正常的规则集流动-那么请使其向上流动。进行调整,以便根据该瓷砖的加压值使更多的水流过。
jgallant '16

3

有很多方法可以解决这个问题。一如既往的“取决于”

因此,我想一种方法就是这种方法。给定一个任意的“浸入地面”,在其上方覆盖一个“水箱”。地面和水箱是分层绘制的,因此首先显示地面,然后是水箱。

每次水滴碰到地面上的水坑时,都向水箱中添加一个。当水箱达到魔术数时,加水。假设有10滴水滴落在水槽中,这为水箱增加了一条线。

可以说水箱是32X32像素。从0,31- 31,31添加一行水彩。再滴10滴,在0,30-31,30之间划一条线。因此,随着水滴的累积,您可以从底部开始建造水箱,直到水箱充满为止。

希望有道理。

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.