Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Волгоградец

Оценить эту запись

Эксперименты с физикой. Часть 4.

Запись от Волгоградец размещена 15.04.2010 в 23:26

Сегодня мы поговорим о связях в нашем движке. Связи позволяют держать частицы на определенном расстоянии друг от друга. Мы создадим 4 вида связей - PointConstraint, LengthConstraint, MaxLenghtConstraint, MinLenghtConstraint. А собственно что это такое - связи - и как они работают? Здесь до безобразия все просто - в каждой итерации мы сравниваем расстояние между частицами и если оно не удовлетворяет требованиям, мы просто двигаем частицы на необходимую величину.

Название: 1.png
Просмотров: 2704

Размер: 6.0 Кб

На картинке видим - d - это нужная нам величина. L - это расстояние на текущий момент. Мы просто вычитаем d из L и двигаем каждую частицу на половину расстояния.

Теперь рассмотрим другой случай.

Название: 2.png
Просмотров: 1292

Размер: 5.1 Кб

На самой левой картинке мы видим частицы так, как они должны быть. Затем под воздействием внешних сил одна из частиц (синяя) сдвигается и мы вынуждены применить связи для того, чтобы сохранить нужное расстояние. Мы двигаем синюю и зеленую частицы и получаем то что хотели - нужное расстояние 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 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Очень..) Всегда первым слежу за обновлениями, спасибо за урок =)
Старый 21.04.2010 18:44 koIIImarik вне форума
koIIImarik
 
Аватар для koIIImarik
Очень клёво =) По-моему вы когда-то давно писали комментарии у меня на сайте и спрашивали вопросы, а теперь создаёте такие клёвые примеры и эксперименты. Очень круто.
Старый 21.04.2010 19:17 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
Привет, koIIImarik. Да, писал ). Кажется спрашивал про attachMovie в цикле ). И сейчас захожу - жаль не обновляешься.
P.S.: меня на "ты" можно - не такой уж я и старый.
Старый 22.04.2010 18:21 koIIImarik вне форума
koIIImarik
 
Аватар для koIIImarik
Да, сейчас очень много работы и очень мало времени =(

Я было хотел собрать группу людей, которым было бы интересно писать на Flashist'e новости, по-моему даже на Flasher'е выкладывал новость, но почти никто не ответил. Я всё тешу себя надеждами что вот-вот найду время и буду им заниматься, как и раньше, но увы =(

Если вдруг появится время/желание выкладывать свои статьи на flashist'е, то пиши мне, я дам для твоего аккаунта нужные права.

Кстати ещё раз похвалю примеры, очень клёвые.
Старый 25.04.2010 23:05 Svi_stok вне форума
Svi_stok
 
Аватар для Svi_stok
Спасибо за урок.))
Старый 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 14:55 BuKT вне форума
BuKT
 
Аватар для BuKT
Посмотрел на вторую картинку и задумался насчёт "углового размера". То есть MaxCorner и MinCorner. Будет очень полезно, например, в упругих соединениях со множеством "точек" цепи, чтобы не строить дополнительные связи через несоприкасающихся явно вершин.

А вообще очень клёво. Не хватает только кросс-ссылок на остальные части "физических экспериментов"
Старый 04.07.2011 18:34 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
ну да - angle/rotational constraints называются. Много куда можно прицепить ).
 

 


Часовой пояс GMT +4, время: 14:27.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.