Давайте предположим, что я использую этот персонаж.
(источник: iconbug.com )
Как бы вы реализовали обнаружение столкновений для него? Использование ограничивающего прямоугольника не является хорошим приближением, потому что форма птицы далеко не квадратная.
Я думал о том, чтобы внутри объекта была какая-то структура данных четырехугольного дерева, представляющая части изображения. Каждый лист может быть или false
(в случае, если он покрывает белое / прозрачное пространство снаружи птицы) или true
(в случае, если он представляет область птицы, например, клюв, глаз и т. Д.). Затем каким-то образом протестируйте единственное препятствие на сцене для столкновения с птицей.
Но мои проблемы в моем подходе:
- Я не знаю, как инициализировать дерево квадов.
- После инициализации четырехугольного дерева я не уверен, как пройти и использовать его, когда препятствие находится в пределах координат изображения.
Как бы вы сделали обнаружение столкновений с не квадратными персонажами?
Л.Е .: Другой подход, который я видел, заключался в использовании нескольких ограничивающих рамок. Например, у меня есть одна или несколько ограничительных рамок для клюва, затем несколько из них для волос или хвоста. Но это может стать утомительным. Если это правильный подход в моем случае, как бы я сгенерировал эти ограничивающие рамки? Я сомневаюсь, что я должен иметь их в своей программе.
LE2: я забочусь о довольно точных столкновениях. Я не могу представить, как один ограничивающий прямоугольник или круг может хотя бы прилично приблизиться к этой форме, поэтому такой подход не сработает.
источник
Ответы:
Круг коллайдер. Достаточно для этого, я бы сказал, если вы не делаете что-то причудливое, когда физические элементы воздействуют на определенные части или столкновение выглядит неестественно, и даже если вам нужно разделить это на несколько частей, я могу сказать вам одну вещь:
Не переусердствуйте.
Для этого вам не нужна полная четырехъядерная структура. Просто поместите несколько прямоугольников или кружков в прямой массив, а затем пересекайте их все. Это не может быть достаточно критичным по производительности, и вы не получите столько пользы от использования четырехугольного дерева.
источник
Двухэтапный процесс проверки
На первом шаге вы проверяете ограничивающий прямоугольник , и если там нет столкновений, тогда тест завершен. Если есть столкновение, вы переходите ко второму проходу
На втором проходе , если вам нужна более высокая точность и вы хотите действительно идеальное решение для пикселов, то вы можете сделать именно это, проходной контроль для пикселов.
Поскольку ваше изображение представляет собой PNG (или любой другой формат файла, который содержит альфа-канал), это будет довольно легко
Если вы посмотрите на ваш альфа-канал изображений, вы увидите, что он уже содержит всю информацию, которая может вам понадобиться для идеального столкновения пикселей
Столкновения с идеальным пикселем, как правило, дороги, поэтому предварительная оценка сначала с помощью ограничивающего прямоугольника или более детального рисунка столкновения (например, предложенного Анко) может сэкономить ваше драгоценное время.
«Более тонкий» подробный ограничивающий прямоугольник столкновения Анко предложил:
PS: если ваше изображение имеет ореол, эффект или другой не-0 альфа-канал вокруг него, с которым вы не хотите сталкиваться, порог алгоритма можно легко отрегулировать, чтобы приспособить это
источник
Я бы использовал круг для тела и один прямоугольник для клюва, но это только мое мнение. Слишком сложная геометрия столкновения может замедлить ваше приложение, хотя вы практически удваиваете (или больше) количество символов на экране.
источник
Может быть, вы могли бы использовать какой-нибудь шаткий полигон / краевой коллайдер.
Не уверен, как именно это будет работать, но:
два объекта: объект 1: птица (o1), объект 2: вещь, которая может ударить птицу (o2)
1) Определите ограничивающую фигуру, которая является многоугольником, который подходит близко к первому рассматриваемому объекту (o1).
2) Получите ребра o1, o2, которые могли бы столкнуться без возможности столкновения без прохождения o2 через o1 или наоборот.
С положением и размером фигуры (o2) вы, вероятно, могли бы изолировать ребра (от o1), в которые невозможно попасть, потому что они находятся «за» другим ребром (из o1), который ближе к o2. Если у вас был прямоугольный треугольник, гипотенуза которого обращена вверх и вправо, и прямоугольник, приближающийся к нему прямо (с длинной стороной вдоль оси x), то вы можете указать, какие ребра пропустить, так как значения их начала и конца y оба либо выше или ниже прямоугольника.
3) Определите, совпадает ли одна из точек на краю o2 с точкой на любом из ребер o1, выбранных на шаге 2.
эта концепция, вероятно, лучше всего подходит для сталкивающихся многоугольников (т.е. объектов с четкими краями), но, возможно, вы можете рассматривать круг как один длинный край (например, если o2 был кругом).
источник