如何定义充满水的区域?


9

我想通过漂亮的水仿真来增强我的小游戏引擎。首先,我需要找到一种在游戏中代表水的正确方法。不幸的是,我对代表的了解不多,所以我问你。我前段时间也曾问过类似的问题。但是由于我没有明确提出问题,答案是正确的,但不是我想要的。

在某些游戏中,水只是由高度确定的。例如,零高度以下的所有物体都在水下。我在大多数游戏中都看到了这种表现。问题是我希望在户外世界中不被淹没的洞穴以及每个湖泊和海洋的水位都不同的洞穴。

水的出现的另一种更精确的表示是颗粒。每个水滴都作为点存储在世界空间中。要渲染它们,我可以使用诸如metaball之类的技术,以便它们构建单个网格。这种表示形式对于现实主义非常有用,因为我可以轻松地计算出它们之间的动态关系。令人遗憾的是,没有机器可以实时计算大量的元弹。

还有其他方法可以代表发动机中的水吗?我想拥有动态湖泊,因此无法通过静态几何图形定义水域。例如,如果玩家修改地形以加宽湖泊,则水应填充该海湾,而湖泊的总水位应略有降低。


2
引擎中的地形如何组织?体素,高度图,多边形(网格)地形有不同的技术。
2013年

给出它是因为网格,并且水不应与其他静态网格物体以不同的方式交换地形网格物体。
danijar

1
交易还是请客?
汤姆(Tom'Blue)Piddock,

1
这种元球方法有一些非常不错的演示,但我认为它在任何不完全专注于水模拟在某种程度上可以让人信服的真实游戏中都没有用。我看不到仅靠网格的理由,使其适应周围环境甚至基于某种物理模拟生成它也不应该成为问题。但这是您仅在确实需要时才要做的事情。作为半现实水模拟的参考,您可能需要选中“ From Dust”。
Slin 2013年

1
可变大小的解决方案是针对“元球海洋”的问题。而且,当然,取决于体积的尺寸变化也会受到限制,因为这是优化性能的一种方法,不会改变水的体积。对于需要细节的区域,例如瀑布,支流,海岸或溪流,只需添加一个特殊的考虑因素,例如与玩家和地面的接近度。
2013年

Answers:


3

我无法说出通常使用的是什么,但是我的第一个想法是使用一个粒子系统,该粒子系统具有大小不同的粒子,代表各种体积的水。水的顶部将使用较小的粒子来形成表面和波浪的起伏,离玩家最近的水将使用最小的粒子来模拟飞溅和小起伏,而水越深或越深,则粒子越大。这将允许动态数量的粒子模拟任意大小的水,水在变化时的动态以及合理且可控制的性能水平。

我可以看到这种实现方式存在问题,但是它似乎是一个相对简单且“足够好”的解决方案,观众/播放器怀疑是否会注意到模拟中的偏差。


2

如果您使用的是基于体素的地形,则除了存储每个体素的地面密度外,还可以存储夹在0和之间的水位值1 - groundDensity。绘制水就像运行行进的多维数据集越过水值一样简单。模拟水会有些困难,但是基本前提是您要解决该系统,使得:

  1. 地下水应填充剩余的体素
  2. 表层水的总密度应与groundDensity + waterDensity邻域的总密度相同
  3. 如果邻居的总密度小于其总密度,则水可能被置换到紧邻或低于其的任何体素

理想的算法将在计算着色器中运行,每个体素一个执行路径。如果您想花哨的话,还可以将水的速度存储在该体素中以产生其他模拟效果:例如,尝试将与速度成比例的水量分配给速度矢量“指向”的单元。该速度数据还可用于移动波浪,绘制急流等。


不幸的是,正如问题下的评论所指出的,我没有体素地形。不管怎么说,还是要谢谢你。
danijar
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.