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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.05.2009, 01:30
Герыч вне форума Посмотреть профиль Отправить личное сообщение для Герыч Найти все сообщения от Герыч
  № 1  
Ответить с цитированием
Герыч
 
Аватар для Герыч

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
Cool Столкновения с полигональным препяствием в алгоритме Верлета

Продолжаю эксперименты с алгоритмом верлета, начатые тут
Работую над столкновениями блоба с произвольным препятсвием.
Блоб устроен просто - кольцо из Joint'ов нужной длины. При этом поддерживается определённая в начале площадь блоба - тут всё работает на ура.
Проблема состоит в следующем:
Задаю произвольную стену в виде полигона(в примере просто случайные по размеру, положению и количеству прямоугольники). Затем в каждый момент времени провожу проверку столкновения блоба с препятствиями и поддерживаю его периметр/площадь и так несколько раз. Но, когда блоб натыкается на уголок препятсвия - всё становится очень плохо. Его ребро, которое касается уголка куда-то резко дёргается и блоб закручивается. Ещё есть проваливание блоба в препяствие, когда его ребро полностью параллельно ребру препятсвия.
Алгоритм такой:
1. При создании стены просчитываются все неизменяемые данные, фигурирующие в алгоритме(для оптимизации)
2. Идёт грубая проверка пересекаются ли ограничивающий прямоугольник блоба с ограничивающим прямоугольником препятсвия
3. Если прошло 1 пункт, то для каждого ребра блоба методом луча проверяется попадание концов ребра в наше препятсвие
3.1 Один конец попал, другой нет:
Перебираются рёбра препятсвия. Ищется то, с которым есть пересечение ребра блоба: идёт менее грубая проверка пересечения ограничивающего прямоугольника блоба с ограничивающим прямоугольником ребра препятсвия, затем ещё менее грубая проверка пересечения ограничивающего прямоугольника ребра блоба с ограничивающим прямоугольником ребра препятсвия, затем непосредственно поиск точки перечечения.
Потом точка, попавшая вовнутрь препятствия ставится куда надо, корректируется скорость в соответсвии с трением и отскоком
3.2 Оба конца снаружи, но вероятно есть пересечения ребра с уголком препятсвия
Тогда аналогично 3.1 ищется пара соседних рёбер препятствия, и оба конца ребра смешаются по перпендикуляру к нему так, чтобы они больше не пересекали уголок.

Но в пункте 3.2. и кроется, как я понимаю, проблема. По сути перемешение должно быть маленьким, но иногда идёт скачок

Кто подскажет как решаются данные проблемы или поможет с более правильным алгоритмом проверки столкновения?

Для полноты картины прилеплю код и 2 примера
Вложения
Тип файла: rar ragdoll.rar (209.8 Кб, 115 просмотров)
Тип файла: rar blob-examples.rar (57.4 Кб, 116 просмотров)

Старый 18.05.2009, 01:41
Герыч вне форума Посмотреть профиль Отправить личное сообщение для Герыч Найти все сообщения от Герыч
  № 2  
Ответить с цитированием
Герыч
 
Аватар для Герыч

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
Ну и вот 2 иллюстрации к двум случаям. Синим показано, что щас двигаем
3.1:Название: 2.JPG
Просмотров: 446

Размер: 8.2 Кб
3.2:Название: 1.JPG
Просмотров: 430

Размер: 7.1 Кб

Старый 19.05.2009, 00:17
Герыч вне форума Посмотреть профиль Отправить личное сообщение для Герыч Найти все сообщения от Герыч
  № 3  
Ответить с цитированием
Герыч
 
Аватар для Герыч

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
Похоже проблему решил.. она заключалась как раз в проваливании блоба в препятсвие. Из-за этого часть блоба резко ускорялась. К тому же я в проверках прямоугольников делал проверки типа < >, а не <= >=
Жалко только никто не помог.. я отчаялся, 2 дня не мог это решить, хотел помощи =(

Добавлено через 36 минут
Задам ещё вопрос в надежде на ответ:

Есть жёсткий невесомый стержень, с 2-мя концами равной массы. Известны скорости(2D вектора) концов стержня, и их положения в пространстве. В некоторый момент стержень ударяется средней точкой об угол неподвижного препятсвия. Надо определить новые скорости. Кто определит, скажу спасибо)

Старый 24.08.2009, 14:04
баракабама вне форума Посмотреть профиль Отправить личное сообщение для баракабама Найти все сообщения от баракабама
  № 4  
Ответить с цитированием
баракабама

Регистрация: Aug 2009
Сообщений: 1
день добрый!
очень интересные и актуальные разработки, особенно интересует пункт №2 алгоритма - каким образом выполняется грубая проверка пересекаются ли ограничивающий прямоугольник блоба с ограничивающим прямоугольником препятсвия?

спасибо

Старый 24.08.2009, 14:54
Герыч вне форума Посмотреть профиль Отправить личное сообщение для Герыч Найти все сообщения от Герыч
  № 5  
Ответить с цитированием
Герыч
 
Аватар для Герыч

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
есть 2 способа(может и больше)- sweep and prune, а второй(который я тут использовал)- заранее построить иерархическое дерево из препятствий. ну то есть если 2 препятствия рядом, то я их помещаю в один общий прямоугольник и если блоб не пересекает общий прямоугольник, то я не проверяю, пересекает ли он внутренние прямоугольники

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
blob , ragdoll , verlet , блоб , верлет
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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