如何检测Scenekit-iOS中两个不同.scn文件的节点之间的冲突?

时间:2017-08-30 18:10:47

标签: swift scenekit arkit xcode9beta6

我有两个不同的.scn文件,两个不同的父节点有多个子节点。我已经实现了碰撞委托方法,并且正确调用它。我的目的是仅在第二个.scn文件中的任何子节点与第一个.scn文件的任何子节点或根节点冲突时发现冲突,反之亦然。

但是现在,因为在两个.scn文件中,所有子节点都紧密放置,这些委托总是被调用,提供contact.nodeA和contact.nodeB作为两个子节点,它们从同一个.scn文件相互冲突。

只有当contact.nodeA来自不同的.scn文件(可以是任何子节点)并且contact.nodeB来自不同的.scn文件(可以是任何子节点)时,是否可以检测到冲突?

此外,我可以将第一个或第二个.scn文件中的节点多次添加到同一个场景中。在这种情况下,它应检测这两个.scn文件的节点之间的冲突,即使它们来自相同的.scn文件(添加两次到场景),因为我将它作为单独的对象添加两次

我已在Xcode场景编辑器中将类别掩码碰撞掩码联系人掩码设置为 1 并已设置物理主体为。strong文件的所有子节点和根节点的运动学

1 个答案:

答案 0 :(得分:3)

每个场景都应该拥有自己的Category mask(代码中为categoryBitMask),而Collision maskcollisionBitMask)和Contact maskcontactTestBitMask )应该等于另一个场景的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