如何检测SCNNode何时停止移动?

时间:2019-03-19 09:43:08

标签: ios swift xcode scenekit

我想检测SCNNode在我迅速编写的Scenekit游戏中何时停止移动。

我的地板上有一个节点因重力而朝着它掉落。该节点撞到地板,弹跳,然后降落并稳定在一个固定位置。

我需要添加一个监视SCNNode的功能,并在其静止时执行某些操作。

在最终的游戏中,我将有不同的SCNNodes以不同的速度下落,因此需要一个仅依赖于查看节点运动而不是等待设置时间的功能。

Scenekit内建了有用的东西吗? 如果不是,是否每半秒使用某种形式的计时器来调用一个函数?我将如何设置计时器以及如何检查SCNNode以查看其是否停止移动?

编辑:

如前所述,我的问题与SceneKit SCNPhysicsBody get notified of resting相同。那个发问者虽然正在使用obj-c,而我正在使用swift。我发现这里评论中的答案似乎更好,并且对我有用。

2 个答案:

答案 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
  })