Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift SceneKit:为什么它过早地检测到节点之间的接触?_Ios_Swift_Scenekit_Physics_Scnnode - Fatal编程技术网

Ios Swift SceneKit:为什么它过早地检测到节点之间的接触?

Ios Swift SceneKit:为什么它过早地检测到节点之间的接触?,ios,swift,scenekit,physics,scnnode,Ios,Swift,Scenekit,Physics,Scnnode,我试图使用SCNPhysicsContactDelegate构建一些项目,但我发现它过早地检测到节点之间的联系。我需要它是100%准确和正确的。我附上过早接触检测的截图。 这是我为他们的物理身体编写的代码: 节点代码: nodeA = SCNNode(geometry: SCNBox(width: 0.3, height: 0.3, length: 0.3, chamferRadius: 0.05)) nodeA.position = SCNVector3(0,

我试图使用SCNPhysicsContactDelegate构建一些项目,但我发现它过早地检测到节点之间的联系。我需要它是100%准确和正确的。我附上过早接触检测的截图。 这是我为他们的物理身体编写的代码:

节点代码:

        nodeA = SCNNode(geometry: SCNBox(width: 0.3, height: 0.3, length: 0.3, chamferRadius: 0.05))
        nodeA.position = SCNVector3(0, 3.3, 0)
        nodeA.geometry?.firstMaterial?.diffuse.contents = UIColor.red
        nodeA.physicsBody = SCNPhysicsBody.dynamic()
        nodeA.physicsBody?.physicsShape = SCNPhysicsShape(node: nodeA, options: nil)
        nodeA.physicsBody?.categoryBitMask = PhysicsCategories.nodeA
        nodeA.physicsBody?.contactTestBitMask = PhysicsCategories.nodeB
        nodeA.physicsBody?.isAffectedByGravity = false
        nodeA.name = "nodeA"
        nodeA.opacity = 0
        self.scene.rootNode.addChildNode(self.nodeA)
基站代码: (nodeB已经存在,所以我只添加物理体)

联系人功能代码:

        func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) {
            scene.isPaused = true
        }

你能找个人帮我找到解决办法吗? 我期待着你们的听证会


谢谢Jakub

我找到了解决方案!这两条线路导致接触检测不准确:

nodeA.physicsBody?.physicsShape=scnpphysisShape(节点:nodeA,选项:nil)
nodeB.physicsBody?.physicsShape=scnpysisShape(节点:nodeB,选项:nil)

问题是,当您使用节点属性创建SCNPphysisShape()时,它是不精确的,但当您使用节点几何体创建它时,它的工作方式完全正确且精确。 在我的例子中,解决方案如下所示(用这些行替换问题行):

nodeA.physicsBody?.physicsShape=SCNPphysisShape(几何体:SCNBox(宽:0.3,高:0.3,长:0.3,腔长:0.05),选项:无)

nodeB.physicsBody?.physicsShape=SCNPhysicsShape(几何体:SCNBox(宽:0.1,高:0.5,长:1,chamferRadius:0),选项:nil)

也许可以在调试选项中打开ShowPhysicsShape,以便查看它在做什么,然后使用SCNPhysicsShape的不同选项进行游戏。另外,设置isPaused时,它是否实际渲染和显示检测到接触的帧也不是100%清楚。我对SceneKit的渲染循环还不够熟悉@bg2b正如您在屏幕截图中所看到的,节点的物理形状是可见的,因为我启用了。在调试选项中显示物理形状。现在我查看了sceneKit的渲染循环,发现它首先模拟物理,然后渲染场景。@bg2b但渲染循环不是我现在发现的问题。在那里你可以看到,它首先模拟物理,然后渲染场景,在渲染场景之后,它调用didRenderScene方法。因此我尝试了以下方法:我创建了新变量
var stopIt=false
,然后在物理世界函数中,当触发触点时,该代码运行:stopIt=true,然后在didRenderScene方法中:
如果stopIt{scene.isPaused=true}
但是在那之后,结果看起来还是一样的。盒子仍然被过早地停止。速度是什么样的?场景必须以离散的步骤进行,因此将有一帧存在间隙,一帧之后,如果不通过反弹或其他方式停止,对象将重叠。图片是否显示可能提前一帧,即反弹前?它在运行时是否看起来明显太早了?如果你放慢速度,接触指示是否发生在同一地点?如果是这样,这表明碰撞不精确,但如果它们在移动较慢时靠近,则表明您在触摸前帧收到通知。您所说的“太早”是什么意思?不幸的是,所附的图像非常小,不具有自解释性。
        func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) {
            scene.isPaused = true
        }