Russian Qt Forum
Ноябрь 22, 2024, 19:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Слияние шариков  (Прочитано 4760 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Август 25, 2015, 10:35 »

Добрый день

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

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

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

Спасибо
« Последнее редактирование: Август 25, 2015, 10:37 от Igors » Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Сентябрь 02, 2015, 17:45 »

ну как минимум для каждой капли хранить указатель/ссылку на другие капли с которыми было соприкосновение (если было вообще).
Пока две капли рядом и у них пустые ссылки на других, то проверять пересечение радиусов на слияние. Как только они пересекаются, делать слияние + сохранить указатели друг на друга.
При движении одной капли она будет знать что слита с другой, и допускать расхождение их центров на определенную дельту, немногим большую чем радиус наименьшей (или наибольшей) капли.
Пока эта дельта в фокусе рисовать их как бы связынми, как только делата вне фокуса, разрывать их и удалять ссылки друг у друга. Я бы так сделал.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Сентябрь 02, 2015, 17:46 »

если нужно учитывать некое притяжение, то хранить еще внешний радиус капли (невидимый) и смотреть слияние по этому радиусу. например как магнитная жидкость.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 03, 2015, 10:23 »

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

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

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


Страница сгенерирована за 0.046 секунд. Запросов: 22.