我正在寻找一种算法,该算法将描述流体在高度图表面扩散时的瞬态行为。我在t=0时的启动条件是:
- 大小为[x,y]的高度值(H)的2D矩阵
- 尺寸为[x,y]的流体高度值(F)的2D矩阵
- 矩阵(A)中每个点的面积度量,即每个位置为1cm^2
- 流体的粘度值(u)
我想要的是一种算法,它可以在t'=t+1时计算流体高度矩阵F的新值。在任何一点上,我都可以通过v=a*(F(x,y)-H(x,y))来计算给定点上的流体体积。该算法的可取特性为:
- 它不需要考虑每个点的液柱顶部或底部的"坡度"或"形状"。也就是说,它可以将高度图中的每个值视为描述某个高度的平坦正方形,而流体高度图的每个值则视为具有平坦顶部的矩形水柱
- 如果遇到"排水"(即高度图中的一个非常低的点),当流体被拉向地图时,地图所有部分的流体都可能受到影响
我正在寻找的一个简单的例子是:
- 5x5高度映射矩阵,其中所有值均为0
- 5x5流体高度映射矩阵,其中除[2,2]之外的所有值均为0,后者为10
- 每点1平方米的面积
- 粘度为u
该算法将描述在5x5矩阵上以几个时间步长分布的流体"列"。最终,算法在所有位置都会稳定在10/25的统一高度,但我真的很感兴趣介于两者之间的情况。
我曾试图搜索这种算法,但我能找到的只是描述流体中粒子行为的方程,这对我来说太精细了。有人知道我可以为这个问题参考什么好的来源吗,或者有一个现有的算法可以满足我的需求吗。
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
拉普拉斯
拉普拉斯在扩散中的位置
扩散在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
更难的算法(伪):
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的流体解算器在扩散部分也有类似的功能。