![]() |
|
||||||||||
|
|
|
|||||
|
Ибо на форуме нет раздела, посвящённого общим вопросам по программированию, а с флэшом это никак не связано, пишу сюда.
Я продолжаю работу над моделью воды.. Сейчас занимаюсь тем, что пытаюсь превратить воду в желе. Реализовал предложенный в этой статье метод. В кратце о методе: Есть много частиц, образующих жидкость. В каждый момент времени между соседними частицами(расстояние меньше радиуса h), если между ними нет связи, добавляется связь длины h. Потом для каждой связи её длина корректируется(сжимается, если частицы сближены и наооборот). Если длина связи оказалась>h она рвётся. Вот примерно как это выглядит: if(d(i,j)-L(i,j)>stretch_treshold*L(i,j)) L(i,j)+=stretch_speed*(d(i,j)-L(i,j)-stretch_treshold*L(i,j))*dt; else if(d(i,j)-L(i,j)<-treshold*L(i,j)) L(i,j)+=compress_speed*(d(i,j)-L(i,j)+compress_treshold*L(i,j))*dt; d(i,j) - расстояние от i-ой до j-ой точки compress_treshold-пороговая величина, которая означает, во сколько раз надо сжать связь, чтобы она начала менять длину stretch_treshold - аналогично для растяжения compress_speed-скорость сжатия stretch_speed - скорость растяжения dt-временной интервал Все эти связи действуют почти как пружинки. Вот формула силы, действующей на частицы: k-сила связи Разные материалы задаются разными константами. В статье написано, что можно даже клей сделать) Всё работает на ура и быстро, но есть противный баг. Я понимаю его так: Представьте 2 частицы. Расстояние между ними близко к нулю, длина связи близка к h. На частицы будет действовать достаточно большая сила, которая будет их отталкивать друг от друга. После применения сил к частицам они будут на расстоянии близком к h, длина же связи будет немного уменьшена на прошлом шаге(т.к. связь была сжата). Теперь связь растянута и она длина будет увеличена, но частицы будет притянуты обратно. Этот процесс будет продолжаться, пока не наконец изменение свзи не станет достаточно большим, чтобы порвать её. Но к этому моменту частицы наберут оч большую скорость. Такие же проблемы могут возникать не только если делать симуляцию воды.. вообще любую связанную достаточно жёсткими пружинками систему частиц. Вопрос ко всем, и особенно к тем, кто с этим сталкивался: знаете ли вы как это исправить? Вот пример(200 частиц). Управление мышкой. Попробуйте немного подёргать это желе и увидите баг(капельки начнут сами вылетать, а вся конструкция поднимется к середине экрана) Единственное решение, которое приходит мне в голову - уменьшить dt-но это значит и ускорение таймера(чтобы не было заторможенного движения) и больше вычислений - и тормоза... |
|
|||||
|
Регистрация: Dec 2006
Адрес: Novosibirsk
Сообщений: 93
|
пара мыслей:
1) принудительно рвать связи на негодных частицах 2) ввести силы сопротивления, тогда лавинный эффект остановится |
|
|||||
|
Регистрация: Jan 2009
Сообщений: 1,651
|
по-моему лучше отписать на форум по алгоритмике или на gamedev.ru - там больше специалистов в этом.
Updated: уменьшить dt и считать систему несколько раз за таймер? |
|
|||||
|
Проблемы последнего метода в конце моего первого поста. Сейчас экспериментирую с нелинейными сигмоидо-подобными функциями вместо этой
|
|
|||||
|
Регистрация: Feb 2009
Сообщений: 1,195
|
А dt может в вашей реализации быть больше 1? Я в таких случаях делаю, что при dt>1 все расчёты выполняются с dt=1 нужное количество раз (округлённое dt) и потом ещё остаток. Тормоза, конечно, будут, но лучше тормоза без глюков, чем глюк без тормозов.
Последний раз редактировалось VVall; 24.07.2009 в 17:41. |
|
|||||
|
dt=1
лучше без глюков без тормозов и я уверен, что можно найти быстрое решение... и найду) Добавлено через 4 часа 46 минут Странное существо-человек) Вот я: глядел демки grant kot'а, а именно эту Как раз реализация того, что я хочу сделать, но на java. И у него похожий баг!!=)))) только его сложнее получить и он менее выражен из за высокого разрешения жидкости. |
|
|||||
|
думается мне нужно просто поставить ограничение на максимальную скорость для всего и вся
__________________
Кто может делать - делает, кто не может делать - учит, кто не может учить - управляет... |
|
|||||
|
оно уже давно есть. меньше ставить нельзя
|
|
|||||
|
loading 50%
|
Морщить мозг не охота, но я так понимаю, проблема в возникновении "псевдо локального давления" большой величины. Для решения этой проблемы в статье использовано "раслабление" Dij. Увеличивайте расслабление системы при уменьшении дистанции между частицами.
|
|
|||||
|
Цитата:
Добавлено через 55 часов 59 минут Да, решение найдено и оно банальное! Для этого написал класс для отслеживания происходящего и экспорта в Excel. Момент "взрыва" занимал всего 4-6 тактов симуляции. В этот момент из-за суперсжатия желе на частицы начинало действовать сильнейшее давлние со стороны других частиц. Я просто по-наглому сделал максимальную силу, которую могут оказывать частицы друг на друга и всё работает!!! ![]() Вот демка |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:57. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| jello , Вода |
|
|