Algorithm “离散流体”;“填充”;高度图的算法
我正在寻找一种算法,可以描述流体在高度图表面传播时的瞬态行为。t=0时的起动条件为:Algorithm “离散流体”;“填充”;高度图的算法,algorithm,simulation,fluid-dynamics,Algorithm,Simulation,Fluid Dynamics,我正在寻找一种算法,可以描述流体在高度图表面传播时的瞬态行为。t=0时的起动条件为: 尺寸为[x,y]的高度值(H)的二维矩阵 尺寸为[x,y]的流体高度值(F)的二维矩阵 矩阵(A)中每个点的面积度量,即每个位置为1 cm^2 流体的粘度值(u) 我想要的是一个算法,它可以在t'=t+1时计算流体高度矩阵F的新值。在任何一点上,我都可以通过v=a*(F(x,y)-H(x,y))计算给定点的流体体积。该算法的理想特性为: 不必考虑流体柱顶部或底部各点的“坡度”或“形状”。也就是说,它可以考
- 尺寸为[x,y]的高度值(H)的二维矩阵
- 尺寸为[x,y]的流体高度值(F)的二维矩阵
- 矩阵(A)中每个点的面积度量,即每个位置为1 cm^2
- 流体的粘度值(u)
-
不必考虑流体柱顶部或底部各点的“坡度”或“形状”。也就是说,它可以考虑HIGHTMAP中的每一个值来描述某一高度的平坦平方,并且将流体高度图的每个值作为具有平顶的矩形柱。
- 如果遇到“排放”(即高度图中的一个非常低点),当流体被拉向地图时,地图所有部分的流体都可能受到影响
- 所有值均为0的5x5高度贴图矩阵
- 5x5流体高度贴图矩阵,其中除[2,2]为10外,所有值均为0
- 每点1 m^2的面积
- 粘度为u
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
简单算法(伪):
硬算法(伪):
扩散部分也有类似的问题。Hmm。这是一个非常有趣的问题!但是,我不知道如果不使用与流体相关的物理方程,如何准确地模拟流体的运动。例如,要显示最终结果所采取的步骤,必须将水对象拆分为多个部分。这些衣服你穿多小?你必须为你使用的任何尺寸的块体建立一个模型,CFD是一个非常广泛的主题,但通常对颗粒或块体进行建模,尺寸不会太大。你尝试过泛洪填充吗?8^)更严重的是,您应该查找偏微分方程(PDE),以及将其离散为规则网格的方法。你需要仔细考虑你想模拟什么样的行为(例如,如果流体动量是显著的,这会给你波浪和涟漪)。有趣。我对此进行了一点研究,但我还没有真正能够让离散拉普拉斯算子为我工作。例如,在一维情况下,使用[0,0,10,0,0]并应用一维离散拉普拉斯算子,我得到[0,10,-10,10,0]作为t+1的结果。阅读那些维基百科文章让我想起了卷积运算,所以我尝试了一些方法。对于[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]。见()。看起来很有希望。你一定是在离散拉普拉斯算子上选择了太大的h平方,而且一定有时间乘数,它也很小。但你的卷积是合乎逻辑的。玩得高兴
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