LanLou123 / Webgl-Erosion

Interactive Erosion simulation in Web Browser
https://lanlou123.github.io/Webgl-Erosion/
MIT License
235 stars 32 forks source link

Axis aligning problem + sediment transport capacity issue #31

Open carlschissler opened 1 year ago

carlschissler commented 1 year ago

Hi, I found your code very useful for checking my own implementation of the Mei 2007 paper. In the process of implementing my own code I discovered that there are some problems with the original paper. You may find that the solutions I found will significantly improve the erosion results.

The first problem is with the axis alignment of the erosion features. This is caused primarily by the Mei paper ignoring the diagonal connections between cells, unlike the original O'brien paper from 1995. This makes it harder for fluid to move diagonally or other non-axis aligned directions. So fluid tends to flow in axis aligned directions when not impeded. You can easily add the diagonal connections by calculating 8 flux values instead of 4, using a similar approach to the axis aligned ones. To get the velocity you then add the diagonal ones to both of the existing X, Y components with a sqrt(2)/2 multiplier. I found that doing diagonal fluid flow completely eliminated any visible axis alignment of erosion features.

The second problem with the Mei paper is that they have a bad model of sediment transport capacity. They only include the slope and velocity in the calculation, but ignore the very important factor of fluid depth. In fact, the paper they cite for their sediment transport equation actually does include the depth, in the form of total flow q, which is equal to velocity multiplied with depth. I guess it is a mistake? By increasing transport capacity with depth, it creates a feedback loop where more erosion occurs in places with more fluid, which causes concentration of fluid and more erosion. This produces erosion structures like ravines and rivers much more easily than with the default equation. The new equation is just multiplied by depth (with a change in the capacity constant to compensate).

I think you can easily incorporate these changes, particularly the second one, which has a large positive impact on the quality of the results. The 8-way flux is not hard either, I implemented it just now in about 2 hours.

You can see the very nice results of these changes in the attached image, generated in about 3 seconds on 1 CPU thread.