Эксперименты с физикой. Часть 4.
Запись от Волгоградец размещена 15.04.2010 в 23:26
Сегодня мы поговорим о связях в нашем движке. Связи позволяют держать частицы на определенном расстоянии друг от друга. Мы создадим 4 вида связей - PointConstraint, LengthConstraint, MaxLenghtConstraint, MinLenghtConstraint. А собственно что это такое - связи - и как они работают? Здесь до безобразия все просто - в каждой итерации мы сравниваем расстояние между частицами и если оно не удовлетворяет требованиям, мы просто двигаем частицы на необходимую величину.
На картинке видим - d - это нужная нам величина. L - это расстояние на текущий момент. Мы просто вычитаем d из L и двигаем каждую частицу на половину расстояния.
Теперь рассмотрим другой случай.
На самой левой картинке мы видим частицы так, как они должны быть. Затем под воздействием внешних сил одна из частиц (синяя) сдвигается и мы вынуждены применить связи для того, чтобы сохранить нужное расстояние. Мы двигаем синюю и зеленую частицы и получаем то что хотели - нужное расстояние b. Но мы видим что переместив зеленую частицу расстояние a изменилось. Как быть? Здесь снова все гениально просто - мы в каждом шаге итерируем несколько раз этот метод. Количество итераций выбирается из необходимой точности - чем больше их будет - тем жестче будет наша система. В идеале, если бы имели бесонечное число итераций, наши частицы всегда были на нужном нам расстоянии с точностью до пиксела. В реальной жизни выбирается число до 30. Среднее - 10.
Последовательность шагов такая. В каждом кадре мы рассчитываем силы для каждой частицы. Меняем положение. А потом запускаем цикл со связями. Звучит не сложно, не правда ли?
Сразу скажу о минусах данного подхода. В каждой итерации для нахождения расстояния между частицами мы вынуждены искать нормаль (единичный вектор) от одной частицы к другой. Следовательно мы вынуждены применять деление (помните как находится нормаль?), которое нагружает процессор. И например, если мы создаем квадрат из частиц, мы делаем связи соседних частиц по периметру, а также крест на крест - итого 6 связей. Плюс для того чтобы квадрат выглядел жестким, мы выбираем 30 итераций. Итого 30 * 6 = 180 поисков нормалей и соответственно столько же делений всего то для 4-х частиц! Плюс же данного метода - его простота. С его помощью можно симулировать даже псевдо жесткие тела, не вдаваясь глубоко в физику и математику - мы увидим на примере цепи и коробки.
Сейчас рассмотрим какие же связи у нас есть. PointConstraint - связывает одну частицу с точкой в пространстве. LengthConstraint - связывает две точки. MaxLenghtConstraint - устанавливает максимально допустимое расстояние между двумя точками. MinLenghtConstraint - ну, вы догадались...
Для разминки покажу все ту же пружину - но теперь с MinLenghtConstraint и MaxLenghtConstraint. Теперь, наконец, нашу пружину не растянуть до бесконечности и не сжать до нуля.
SpringDemo.swf
Дальше, собственно, демонстрация LengthConstraint. Здесь на частицу действует только сила тяжести и получается такой эффект. Кстати, знаменитую игру Hammerfight можно реализовать используя LengthConstraint.
LenghtConstraintDemo.swf
Теперь простая симуляция водной поверхности. На мегареалистичность не претендует. Каждая частица соединена AnchoredSpring с точкой в пространстве и частицы связаны друг с другом с помощью LengthConstraint.
Water.swf
Обещанная веревка ). Здесь я выбрал малое количество итераций - всего 3. Поэтому создается впечатление что веревка тянется.
Rope.swf
Ткань. Количество итераций выбрал равным 1 (одному)! Использую только struct connections (см. предыдущий урок). Выглядит неплохо.
Cloth.swf
RagDoll. Я уверен, вы догадываетесь как это сделано ). Да-да, все тот же LengthConstraint.
RagDoll.swf
Ну и напоследок самое вкусное - цепь. Все тоже самое, что и веревка, но число итераций установлено 30, что делает цепь более жесткой.
Chain.swf
На сегодня все. В следующий будем определять базовые столкновения частицы со стенами.
tutorial4.zip
Всего комментариев 12
Комментарии
15.04.2010 23:47 | |
Очень..) Всегда первым слежу за обновлениями, спасибо за урок =)
|
21.04.2010 18:44 | |
Очень клёво =) По-моему вы когда-то давно писали комментарии у меня на сайте и спрашивали вопросы, а теперь создаёте такие клёвые примеры и эксперименты. Очень круто.
|
21.04.2010 19:17 | |
Привет, koIIImarik. Да, писал ). Кажется спрашивал про attachMovie в цикле ). И сейчас захожу - жаль не обновляешься.
P.S.: меня на "ты" можно - не такой уж я и старый. |
25.04.2010 23:05 | |
Спасибо за урок.))
|
03.05.2010 01:38 | |
+ещё одна проблема.
В разрообразных структурах вида кольцо при применении жёстких ограничений они как правило закручиваются. Пример: квадрат ABCD. Применяем связь AB, потом BC, потом CD, потом DA и заново и так несколько раз. Если вы аккуратно отследите изменения положений точек на бумаге, то заметите небольшое закручивание. Эти движения возникают при больших размерах систем и их достаточно сложно отследить и погасить. Любой дисбаланс ограничений и вся система начинает сама бегать и крутиться. Да, а по поводу верлетовской физики, вот, поглядите тут пару моих творений. |
04.05.2010 12:56 | |
Да, я видел. Неплохо. Какой алгоритм для broad phase используешь?
|
05.05.2010 19:08 | |
хз) уже давно это было всё)
А вот проблему эту проверь, она у тебя возникает? |
06.05.2010 11:24 | |
Я понял про что ты говоришь, но у себя не наблюдал. На днях выложу продолжение тутора, там будет обычный бокс с constraints - закручивания вроде нет...
|
06.05.2010 23:51 | |
попробуй сделать кольцо из 100 вершин, гравитацию и поверхность. В сумме они дают кручение точно
|
04.07.2011 18:34 | |
ну да - angle/rotational constraints называются. Много куда можно прицепить ).
|
Последние записи от Волгоградец
- Изометрическая сортировка. Новый подход. (25.01.2013)
- Stage3D заметки (06.04.2012)
- Embed клипа с одним кадром. (16.01.2012)
- Производительность операций с floating point number (18.03.2011)
- FTE based text controls (10.01.2011)