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

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

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

Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
По умолчанию Алгоритм для мини-движка, учитывающего коллизии объектов в виде окружностей

Коллеги, назрел следующий интересный вопрос. Уже который день не могу придумать нормальный алгоритм для учета коллизий при следующих условиях:
1. Есть некая область в виде окружности
2. Внутри этой области есть другие окружности (3-5 штук), значительно более мелкие (радиус меньше в 5-10 раз)
3. Одна из мелких окружностей всегда движется за курсором - управляемый объект
4. Другая - всегда движется за первой (с чуть меньшей скоростью) - преследующий объект
5. Все прочие статичны - помехи
6. У каждой из окружностей заданы массы

Задача 1: при столкновении окружностей сверять их массы и двигать ту, которая более легкая
Задача 2: не давать мелким окружностям выходить за границы большой окружности, в которую они помещены

В целом и задачи вроде как совсем не сложные (учитывая, что это окружности). И решаются неплохо по-отдельности, но когда пытаюсь совместить воедино - видны какие-то погрешности, да и мой алгоритм похож на какие-то костыли для костылей.

Надеюсь на ваши советы. Чтобы было все более наглядно/визуально - прилагаю ссылку на актуальную версию и мини-пояснения:
- Бледно-зеленая окружность - самая большая, желаемая граница для прочих объектов
- Ярко-зеленая окружность следует за курсором (масса 80)
- Синяя ее преследует (масса 100)
- Серые - статичные помехи (массы 60 и 120)

Чтобы вы не подумали, что я хочу, чтобы кто-то все сделал за меня - готов обсуждать конкретные куски кода, конкретные участки алгоритма.

Добавлено через 14 минут
Сейчас все реализовано по следующей схеме:
Объекты размещаются изначально так, чтобы не пересекались (это не принципиально, просто для удобства).
На событии
Код AS3:
ENTER_FRAME
я двигаю управляемый объект с некоторым шагом в направлении мыши, а преследующий объект - в направлении управляемого.
Как только каждый из этих объектов сдвинулся - я перебором
Код AS3:
for(){}
пробегаюсь по координатам центров всех мелких объектов на сцене (кроме этого самого) и считаю дистанцию между центрами передвинутого объекта и всех остальных. Тут же, если дистанция меньше, чем сумма их радиусов - нахожу дельту. Далее в зависимости от того, чья масса меньше - двигаю легкий объект на дельту в направлении от более тяжелого, опять же проверив предварительно - не даст ли такой сдвиг новую коллизию с более тяжелым объектом. Дальше запускаю дополнительную функцию на проверку - не вышел ли сдвинувшийся объект за пределы большого круга. Если вышел - сдвигаю его назад на дельту в направлении центра большой окружности. Тут бы по-хорошему опять проверять на коллизии... Вообщем, я запутан.
__________________
Игра "Пушкин"


Последний раз редактировалось australian incognito; 17.01.2015 в 02:17.
Старый 17.01.2015, 11:16
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 2  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
ошибка в логике задачи, не решаема.

на второй картинке следствие этой проблемы.

нужно делать так, что бы для тяжелого объекта легкий был материален, но не имел массы. так легкий объект будет толкать тяжелый тогда, когда надо и не будет когда не надо. сейчас легкий объект просто не существует для тяжелого
Изображения
   

Старый 17.01.2015, 19:56
australian incognito вне форума Посмотреть профиль Отправить личное сообщение для australian incognito Найти все сообщения от australian incognito
  № 3  
Ответить с цитированием
australian incognito
 
Аватар для australian incognito

Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
По картинке слева не очень понятно, кто из 3 объектов имеет какие массы, соответственно трудно ответить на ваш вопрос на ней.

По поводу нематериальность легкого объекта - впринципе направление более-менее понятно, но не очень ясно как именно это переложить на алгоритм...

По поводу того, что легкий объект сейчас не существует для тяжелого - не соглашусь (в ситуации на картинках ниже очевидно, что это не так). Просто на вашей картинке как раз наложились алгоритм коллизии и алгоритм не выхода за пределы большой окружности, что дало такой эффект.
Изображения
   
