用于高度图的离散流体"填充"算法

Gen*_*que 5 algorithm simulation fluid-dynamics

我正在寻找一种算法来描述流体在高度图表面上的瞬态行为.我在t = 0时的起始条件是:

  • 尺寸为[x,y]的高度值(H)的二维矩阵
  • 尺寸为[x,y]的流体高度值(F)的二维矩阵
  • 矩阵(a)中每个点的面积的度量,即每个位置是1平方厘米
  • 流体的粘度值(u)

我想要的是一种算法,可以在t'= t + 1处计算流体高度矩阵F的新值.在任何时候,我都可以通过v = a*(F(x,y) - H(x,y))来计算给定点处的流体体积.该算法的理想属性是:

  • 它不需要考虑每个点处流体柱顶部或底部的"斜率"或"形状".也就是说,它可以将hieghtmap中的每个值视为描述一定高度的扁平方形,并且流体高度的每个值映射为具有平顶的水的矩形柱
  • 如果遇到"排水"(即高度图中的一个非常低的点),来自地图所有部分的流体可能会受到影响,因为它被拉向它.

我正在寻找的一个简单例子是:

  • 5x5高度的地图矩阵,其中所有值均为0
  • 一个5x5流体高度映射矩阵,其中所有值均为0,除了[2,2],即10.
  • 每点面积1平方公尺
  • 粘度为u

该算法将描述在几个时间步长上在5×5矩阵上展开的流体"列".最终算法将在所有位置以10/25的均匀高度稳定下来,但我真的对它们之间发生的事情感兴趣.

我试图搜索这种算法,但我能找到的只是描述流体中颗粒行为的方程式,这对于我的目的而言太过细化.有谁知道我可以参考这个问题的任何好的来源,或者可能满足我需要的现有算法.

hus*_*sik 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
Run Code Online (Sandbox Code Playgroud)

拉普拉斯

拉普拉斯的扩散位置

扩散在Navier-Stokes方程中的位置

离散拉普拉斯算子

简单算法(伪):

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
Run Code Online (Sandbox Code Playgroud)

更难的算法(伪):

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
Run Code Online (Sandbox Code Playgroud)

Jos Stam的流体求解器对扩散部分有类似的作用.