Comments 8
всё-таки в результате это больше желе чем вода ?
Мне больше показалось похоже на неньютоновскую жидкость
Потому что уравнения Навье-Стокса описывают потоки в толще жидкости.
А волны на поверхности жидкости описываются уравнением Кортевега-де Фриза. И форма волн, и их характер там совсем другие.
Это ж не так! Уравнение Кортевега-де Фриза описывает движение солитона, а не волны на воде. Волны на воде описываются уравнением мелкой воды: https://ru.wikipedia.org/wiki/Уравнения_мелкой_воды
итеративный -> итерационный, нестабильность -> неустойчивость, симуляция -> моделирование, адвекция лучше как конвекция
Спасибо за статью.
Попробуйте вместо такого алгоритма
p_new[i, j] =((p[i+1,j] + p[i,j+1] + p[i-1,j] + p[i,j-1]) - Velocity_Divergence[i, j])/4
использовать алгоритм распространения волны: https://ru.wikipedia.org/wiki/Волновое_уравнение
Для этого нужно два поля вместо одного - поле высот P и поле скоростей изменения высот V.
Вычисления нужно производить за два этапа. На первом этапе (∂²H/∂x²) для каждой ячейки V вычисляем:
V[x,y] += (P[x+1,y] - P[x,y] + P[x-1,y] - P[x,y] + P[x,y+1] - P[x,y] + P[x,y-1] - P[x,y]) * dt * 0.99;
Если точка P[x-1,y] за пределами массива, то выбрасываем пару: + P[x-1,y] - P[x,y]
На втором этапе (∂²H/∂t²) вычислям все P:
P[x,y] += V[x,y] * dt * 0.99;
И никаких p_new! Пишем в это же поле!
Физическое воздействие выполняем так:
V[x,y] += F/m * dt;
F - сила, m - масса (плотность) воды, dt - промежуток времени, 0.99 - коефициент затухания
Важно использовать везде +=, а не = !!!
Простое объяснение симуляции жидкости в реальном времени