Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [Алгоритмы] Алгоритм для мини-движка, учитывающего коллизии объектов в виде окружностей (http://www.flasher.ru/forum/showthread.php?t=210026)

australian incognito 17.01.2015 01:58

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

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

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

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

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

Добавлено через 14 минут
Сейчас все реализовано по следующей схеме:
Объекты размещаются изначально так, чтобы не пересекались (это не принципиально, просто для удобства).
На событии
Код AS3:

ENTER_FRAME

я двигаю управляемый объект с некоторым шагом в направлении мыши, а преследующий объект - в направлении управляемого.
Как только каждый из этих объектов сдвинулся - я перебором
Код AS3:

for(){}

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

nubideus 17.01.2015 11:16

Вложений: 2
ошибка в логике задачи, не решаема.

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

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

australian incognito 17.01.2015 19:56

Вложений: 2
По картинке слева не очень понятно, кто из 3 объектов имеет какие массы, соответственно трудно ответить на ваш вопрос на ней.

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

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

nubideus 17.01.2015 23:59

Вложений: 2
в левой картинке кто больше тот и тяжелее. а еще ихние центры на одной прямой лежат.

Цитата:

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

ChuwY 18.01.2015 00:54

А зачем вам нужна именно такая странная механика?
Цитата:

Задача 1: при столкновении окружностей сверять их массы и двигать ту, которая более легкая
Почему бы не сделать обычную физику с учетом сохранения импульса и энергии?

Плюс было бы проще, если бы сразу было видно, какой массы шары.
Или текстовые поля на них или прикрутить зависимость размера от массы.

australian incognito 19.01.2015 18:17

Вложений: 2
Буду по-очереди пытаться отвечать на вопросы, дабы найти идеальный вариант решения своей задачи:

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

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

3.
Цитата:

Сообщение от ChuwY (Сообщение 1177678)
А зачем вам нужна именно такая странная механика?

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

Плюс было бы проще, если бы сразу было видно, какой массы шары.
Или текстовые поля на них или прикрутить зависимость размера от массы.

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

australian incognito 19.01.2015 19:03

Добавил парочку более явных примеров моего алгоритма (зависимость радиуса и непрозрачности от массы):
Пример 1
Пример 2

artem2033 25.01.2015 20:48

Вот почитайте http://gamedevelopment.tutsplus.com/...--gamedev-6331, может поможет.


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

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