Как обнаружить столкновение между узлами двух разных файлов.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