gpt4 book ai didi

c# - 在我的浅水实现中出现奇怪的振荡波纹

转载 作者:太空狗 更新时间:2023-10-29 20:23:53 25 4
gpt4 key购买 nike

我一直在尝试在 Unity 中实现浅水方程,但遇到了一个奇怪的错误。我的水中出现了这些奇怪的振荡涟漪。我做了一些截图:

enter image description here enter image description here

您可以在此处找到视频:https://www.youtube.com/watch?v=crXLrvETdjA

我的代码基于论文 Fast Hydraulic Erosion Simulation and Visualization on GPU邢梅。你可以在这里找到完整的求解器代码:http://pastebin.com/JktpizHW (或见下文。)每次我使用论文中的公式时,我都会添加它的编号作为评论。

我尝试了不同的时间步长,对于我使用 0.02 的视频,降低它只会让它振荡得更慢。我还尝试了更大的网格(视频使用 100,我尝试了 200,但后来波纹变小了。)我检查了所有公式几次,没有发现任何错误。

这里有人能弄清楚出了什么问题吗?

额外信息:

正如您从 pastebin 中看到的那样,我用 C# 对其进行了编程。我使用 Unity 作为我的可视化引擎,我只是使用网格来可视化水。我更改网格的顶点 y 分量以匹配我计算的高度。

DoUpdate 方法获取一个 float[][] lowerLayersHeight 参数,它基本上是水下地形的高度。在视频中,它只是全部 0

public override void DoUpdate(float dt, float dx, float[][] lowerLayersHeight) {
int x, y;
float totalHeight, dhL, dhR, dhT, dhB;
float dt_A_g_l = dt * _A * g / dx; //all constants for equation 2
float K; // scaling factor for the outflow flux
float dV;

for (x=1 ; x <= N ; x++ ) {
for (y=1 ; y <= N ; y++ ) {
//
// 3.2.1 Outflow Flux Computation
// --------------------------------------------------------------
totalHeight = lowerLayersHeight[x][y] + _height[x][y];
dhL = totalHeight - lowerLayersHeight[x-1][y] - _height[x-1][y]; //(3)
dhR = totalHeight - lowerLayersHeight[x+1][y] - _height[x+1][y];
dhT = totalHeight - lowerLayersHeight[x][y+1] - _height[x][y+1];
dhB = totalHeight - lowerLayersHeight[x][y-1] - _height[x][y-1];

_tempFlux[x][y].left = Mathf.Max(0.0f, _flux[x][y].left + dt_A_g_l * dhL ); //(2)
_tempFlux[x][y].right = Mathf.Max(0.0f, _flux[x][y].right + dt_A_g_l * dhR );
_tempFlux[x][y].top = Mathf.Max(0.0f, _flux[x][y].top + dt_A_g_l * dhT );
_tempFlux[x][y].bottom = Mathf.Max(0.0f, _flux[x][y].bottom + dt_A_g_l * dhB );

float totalFlux = _tempFlux[x][y].left + _tempFlux[x][y].right + _tempFlux[x][y].top + _tempFlux[x][y].bottom;
if (totalFlux > 0) {
K = Mathf.Min(1.0f, _height[x][y] * dx * dx / totalFlux / dt); //(4)

_tempFlux[x][y].left = K * _tempFlux[x][y].left; //(5)
_tempFlux[x][y].right = K * _tempFlux[x][y].right;
_tempFlux[x][y].top = K * _tempFlux[x][y].top;
_tempFlux[x][y].bottom = K * _tempFlux[x][y].bottom;
}
//swap temp and the real one after the for-loops

//
// 3.2.2 Water Surface
// ----------------------------------------------------------------------------------------
dV = dt * (
//sum in
_tempFlux[x-1][y].right + _tempFlux[x][y-1].top + _tempFlux[x+1][y].left + _tempFlux[x][y+1].bottom
//minus sum out
- _tempFlux[x][y].right - _tempFlux[x][y].top - _tempFlux[x][y].left - _tempFlux[x][y].bottom
); //(6)
_tempHeight[x][y] = _height[x][y] + dV / (dx*dx); //(7)
//swap temp and the real one after the for-loops
}
}
Helpers.Swap(ref _tempFlux, ref _flux);
Helpers.Swap(ref _tempHeight, ref _height);
}

最佳答案

我自己修的!虽然它是在开车给 friend 的时候。问题很简单,我在错误代码中所做的是为每个单元格(或网格点)计算通量,然后计算高度,然后我转到下一个单元格。我应该做的是首先计算所有单元格的通量,然后对所有单元格进行第二次迭代并计算它们的高度。所以代码变成:

for (x=1 ; x <= N ; x++ ) {
for (y=1 ; y <= N ; y++ ) {
//
// 3.2.1 Outflow Flux Computation
// --------------------------------------------------------------
***
}
}

for (x=1 ; x <= N ; x++ ) {
for (y=1 ; y <= N ; y++ ) {
//
// 3.2.2 Water Surface
// ---------------------------------------------------------------------------
***
}
}
Helpers.Swap(ref _tempFlux, ref _flux);
Helpers.Swap(ref _tempHeight, ref _height);

(当然***就变成了上面问题对应的代码。)

现在我有了一个工作水模拟。

关于c# - 在我的浅水实现中出现奇怪的振荡波纹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24533294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com