Может кто-нибудь объяснить обнаружение столкновения на пиксель? - PullRequest
9 голосов
/ 06 октября 2008

Может кто-нибудь объяснить плюсы и минусы этого и любую математику, связанную с этим?

Ответы [ 7 ]

11 голосов
/ 06 октября 2008

Для 2D: Вам не нужна математика для этой задачи, вам нужна только специальная подпрограмма bitblit. Вы переместите кандидатов на столкновение в скрытую поверхность, нарисовав их маски столкновения на этой поверхности и проверив, являются ли пиксели, которые вы хотите нарисовать, (pixel! = 0). Тогда у вас будет столкновение. Конечно, вы должны перепроверить ограничивающие прямоугольники, если может произойти столкновение.

Для 3D: Вам понадобится математика (много)!

В основном вы будете проверять каждую поверхность вашего актера на каждую поверхность вашего врага. Это будет сделано путем расчета пересечения плоскости луча. Здесь возможна большая оптимизация, но это зависит от вашего трехмерного представления. Это также не Per-Pixel Collision, но Per-Vertex Collision

6 голосов
/ 14 мая 2012

Я начну с ответа на плюсы и минусы обнаружения столкновений на пиксель, а затем рассмотрю математические аспекты.

Обнаружение столкновений на уровне пикселей, также известное как обнаружение столкновений с идеальной точностью пикселей и, возможно, более точно обнаружение столкновений на основе изображений, - это обнаружение столкновений между объектами столкновений, которые представлены как изображения. Этот пространственный метод отличается от более геометрических методов, где для представления объектов столкновения используются многоугольники и другие геометрические фигуры.

Для 2D обычно есть 3 различных варианта:

  • Изображение на основе
  • Простые геометрические фигуры (ограничивающие оси ограничительные рамки, круги)
  • Сложные геометрические фигуры (выпуклые многоугольники, вогнутые многоугольники, эллипсы и т. Д.)

Обнаружение столкновений на основе изображений является точным, простым в использовании и понимании. Что касается игр, использующих изображения для рисования, использование обнаружения столкновений на основе изображений означает, что всякий раз, когда спрайты на экране перекрываются, они также перекрываются в системе обнаружения столкновений. Они также полезны для игр, где требуются деформируемые объекты столкновения, например, для игр с видимой разрушаемой местностью, таких как Worms 2D, так как предварительное вычисление обычно мало. Их главный недостаток в том, что они очень неэффективны по сравнению с другими методами, особенно при вращении и масштабировании объектов столкновения.

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

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

Обнаружение столкновений на основе изображений обычно рассматривается как плохое решение, поскольку оно часто неэффективно, особенно при использовании поворота и масштабирования. Однако, поскольку он настолько гибкий, точный и простой в использовании, я решил реализовать библиотеку, которая стремится решить проблему эффективности. В результате получается PoxelColl , который использует автоматически рассчитанные выпуклые оболочки для ускорения обнаружения столкновений на основе изображений. Это обеспечивает простоту использования, гибкость, точность и эффективность, а также поддерживает вращение и масштабирование. Основными недостатками является то, что он не эффективен во всех случаях по сравнению с чисто геометрическими решениями, и он требует предварительного вычисления, то есть он не очень неэффективен для деформируемых объектов столкновения.

Для 3D варианты и преимущества несколько схожи:

  • Объем на основе
  • Простые геометрические фигуры (ограничивающие оси ограничительные рамки, круги)
  • Сложные геометрические фигуры (выпуклые многоугольники, вогнутые многоугольники, эллипсы и т. Д.)

Следует отметить, что ответ Питера Паркера неверен для 3D; пиксели (элементы изображения) в 2D соответствуют вокселям (элементам объема) в 3D.

Некоторые важные различия заключаются в том, что пространственный метод гораздо реже для 3D, чем для 2D. Одна из возможных причин состоит в том, что, поскольку 3D добавляет дополнительное измерение, пространственное решение становится еще менее эффективным, в то время как простые геометрические решения все еще эффективны. А в играх обнаружение столкновений, как правило, является онлайн-операцией, требующей некоторого уровня эффективности, что делает эффективность важной. Поэтому объемы чаще используются в неигровых приложениях, где нет необходимости определять столкновения в Интернете.

