离散流体“填充”算法用于高度图

5
我正在寻找一种算法,用于描述流体在高度图表面扩散时的瞬态行为。我的起始条件是t = 0时:
  • 一个大小为[x,y]的高度值(H)的2D矩阵
  • 一个大小为[x,y]的流体高度值(F)的2D矩阵
  • 矩阵中每个点的面积度量(a),即每个位置为1平方厘米
  • 流体的粘度值(u)
我想要的是一种算法,可以计算在t'=t + 1时刻流体高度矩阵F的新值。在任何时候,我都可以通过v = a *(F(x,y)-H(x,y))计算给定点处的流体体积。此算法的理想特性包括:
  • 它不需要考虑每个点上液体柱的顶部或底部的“坡度”或“形状”。即它可以将高度图中的每个值视为描述具有一定高度的平坦正方形,将流体高度图的每个值视为具有平坦顶部的矩形水柱。
  • 如果遇到“排水口”(即高度图中非常低的点),则可能会影响地图各个部分的流体,因为它被拉向该点。
我正在寻找的简单示例是:
  • 所有值都为0的5x5高度图矩阵
  • 除[2,2]外,所有值都为0的5x5流体高度图矩阵,其值为10。
  • 每个点的面积为1平方米
  • 粘度为u
该算法将描述流体在5x5矩阵上的“柱”随时间步骤扩散。最终,该算法将在所有位置上达到均匀高度10/25,但我真正感兴趣的是中间发生了什么。
我已经尝试搜索这种算法,但我能找到的只有描述流体内粒子行为的方程,这对我的目的来说过于细化。是否有任何好的来源可以解决此问题,或者现有的算法可以满足我的需求?

1
嗯,这是一个非常有趣的问题!不过,如果不使用与液体相关的物理方程,我不知道你如何能准确地对流体的运动进行建模。例如,为了展示达到最终结果所采取的步骤,你的水对象必须被分割成碎片。对于你来说,这些碎片有多小呢?你需要为你使用的每个大小块都设计一个模型,而计算流体力学(CFD)是一个非常成熟的主题——但通常只能模拟比较小的粒子或块。 - im so confused
你尝试过泛洪填充算法吗?8^) - comingstorm
更加严肃地说,您应该查阅偏微分方程(PDE)以及将它们离散化为常规网格的方法。您需要仔细考虑您想要模拟的确切行为(例如,如果流体动量很大,这将给您带来波浪和涟漪)。 - comingstorm
1个回答

5
O is your starting fluid-column
o are diffusing columns
************************
X  X  X  X  X

X  X  X  X  X

X  X  O  X  X

X  X  X  X  X

X  X  X  X  X  
************************
--Get the Laplacian of the heights of each neighbour and accumulate results
in a separate matrix
--Then apply the second matrix into first one to do synchronous diffusion
--go to Laplacian step again and again


************************
X  X  X  X  X

X  X  o  X  X

X  o  O  o  X

X  X  o  X  X

X  X  X  X  X  
************************


************************
X  X  .  X  X

X  .  o  .  X

.  o  O  o  .

X  .  o  .  X

X  X  .  X  X  
************************
************************
X  X  .  X  X

X  o  o  o  X

.  o  o  o  .

X  o  o  o  X

X  X  .  X  X  
************************


************************
X  X  .  X  X

X  o  o  o  X

.  o  o  o  .

X  o  o  o  X

X  X  .  X  X  
************************

************************
X  .  o  .  X

.  o  o  o  .

o  o  o  o  o

.  o  o  o  .

X  .  o  .  X  
************************
************************
.  .  .  .  .

.  o  o  o  .

.  o  o  o  .

.  o  o  o  .

.  .  .  .  .  
************************
************************
.  .  .  .  .

.  .  .  .  .

.  .  o  .  .

.  .  .  .  .

.  .  .  .  .  
************************
************************
.  .  .  .  .

.  .  .  .  .

.  .  .  .  .

.  .  .  .  .

.  .  .  .  .  
************************
sorry for very low height-resolution

拉普拉斯算子

拉普拉斯算子在扩散中的作用

扩散在纳维-斯托克斯方程中的作用

离散拉普拉斯算子

简单算法(伪代码):

get a cell's value in a.
get neighbour cells' values in b(sum of them)
put b/4.0 in c(getting 4 cells' values)
add a to c
build a matrix with this algorithm
apply the matrix onto old one
goto step 1

更难的算法(伪代码):

apply discrete-Laplacian-operator on all neighbours(finite-differences thing)
put solution in c height-map
subtract or add c to/from starting height-map
goto step 1

Jos Stam的流体求解器在扩散部分有类似的东西。


有趣。我稍微研究了一下,但我似乎无法让离散的拉普拉斯算子对我起作用。例如,在1D情况下,使用[0,0,10,0,0]并应用1d离散拉普拉斯算子,我得到[t+1]的结果为[0,10,-10,10,0]。 - Generesque
阅读那些维基百科文章让我想起了卷积操作,所以我尝试了一些东西。使用核[0.1, 0.8, 0.1],我的t=1的结果是[0, 1, 8, 1, 0],t=2的结果是[0.1, 1.6, 6.6, 1.6, 0.1]。参见(链接)。看起来很有前途。 - Generesque
你在离散拉普拉斯算子中选择的H平方太大了,而时间乘数也很小。但是你的卷积是合理的。玩得开心! - huseyin tugrul buyukisik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接