swift - 如何在Scenekit-iOS中检测两个不同.scn文件的节点之间的碰撞?

标签 swift scenekit arkit xcode9beta6

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

但现在,由于在两个 .scn 文件中,所有子节点都紧密放置,因此这些委托(delegate)总是被调用,提供 contact.nodeA 和 contact.nodeB 作为来自同一 .scn 文件的两个相互冲突的子节点。

是否仅当 contact.nodeA 来自不同的 .scn 文件(可以是任意子节点)且 contact.nodeB 来自不同的 .scn 文件(可以是任意子节点)时才可以检测碰撞吗?

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

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

最佳答案

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

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

Category mask节点的 告诉物理世界通知其委托(delegate)与某些类别的节点的联系。

因此,为了实现您想要的目标(假设您希望它们真正发生碰撞,而不仅仅是检测到它们已经接触过):

场景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

关于swift - 如何在Scenekit-iOS中检测两个不同.scn文件的节点之间的碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45967128/

相关文章:

ios - 在 SceneKit 中缩放 SCNNode

ios - scenekit 加载场景时显示进度指示器

swift - 无法将纹理图像添加到 ARKit 中的立方体

swift - 如何在 Swift 中比较 CGError

swift - 在 SKLabelNode 中显示多行

ios - .obj 模型的大小可以调整(scenekit)

swift - 如何在 Swift 中以编程方式旋转 USDZ 文件中的 3D 模型?

ios - 将图形放在额头 ARFaceGeometry 顶点

ios - Firebase 引用调用未返回正确的对象(Swift)

ios - 如何导致NSString的dataUsingEncoding : method return nil?