|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Столкновения с полигональным препяствием в алгоритме Верлета
Продолжаю эксперименты с алгоритмом верлета, начатые тут
Работую над столкновениями блоба с произвольным препятсвием. Блоб устроен просто - кольцо из Joint'ов нужной длины. При этом поддерживается определённая в начале площадь блоба - тут всё работает на ура. Проблема состоит в следующем: Задаю произвольную стену в виде полигона(в примере просто случайные по размеру, положению и количеству прямоугольники). Затем в каждый момент времени провожу проверку столкновения блоба с препятствиями и поддерживаю его периметр/площадь и так несколько раз. Но, когда блоб натыкается на уголок препятсвия - всё становится очень плохо. Его ребро, которое касается уголка куда-то резко дёргается и блоб закручивается. Ещё есть проваливание блоба в препяствие, когда его ребро полностью параллельно ребру препятсвия. Алгоритм такой: 1. При создании стены просчитываются все неизменяемые данные, фигурирующие в алгоритме(для оптимизации) 2. Идёт грубая проверка пересекаются ли ограничивающий прямоугольник блоба с ограничивающим прямоугольником препятсвия 3. Если прошло 1 пункт, то для каждого ребра блоба методом луча проверяется попадание концов ребра в наше препятсвие 3.1 Один конец попал, другой нет: Перебираются рёбра препятсвия. Ищется то, с которым есть пересечение ребра блоба: идёт менее грубая проверка пересечения ограничивающего прямоугольника блоба с ограничивающим прямоугольником ребра препятсвия, затем ещё менее грубая проверка пересечения ограничивающего прямоугольника ребра блоба с ограничивающим прямоугольником ребра препятсвия, затем непосредственно поиск точки перечечения. Потом точка, попавшая вовнутрь препятствия ставится куда надо, корректируется скорость в соответсвии с трением и отскоком 3.2 Оба конца снаружи, но вероятно есть пересечения ребра с уголком препятсвия Тогда аналогично 3.1 ищется пара соседних рёбер препятствия, и оба конца ребра смешаются по перпендикуляру к нему так, чтобы они больше не пересекали уголок. Но в пункте 3.2. и кроется, как я понимаю, проблема. По сути перемешение должно быть маленьким, но иногда идёт скачок Кто подскажет как решаются данные проблемы или поможет с более правильным алгоритмом проверки столкновения? Для полноты картины прилеплю код и 2 примера |
|
|||||
Похоже проблему решил.. она заключалась как раз в проваливании блоба в препятсвие. Из-за этого часть блоба резко ускорялась. К тому же я в проверках прямоугольников делал проверки типа < >, а не <= >=
Жалко только никто не помог.. я отчаялся, 2 дня не мог это решить, хотел помощи =( Добавлено через 36 минут Задам ещё вопрос в надежде на ответ: Есть жёсткий невесомый стержень, с 2-мя концами равной массы. Известны скорости(2D вектора) концов стержня, и их положения в пространстве. В некоторый момент стержень ударяется средней точкой об угол неподвижного препятсвия. Надо определить новые скорости. Кто определит, скажу спасибо) |
|
|||||
Регистрация: Aug 2009
Сообщений: 1
|
день добрый!
очень интересные и актуальные разработки, особенно интересует пункт №2 алгоритма - каким образом выполняется грубая проверка пересекаются ли ограничивающий прямоугольник блоба с ограничивающим прямоугольником препятсвия? спасибо |
|
|||||
есть 2 способа(может и больше)- sweep and prune, а второй(который я тут использовал)- заранее построить иерархическое дерево из препятствий. ну то есть если 2 препятствия рядом, то я их помещаю в один общий прямоугольник и если блоб не пересекает общий прямоугольник, то я не проверяю, пересекает ли он внутренние прямоугольники
|
Часовой пояс GMT +4, время: 01:38. |
|
« Предыдущая тема | Следующая тема » |
Теги |
blob , ragdoll , verlet , блоб , верлет |
Опции темы | |
Опции просмотра | |
|
|