我想检测SCNNode在我迅速编写的Scenekit游戏中何时停止移动。
我的地板上有一个节点因重力而朝着它掉落。该节点撞到地板,弹跳,然后降落并稳定在一个固定位置。
我需要添加一个监视SCNNode的功能,并在其静止时执行某些操作。
在最终的游戏中,我将有不同的SCNNodes以不同的速度下落,因此需要一个仅依赖于查看节点运动而不是等待设置时间的功能。
Scenekit内建了有用的东西吗? 如果不是,是否每半秒使用某种形式的计时器来调用一个函数?我将如何设置计时器以及如何检查SCNNode以查看其是否停止移动?
编辑:
如前所述,我的问题与SceneKit SCNPhysicsBody get notified of resting相同。那个发问者虽然正在使用obj-c,而我正在使用swift。我发现这里评论中的答案似乎更好,并且对我有用。
答案 0 :(得分:1)
James P的评论为我解决了这个问题。
使用SCNSceneRendererDelegate
意味着我可以在每个渲染周期重复运行代码,以检查节点是否停止移动。
然后我遇到了这个问题SceneKit: isResting never returns true。
isResting始终为假。获得我所需要的唯一方法是使用Int(SCNNode.physicsBody?.velocity.z)
,当它为零时,我的节点完全搁在地板上
答案 1 :(得分:0)
有一个模拟,其中许多对象在摇晃,寻找一个稳定的位置。就我而言,我只是寻找所有三个速度均小于某个阈值的情况。
设置SCNSceneRedererDelegate,然后在其中执行以下操作:
sceneView.scene?.rootNode.childNodes(passingTest: {
(node, stop) -> Bool in
if abs(node.physicsBody!.velocity.x)<0.001 &&
abs(node.physicsBody!.velocity.y)<0.001 &&
abs(node.physicsBody!.velocity.z)<0.001 {
//In here, you know it has stopped
...
return true
}
return false
})