如何检测 Scenekit- iOS 中两个不同 .scn 文件的节点之间的碰撞?
How to detect collision between nodes of two different .scn files in Scenekit- iOS?
我有两个不同的 .scn 文件,它们有两个不同的父节点和多个子节点。我已经实现了碰撞委托方法并且它被正确调用。我的目的是仅当第二个 .scn 文件的任何子节点与第一个 .scn 文件的任何子节点或根节点发生冲突时才发现冲突,反之亦然。
但现在由于在两个 .scn 文件中,所有子节点都紧密放置,这些代表总是被调用提供 contact.nodeA 和 contact.nodeB 作为两个相互冲突的子节点来自同一个 .scn 文件。
是否只有contact.nodeA来自不同.scn文件(可以是任意子节点)和contact.nodeB来自不同.scn文件(可以是任意子节点)才可以检测碰撞?
另外,我可能会将第一个或第二个 .scn 文件中的节点多次添加到同一场景中。在这种情况下,它应该检测这两个 .scn 文件的节点之间的碰撞,即使它们来自同一个 .scn 文件(添加到场景中两次),因为我将它作为一个单独的对象添加了两次
我已将 categorymask、collisionmask 和 contact mask 设置为 1 在 Xcode 场景编辑器中,并将 .scn 文件的所有子节点和根节点的物理体设置为 运动学 。
每个场景都应该有它自己的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
这样他们只会与其他场景中的节点发生碰撞,而不会与他们的"sisters"。
请记住 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
我有两个不同的 .scn 文件,它们有两个不同的父节点和多个子节点。我已经实现了碰撞委托方法并且它被正确调用。我的目的是仅当第二个 .scn 文件的任何子节点与第一个 .scn 文件的任何子节点或根节点发生冲突时才发现冲突,反之亦然。
但现在由于在两个 .scn 文件中,所有子节点都紧密放置,这些代表总是被调用提供 contact.nodeA 和 contact.nodeB 作为两个相互冲突的子节点来自同一个 .scn 文件。
是否只有contact.nodeA来自不同.scn文件(可以是任意子节点)和contact.nodeB来自不同.scn文件(可以是任意子节点)才可以检测碰撞?
另外,我可能会将第一个或第二个 .scn 文件中的节点多次添加到同一场景中。在这种情况下,它应该检测这两个 .scn 文件的节点之间的碰撞,即使它们来自同一个 .scn 文件(添加到场景中两次),因为我将它作为一个单独的对象添加了两次
我已将 categorymask、collisionmask 和 contact mask 设置为 1 在 Xcode 场景编辑器中,并将 .scn 文件的所有子节点和根节点的物理体设置为 运动学 。
每个场景都应该有它自己的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
这样他们只会与其他场景中的节点发生碰撞,而不会与他们的"sisters"。
请记住 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