Russian Qt Forum

Программирование => Алгоритмы => Тема начата: Igors от Август 25, 2015, 10:35



Название: Слияние шариков
Отправлено: Igors от Август 25, 2015, 10:35
Добрый день

Есть шарики которые могут сливаться, этот эффект/техника известны давно, см вику (https://en.wikipedia.org/wiki/Metaballs). Шарики задаются центр + радиус, на основании этих данных создается полигонная модель. Впрочем до эффекта "воды" еще очень далеко, хотя бы потому что есть др объекты в сцене. Ну да ладно, пусть мы хотим сделать "очень простую воду" - но вот вылазит противная проблемка

См аттач (из той же вики). Если рассматривать последовательность картинок как они пронумерованы - ну капли воды так себя не ведут. Они могут находиться очень близко друг от друга, но пока не коснулись - никакого слияния не произойдет. Теперь попробуем смотреть в обратном порядке, от последней картинки к первой, - тогда все на своих местах - сначала между каплями образуется "перепонка", потом они разделяются

Какие данные доп данные надо создать (и как ими управлять) чтобы учесть "слияния"?

Спасибо


Название: Re: Слияние шариков
Отправлено: Fregloin от Сентябрь 02, 2015, 17:45
ну как минимум для каждой капли хранить указатель/ссылку на другие капли с которыми было соприкосновение (если было вообще).
Пока две капли рядом и у них пустые ссылки на других, то проверять пересечение радиусов на слияние. Как только они пересекаются, делать слияние + сохранить указатели друг на друга.
При движении одной капли она будет знать что слита с другой, и допускать расхождение их центров на определенную дельту, немногим большую чем радиус наименьшей (или наибольшей) капли.
Пока эта дельта в фокусе рисовать их как бы связынми, как только делата вне фокуса, разрывать их и удалять ссылки друг у друга. Я бы так сделал.


Название: Re: Слияние шариков
Отправлено: Fregloin от Сентябрь 02, 2015, 17:46
если нужно учитывать некое притяжение, то хранить еще внешний радиус капли (невидимый) и смотреть слияние по этому радиусу. например как магнитная жидкость.


Название: Re: Слияние шариков
Отправлено: Igors от Сентябрь 03, 2015, 10:23
При движении одной капли она будет знать что слита с другой, и допускать расхождение их центров на определенную дельту, немногим большую чем радиус наименьшей (или наибольшей) капли.
Ну это уже другая, более сложная, задача - учесть силу поверхностного натяжения. Здесь мы считаем что центры шариков двигает кто-то другой, кадр за кадром, а наше дело только корректно рисовать капли.

ну как минимум для каждой капли хранить указатель/ссылку на другие капли с которыми было соприкосновение (если было вообще).
Пока две капли рядом и у них пустые ссылки на других, то проверять пересечение радиусов на слияние. Как только они пересекаются, делать слияние + сохранить указатели друг на друга.
Если число капель меняется от кадра к кадру - то ID вместо указателя. Но в любом случае - как хранить ссылки? Приделать контейнер к каждой капле? Ну так можно быстро сожрать всю память, это на картинке их всего 2, а действительности их сотни тысяч.

И второй, коварный, момент. Допустим капли разъединились и перепонка между ними порвалась (см Step 1). Однако требуется еще какое-то время (возможно неск кадров) пока перепонка полностью исчезнет и капля станет шариком (конечно если нет других связных с ней). И вот что делать на этих кадрах - хз. Считаем "разъединились" - получаем "рывок", перепонка исчезает мгновенно. Считаем "слитыми" - тогда перепонка остается а может и расти, хотя должна плавно исчезать.