__________________
Игра "Пушкин"

Старый 17.01.2015, 23:59
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 4  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
в левой картинке кто больше тот и тяжелее. а еще ихние центры на одной прямой лежат.

Цитата:
По поводу того, что легкий объект сейчас не существует для тяжелого - не соглашусь (в ситуации на картинках ниже очевидно, что это не так). Просто на вашей картинке как раз наложились алгоритм коллизии и алгоритм не выхода за пределы большой окружности, что дало такой эффект.
ты так говоришь будто бы на второй картинке второго поста не баг а фича
Название: Безымянный (1).png
Просмотров: 311

Размер: 10.4 Кб
Изображения
 

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

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
А зачем вам нужна именно такая странная механика?
Цитата:
Задача 1: при столкновении окружностей сверять их массы и двигать ту, которая более легкая
Почему бы не сделать обычную физику с учетом сохранения импульса и энергии?

Плюс было бы проще, если бы сразу было видно, какой массы шары.
Или текстовые поля на них или прикрутить зависимость размера от массы.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Старый 19.01.2015, 18:17
australian incognito вне форума Посмотреть профиль Отправить личное сообщение для australian incognito Найти все сообщения от australian incognito
  № 6  
Ответить с цитированием
australian incognito
 
Аватар для australian incognito

Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
Буду по-очереди пытаться отвечать на вопросы, дабы найти идеальный вариант решения своей задачи:

1. По первой приаттаченной картинке: в идеале должен быть такой алгоритм, что если масса одного из крайних обьектов больше, чем сумма двух остальных и центры лежат на одной прямой - должны двигаться все 3 обьекта в направлении самого тяжелого. Если же масса крайних обьектов не превышает сумму масс двух остальных - то объекты должны замереть в таком положении и никуда не двигаться.

2. По второй приаттаченной схеме: суть сводится к объяснению из первого пункта - если масса этих троих больше суммы масс одного из двоих + мелкого - идет раздвижение (либо каждого из тех двоих либо только того, который подходит под условие). Т.е. почти как в реальной жизни, но немного упрощено. Трения (если имеется ввиду трение обьекта об обьект) быть не должно.

3.
Цитата:
Сообщение от ChuwY Посмотреть сообщение
А зачем вам нужна именно такая странная механика?

Почему бы не сделать обычную физику с учетом сохранения импульса и энергии?

Плюс было бы проще, если бы сразу было видно, какой массы шары.
Или текстовые поля на них или прикрутить зависимость размера от массы.
Не очень понятно, что вы подразумеваете под "обычной физикой". Было бы круто, если бы вы чуть расписали: буквально базисно, в духе - каждый обьект обладает своим импульсом, который задается... и при столкновении учитываются их энергии (задаются так...) и импульс следующим образом...
Верю, что есть уже протоптанная дорожка, буду рад, если такой задаче есть более простое и разумное (+ физически корректное) обьяснение.
Изображения
   
__________________
Игра "Пушкин"


Последний раз редактировалось australian incognito; 19.01.2015 в 19:04.
Старый 19.01.2015, 19:03
australian incognito вне форума Посмотреть профиль Отправить личное сообщение для australian incognito Найти все сообщения от australian incognito
  № 7  
Ответить с цитированием
australian incognito
 
Аватар для australian incognito

Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
Добавил парочку более явных примеров моего алгоритма (зависимость радиуса и непрозрачности от массы):
Пример 1
Пример 2
__________________
Игра "Пушкин"

Старый 25.01.2015, 20:48
artem2033 вне форума Посмотреть профиль Отправить личное сообщение для artem2033 Найти все сообщения от artem2033
  № 8  
Ответить с цитированием
artem2033

Регистрация: Nov 2013
Сообщений: 74
Вот почитайте http://gamedevelopment.tutsplus.com/...--gamedev-6331, может поможет.

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

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

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


 


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


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