2

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

但是现在,由于在两个 .scn 文件中,所有子节点都紧密放置,因此这些代表总是被称为提供 contact.nodeA 和 contact.nodeB 作为两个子节点,它们在同一个 .scn 文件中相互碰撞。

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

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

我已在 Xcode 场景编辑器中将categorymaskcollisionmaskcontact mask设置为1 ,并将 .scn 文件的所有子节点和根节点的物理体设置为运动学。

4

1 回答 1

4

每个场景都应该有它自己的Category maskcategoryBitMask在代码中),而它的Collision mask( collisionBitMask) 和Contact mask( contactTestBitMask) 应该等于Category mask另一个场景的。

Collision mask一个节点告诉物理世界它应该与哪些类别的节点(基于Category mask)发生碰撞。

Category maskof a node 告诉物理世界通知其代表与某些类别的节点的联系。

因此,为了实现您想要的(假设您希望它们实际发生碰撞而不仅仅是检测到它们有接触):

场景一的节点:

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):

场景一的节点:

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
于 2017-08-31T18:56:48.147 回答