Как обнаружить столкновение между узлами двух разных файлов.scn в Scenekit- iOS?

У меня есть два разных файла.scn с двумя разными родительскими узлами с несколькими дочерними узлами. Я реализовал методы делегатов коллизий, и он вызывается правильно. Мое намерение состоит в том, чтобы найти коллизию, только если какой-либо дочерний узел из второго файла.scn сталкивается с любым дочерним узлом или корневым узлом первого файла.scn или наоборот.

Но прямо сейчас, поскольку в обоих файлах.scn все дочерние узлы расположены близко, эти делегаты всегда вызывают, предоставляя contact.nodeA и contact.nodeB как два дочерних узла, которые сталкиваются друг с другом из одного и того же файла.scn.

Можно ли обнаружить столкновение только в том случае, если contact.nodeA находится в другом файле.scn (может быть любым дочерним узлом), а contact.nodeB - в другом файле.scn (может быть любым дочерним узлом)?

Также я могу добавить узел из первого или второго файла.scn несколько раз к одной и той же сцене. В этом случае он должен обнаружить столкновение между узлами этих двух файлов.scn, даже если они принадлежат одному и тому же файлу.scn (добавлен в сцену два раза), поскольку я добавляю его два раза как отдельный объект.

Я установил категорию маски, коллизионную маску и маску контакта как 1 в редакторе сцены Xcode и установил физическое тело как кинематическое для всех дочерних и корневых узлов обоих файлов.scn.

1 ответ

Решение

У каждой сцены должен быть свой Category mask (categoryBitMask в коде), а его Collision mask (collisionBitMask) а также Contact mask (contactTestBitMask) должен быть равен Category mask другой сцены.

Collision mask узла сообщает миру физики, какие категории узлов (на основе Category mask) если это столкнется с.

Category mask об узле говорит физическому миру уведомить своего делегата о контакте с определенными категориями узлов.

Итак, чтобы достичь того, чего вы хотите (учитывая, что вы хотите, чтобы они действительно сталкивались, а не просто обнаруживали, что у них был контакт):

Узлы сцены 1:

Category mask = 1
Collision mask = 2
Contact mask = 2

Узлы сцены 2:

Category mask = 2
Collision mask = 1
Contact mask = 1

Таким образом, они будут сталкиваться только с узлами из другой сцены, а не со своими "сестрами".

Помни что Category mask должно быть степенью 2 (2^0 = 1 и 2^1 = 2), чтобы вы могли объединить их, сложив их.

Например, если бы вы добавили третью сцену, она должна была иметь Category mask = 4 (2^2 = 4):

Узлы сцены 1:

Category mask = 1
Collision mask = 6 [2 + 4] (Category mask of scene 2 and scene 3 added up) 
Contact mask = 6

Узлы сцены 2:

Category mask = 2
Collision mask = 5 [1 + 4] (Category mask of scene 1 and scene 3 added up)
Contact mask = 5

Узлы сцены 3:

Category mask = 4
Collision mask = 3 [1 + 2] (Category mask of scene 1 and scene 2 added up)
Contact mask = 3
Другие вопросы по тегам