|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Алгоритм для мини-движка, учитывающего коллизии объектов в виде окружностей
Коллеги, назрел следующий интересный вопрос. Уже который день не могу придумать нормальный алгоритм для учета коллизий при следующих условиях:
1. Есть некая область в виде окружности 2. Внутри этой области есть другие окружности (3-5 штук), значительно более мелкие (радиус меньше в 5-10 раз) 3. Одна из мелких окружностей всегда движется за курсором - управляемый объект 4. Другая - всегда движется за первой (с чуть меньшей скоростью) - преследующий объект 5. Все прочие статичны - помехи 6. У каждой из окружностей заданы массы Задача 1: при столкновении окружностей сверять их массы и двигать ту, которая более легкая Задача 2: не давать мелким окружностям выходить за границы большой окружности, в которую они помещены В целом и задачи вроде как совсем не сложные (учитывая, что это окружности). И решаются неплохо по-отдельности, но когда пытаюсь совместить воедино - видны какие-то погрешности, да и мой алгоритм похож на какие-то костыли для костылей. Надеюсь на ваши советы. Чтобы было все более наглядно/визуально - прилагаю ссылку на актуальную версию и мини-пояснения: - Бледно-зеленая окружность - самая большая, желаемая граница для прочих объектов - Ярко-зеленая окружность следует за курсором (масса 80) - Синяя ее преследует (масса 100) - Серые - статичные помехи (массы 60 и 120) Чтобы вы не подумали, что я хочу, чтобы кто-то все сделал за меня - готов обсуждать конкретные куски кода, конкретные участки алгоритма. Добавлено через 14 минут Сейчас все реализовано по следующей схеме: Объекты размещаются изначально так, чтобы не пересекались (это не принципиально, просто для удобства). На событии я двигаю управляемый объект с некоторым шагом в направлении мыши, а преследующий объект - в направлении управляемого. Как только каждый из этих объектов сдвинулся - я перебором пробегаюсь по координатам центров всех мелких объектов на сцене (кроме этого самого) и считаю дистанцию между центрами передвинутого объекта и всех остальных. Тут же, если дистанция меньше, чем сумма их радиусов - нахожу дельту. Далее в зависимости от того, чья масса меньше - двигаю легкий объект на дельту в направлении от более тяжелого, опять же проверив предварительно - не даст ли такой сдвиг новую коллизию с более тяжелым объектом. Дальше запускаю дополнительную функцию на проверку - не вышел ли сдвинувшийся объект за пределы большого круга. Если вышел - сдвигаю его назад на дельту в направлении центра большой окружности. Тут бы по-хорошему опять проверять на коллизии... Вообщем, я запутан.
__________________
Игра "Пушкин" Последний раз редактировалось australian incognito; 17.01.2015 в 02:17. |
|
|||||
Регистрация: Jan 2013
Сообщений: 322
|
ошибка в логике задачи, не решаема.
на второй картинке следствие этой проблемы. нужно делать так, что бы для тяжелого объекта легкий был материален, но не имел массы. так легкий объект будет толкать тяжелый тогда, когда надо и не будет когда не надо. сейчас легкий объект просто не существует для тяжелого |
|
|||||
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
По картинке слева не очень понятно, кто из 3 объектов имеет какие массы, соответственно трудно ответить на ваш вопрос на ней.
По поводу нематериальность легкого объекта - впринципе направление более-менее понятно, но не очень ясно как именно это переложить на алгоритм... По поводу того, что легкий объект сейчас не существует для тяжелого - не соглашусь (в ситуации на картинках ниже очевидно, что это не так). Просто на вашей картинке как раз наложились алгоритм коллизии и алгоритм не выхода за пределы большой окружности, что дало такой эффект.
__________________
Игра "Пушкин" |
|
|||||
Регистрация: Jan 2013
Сообщений: 322
|
в левой картинке кто больше тот и тяжелее. а еще ихние центры на одной прямой лежат.
Цитата:
|
|
|||||
А зачем вам нужна именно такая странная механика?
Цитата:
Плюс было бы проще, если бы сразу было видно, какой массы шары. Или текстовые поля на них или прикрутить зависимость размера от массы.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
|
|||||
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Буду по-очереди пытаться отвечать на вопросы, дабы найти идеальный вариант решения своей задачи:
1. По первой приаттаченной картинке: в идеале должен быть такой алгоритм, что если масса одного из крайних обьектов больше, чем сумма двух остальных и центры лежат на одной прямой - должны двигаться все 3 обьекта в направлении самого тяжелого. Если же масса крайних обьектов не превышает сумму масс двух остальных - то объекты должны замереть в таком положении и никуда не двигаться. 2. По второй приаттаченной схеме: суть сводится к объяснению из первого пункта - если масса этих троих больше суммы масс одного из двоих + мелкого - идет раздвижение (либо каждого из тех двоих либо только того, который подходит под условие). Т.е. почти как в реальной жизни, но немного упрощено. Трения (если имеется ввиду трение обьекта об обьект) быть не должно. 3. Цитата:
Верю, что есть уже протоптанная дорожка, буду рад, если такой задаче есть более простое и разумное (+ физически корректное) обьяснение.
__________________
Игра "Пушкин" Последний раз редактировалось australian incognito; 19.01.2015 в 19:04. |
|
|||||
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Добавил парочку более явных примеров моего алгоритма (зависимость радиуса и непрозрачности от массы):
Пример 1 Пример 2
__________________
Игра "Пушкин" |
|
|||||
Регистрация: Nov 2013
Сообщений: 74
|
Вот почитайте http://gamedevelopment.tutsplus.com/...--gamedev-6331, может поможет.
|
Часовой пояс GMT +4, время: 15:57. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|