Ибо на форуме нет раздела, посвящённого общим вопросам по программированию, а с флэшом это никак не связано, пишу сюда.
Я продолжаю работу над моделью воды.. Сейчас занимаюсь тем, что пытаюсь превратить воду в желе. Реализовал предложенный в
этой статье метод.
В кратце о методе:
Есть много частиц, образующих жидкость. В каждый момент времени между соседними частицами(расстояние меньше радиуса 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;
L(i,j) - длина связи
d(i,j) - расстояние от i-ой до j-ой точки
compress_treshold-пороговая величина, которая означает, во сколько раз надо сжать связь, чтобы она начала менять длину
stretch_treshold - аналогично для растяжения
compress_speed-скорость сжатия
stretch_speed - скорость растяжения
dt-временной интервал
Все эти связи действуют почти как пружинки. Вот формула силы, действующей на частицы:

Код:
power=k*(1-L(i,j)/h)*(L(i,j)-d(i,j))
k-сила связи
Разные материалы задаются разными константами. В статье написано, что можно даже клей сделать)
Всё работает на ура и быстро, но есть противный баг.
Я понимаю его так:
Представьте 2 частицы. Расстояние между ними близко к нулю, длина связи близка к h.
На частицы будет действовать достаточно большая сила, которая будет их отталкивать друг от друга. После применения сил к частицам они будут на расстоянии близком к h, длина же связи будет немного уменьшена на прошлом шаге(т.к. связь была сжата). Теперь связь растянута и она длина будет увеличена, но частицы будет притянуты обратно. Этот процесс будет продолжаться, пока не наконец изменение свзи не станет достаточно большим, чтобы порвать её. Но к этому моменту частицы наберут оч большую скорость.
Такие же проблемы могут возникать не только если делать симуляцию воды.. вообще любую связанную достаточно жёсткими пружинками систему частиц.
Вопрос ко всем, и особенно к тем, кто с этим сталкивался: знаете ли вы как это исправить?
Вот
пример(200 частиц). Управление мышкой. Попробуйте немного подёргать это желе и увидите баг(капельки начнут сами вылетать, а вся конструкция поднимется к середине экрана)
Единственное решение, которое приходит мне в голову - уменьшить dt-но это значит и ускорение таймера(чтобы не было заторможенного движения) и больше вычислений - и тормоза...