![]() |
Алгоритм для мини-движка, учитывающего коллизии объектов в виде окружностей
Коллеги, назрел следующий интересный вопрос. Уже который день не могу придумать нормальный алгоритм для учета коллизий при следующих условиях:
1. Есть некая область в виде окружности 2. Внутри этой области есть другие окружности (3-5 штук), значительно более мелкие (радиус меньше в 5-10 раз) 3. Одна из мелких окружностей всегда движется за курсором - управляемый объект 4. Другая - всегда движется за первой (с чуть меньшей скоростью) - преследующий объект 5. Все прочие статичны - помехи 6. У каждой из окружностей заданы массы Задача 1: при столкновении окружностей сверять их массы и двигать ту, которая более легкая Задача 2: не давать мелким окружностям выходить за границы большой окружности, в которую они помещены В целом и задачи вроде как совсем не сложные (учитывая, что это окружности). И решаются неплохо по-отдельности, но когда пытаюсь совместить воедино - видны какие-то погрешности, да и мой алгоритм похож на какие-то костыли для костылей. Надеюсь на ваши советы. Чтобы было все более наглядно/визуально - прилагаю ссылку на актуальную версию и мини-пояснения: - Бледно-зеленая окружность - самая большая, желаемая граница для прочих объектов - Ярко-зеленая окружность следует за курсором (масса 80) - Синяя ее преследует (масса 100) - Серые - статичные помехи (массы 60 и 120) Чтобы вы не подумали, что я хочу, чтобы кто-то все сделал за меня - готов обсуждать конкретные куски кода, конкретные участки алгоритма. Добавлено через 14 минут Сейчас все реализовано по следующей схеме: Объекты размещаются изначально так, чтобы не пересекались (это не принципиально, просто для удобства). На событии Код AS3:
Как только каждый из этих объектов сдвинулся - я перебором Код AS3:
|
Вложений: 2
ошибка в логике задачи, не решаема.
на второй картинке следствие этой проблемы. нужно делать так, что бы для тяжелого объекта легкий был материален, но не имел массы. так легкий объект будет толкать тяжелый тогда, когда надо и не будет когда не надо. сейчас легкий объект просто не существует для тяжелого |
Вложений: 2
По картинке слева не очень понятно, кто из 3 объектов имеет какие массы, соответственно трудно ответить на ваш вопрос на ней.
По поводу нематериальность легкого объекта - впринципе направление более-менее понятно, но не очень ясно как именно это переложить на алгоритм... По поводу того, что легкий объект сейчас не существует для тяжелого - не соглашусь (в ситуации на картинках ниже очевидно, что это не так). Просто на вашей картинке как раз наложились алгоритм коллизии и алгоритм не выхода за пределы большой окружности, что дало такой эффект. |
Вложений: 2
в левой картинке кто больше тот и тяжелее. а еще ихние центры на одной прямой лежат.
Цитата:
Вложение 31360 |
А зачем вам нужна именно такая странная механика?
Цитата:
Плюс было бы проще, если бы сразу было видно, какой массы шары. Или текстовые поля на них или прикрутить зависимость размера от массы. |
Вложений: 2
Буду по-очереди пытаться отвечать на вопросы, дабы найти идеальный вариант решения своей задачи:
1. По первой приаттаченной картинке: в идеале должен быть такой алгоритм, что если масса одного из крайних обьектов больше, чем сумма двух остальных и центры лежат на одной прямой - должны двигаться все 3 обьекта в направлении самого тяжелого. Если же масса крайних обьектов не превышает сумму масс двух остальных - то объекты должны замереть в таком положении и никуда не двигаться. 2. По второй приаттаченной схеме: суть сводится к объяснению из первого пункта - если масса этих троих больше суммы масс одного из двоих + мелкого - идет раздвижение (либо каждого из тех двоих либо только того, который подходит под условие). Т.е. почти как в реальной жизни, но немного упрощено. Трения (если имеется ввиду трение обьекта об обьект) быть не должно. 3. Цитата:
Верю, что есть уже протоптанная дорожка, буду рад, если такой задаче есть более простое и разумное (+ физически корректное) обьяснение. |
|
Вот почитайте 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
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.