Примеры обнаружения столкновений с обнаружением столкновений на основе объема см., Например, Объемное обнаружение столкновений для деформируемых объектов , где использование объемов вместо геометрических форм означает, что они могут обрабатывать деформируемые объекты столкновений произвольно фасонные, закрытые поверхности.

Что касается второго вопроса, математика, связанная с коллизиями на основе изображений, может варьироваться от простой до сложной. В простом случае в основном используются ориентированные по осям ограничительные рамки для изображений, нахождение их пересечения, а затем только проверка изображений в пересечении. Более сложные решения включают библиотеку, о которой я упоминал ранее, где требуется пересечение выпуклых многоугольников. А для трехмерного случая решения варьируются от простых до очень сложных.

2 голосов
/ 06 октября 2008

Говоря о плюсах и минусах, вы также должны учитывать реакцию на столкновение. Что вы хотите сделать при обнаружении столкновения? Если вы обнаруживаете объект, попадающий в другой объект, результатом которого является уничтожение одного или обоих объектов, то обнаружение столкновений на пиксель является хорошим и точным. Если вы хотите, чтобы объект реагировал каким-либо иным образом, например, скользил по стене, подпрыгивал и т. Д. ... тогда вы можете работать с некоторым типом ограничивающего прямоугольника / круга / овала, который сделает реакцию столкновения более гладкой и более последовательный, с меньшим шансом застрять.

2 голосов
/ 06 октября 2008

Это точнее, чем вершины (или хит-боксы и т. Д.). Я предполагаю, что вы говорите о 2d здесь (3d будет box-модель против вершины). Пиксель позволил бы вам иметь детальные спрайты, с которыми мелочи (скажем, ракеты) сталкивались бы более реалистично.

Это более математично и медленнее, чем обычный метод, который состоит в том, чтобы нарисовать прямоугольник (или какую-нибудь другую легко математическую форму, например, круг) и сказать: «Это актер, все, что здесь есть, он». Это, однако, более точно.

0 голосов
/ 26 июля 2010

Обнаружение столкновений на пиксель является пережитком прошлого, когда графика была простой, а 2D-оборудование включало бесплатную проверку столкновений между спрайтами и фонами. В то время как современная 2-мерная графика более сложна, проверки столкновений на пиксель используются редко, особенно потому, что видимая форма объекта и форма столкновения обычно различаются. Круги или коробки достаточно для большинства случаев. Кроме того, поскольку графическое оборудование на основе opengl больше не может выполнять проверку столкновений, вам необходимо написать дополнительный код рендеринга, используя ЦП для единственной цели проверки столкновений, сохраняя при этом дополнительные растровые данные в системной памяти, так как графическая память не может быть доступна напрямую.

0 голосов
/ 26 мая 2009

с учетом OpenGL и случая текстуры: вы можете предварительно рассчитать битовую матрицу для изображения и проверить, перекрываются ли два пикселя.

0 голосов
/ 06 октября 2008

Профессионалы уже упоминались: он идеален по пикселям и справедлив, в нем нет ни ложных, ни ложных отрицаний. Основным недостатком является то, что это дорого для вычисления, но если вы сначала делаете простой ограничивающий флажок, это не должно быть большой проблемой. В эпоху OpenGL и DirectX существует еще одна проблема: данные спрайтов обычно представляют собой текстуры, что означает, что они находятся в VRAM, и вы сами не можете легко проверить значения пикселей. В OpenGL Вы можете использовать функцию glReadPixels, чтобы вернуть пересеченную часть двух спрайтов обратно в ОЗУ и проверить столкновение, или Вы можете использовать запрос окклюзии . Подход к окклюзионным запросам должен иметь более высокую производительность, поскольку вы не перемещаете данные обратно из графического процессора, но окклюзионные запросы не поддерживаются везде (т. Е. Они не поддерживаются в OpenGL ES, кто-нибудь, пожалуйста, исправьте меня, если я ошибаюсь).

...