2010-12-13 2 views
15

В настоящее время я работаю над 2D-стрельбой по типу игры, и я использую квадровое дерево для обнаружения коллизий. Я написал рабочее квадратное дерево, которое правильно подталкивает моих актеров в узлы/листья, которыми они принадлежат в дереве. Однако у меня есть несколько проблем.QuadTree для обнаружения двумерных столкновений

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

Что вызывает второй вопрос. Скажем, у меня есть объект в узле, который не является соседом другого узла, но что объект достаточно велик, что он охватывает несколько узлов, как я могу проверить фактическое столкновение, так как я предполагаю, что дерево может считать, что это не достаточно близко, чтобы столкнуться с объектами в «удаленном» узле? Должны ли объекты, которые не полностью вписываются в узел, сохраняются в родительском узле?

В моей игре большинство объектов имеют разные размеры и перемещаются.

Я читал большое количество блогов/статей о квадрантах, но большинство из них просто объясняют, как построить дерево, которое на самом деле не то, что я ищу.

Любая помощь/информация приветствуется.

+2

Если игра, которую вы делаете, действительно похожа на видео, которое вы связали, вам вообще не следует использовать пространственный индекс. Несортированный список объектов будет, вероятно, быстрее до нескольких сотен движущихся объектов. – SingleNegationElimination

+0

Зависит от столкновения, я думаю ... возможно, для кругового столкновения, возможно, не для пиксельных. Кроме того, для небольшого количества объектов, ищущих соседей в 1D-отсортированном списке entites, обычно быстрее всего, IIRC. Но внедрение рабочего квадтрита стоит того, чтобы испытать настоящий опыт. (А также, bullet hell-trend shoot'em ups может иметь сотни движущихся объектов легко :)) – Kos

ответ

15

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

Тогда при проверке столкновений для узла А, вы действуйте следующим образом:

  1. текущий узел = корневой узел
  2. проверки столкновений А с каждым элементом непосредственно в текущем узле
  3. если Можение полностью содержаться в любом из подузлов текущего узла, установить текущий узел на этот подузел и снова перейти к 2
  4. , проверить столкновения A со всеми элементами в дочерних узлах текущего узла, рекурсивно ,

Обратите внимание, что чем меньше объекты, тем глубже они будут расположены в квадратном дереве, поэтому их будут сравнивать реже.

+0

BTW- это соглашение, где * not * только листья могут содержать элементы, вероятно, не единственные, которые существуют - только первое, что приходит мне на ум. Возможно, вы наткнулись на другие варианты, которые принимают разные предположения и, следовательно, нуждаются в другом подходе. – Kos

+0

Итак, мне нужно повторить эти 4 шага для каждого объекта в игре, чтобы проверить его на наличие потенциальных столкновений? – dotminic

+2

Да, в общем случае. Но вы можете иметь сразу несколько деревьев - например, пули не сталкиваются с пулями, поэтому вы даже можете иметь отдельные деревья для пуль и отдельно, например, противников, и проверять каждую пулю вражеским деревом и т. Д. Проверьте свою логику и подумайте, сколько деревьев вам действительно нужно в этом варианте :) – Kos

Смежные вопросы