Подтвердить что ты не робот

Почему моя вода взрывается?

Я пытаюсь реализовать метод Clavet для моделирования жидкостей в JavaScript, поэтому отладка - это кошмар, поэтому я спрашиваю здесь, надеясь, что кто-то, кто прошел через то же самое, скажет мне, что я делаю неправильно.

У меня сейчас работает OKAY:

частицы в основном работают

Но у меня две проблемы:

1) Так как в этом методе все делается "смещением" на полшага, я не уверен, как правильно отскочить частицы от стен. Прямо сейчас я беру положение частицы и предыдущее положение и переворачиваю их вокруг пересеченной стены, затем масштабирую вокруг точки пересечения коэффициентом отказов.

мой метод отражения

Моя логика подсказывает мне, что это должно сработать. Следующим шагом в алгоритме является обновление скоростей частиц, поэтому я также отражу предыдущую позицию. Но на практике это дает мне результат, который я не понимаю:

слишком сильно отраженная сила

Это показывает "силы" на частицах. Стены отражают слишком сильную силу, которая держит все в постоянном движении.

Формула 4.58 в в этой статье, по-видимому, показывает способ предотвратить это, но я не смог заставить его работать.

Также есть материал, который я не получаю, например, что "мы хотим отразить только ту скорость, которая была опущена при столкновении". Зачем? Может кто-то ELI5 этот материал мне понравится?

2) Даже когда стены не задействованы, симуляция "взрывается" периодически. Это происходит чаще при более высоком давлении:

exploding sim

Это JavaScript, так что это, но я перешел кодекс и нет никаких делений на ноль или ситуаций, где я могу представить, как происходит NaN.

Я видел некоторые разговоры в газетах о сильной нестабильности, и мне интересно, так ли это. Большая часть того, что в этой литературе находится вне меня.

Из того, что я понял (я думаю), одним из способов устранения неустойчивости является вязкость, но я добавил ее, и это не помогло с взрывами:

вязкость не предотвращает взрывы

Я могу опубликовать код, но на этапе get-it-to-work-first его трудно читать прямо сейчас.

Один последний вопрос: как мне понять, как преобразовать из псевдопотенциалов в этот метод в физические единицы?

Изменить: я обнаружил, что sim зависает изредка, похоже, что он создает NaN где-то, но Chrome ловит его слишком поздно.

4b9b3361

Ответ 1

Предполагая, что это проект cg без строгого физического значения...

в первую очередь вам следует подумать об использовании фиксированного шага времени для вашего кода моделирования, иначе вы получите неустойчивое (и визуально тревожное) поведение, так как dt (и ошибка) дрожит вокруг. Если вы не можете получить согласованную частоту кадров в соответствии с вашими окончательными требованиями, позиции следует интерполировать, а не моделировать в нефиксированные моменты времени.

в отношении ваших расчетов на стене, это явно зависит от эффекта, который вы хотите достичь в конечном итоге; поэтому, если вы примените более или менее сохраняющее зеркало состояние (как вы это делаете сейчас) частицы будут продолжать циркуляцию вокруг, даже если применяется демпфирование. Если вы хотите, чтобы жидкость каким-то образом "прилипала" к стенам, вам нужно ввести силы стенок или какой-либо другой более сильный диссипативный эффект.

Я запустил ваш код и установил согласованную dt и настройку вязкости и упростил расчет стены, чтобы упростить "if (p.px < left) p.px = left + (left - p.px) * canvas. wallBounce; else if()..." условия я получаю приятно "расслабление" (если это то, что вы ищете). Обновление также предыдущей позиции является контрпродуктивным, так как это будет увеличивать отражательную способность стен.

Ответ 2

Очевидно, здесь много. Я уверен, что я не могу ответить на все это, но вот некоторые, надеюсь, важные моменты:

О стенах: то, что вы реализовали, называется импульсным зеркалом. В жидкости под давлением зеркало импульса служит для притяжения частиц с каким-то отрицательным поверхностным натяжением (потому что за ним нет частиц, чтобы отразить их вблизи границы). Более плотно упакованные частицы будут генерировать большие силы и, скорее всего, вызовут числовые проблемы (особенно потому, что их телепортация имеет тенденцию давать им потенциальную энергию).

О коэффициенте реституции: простое линейное масштабирование вокруг столкновения создает тангенциальную силу удара, которая не типична для зеркал момента, но имеет тенденцию создавать физически реалистичное условие отсутствия скольжения.

О второй бумаге, которую вы связали: я думаю, что они пытаются сделать что-то умное, основанное на их точечной проекции. Однако я не знаю, почему они просто проецируют обратно на поверхность (вместо того, чтобы вычислять время столкновения, а затем новую позицию, основанную на (уменьшенной) новой скорости после этого).