【问题标题】:How to detect when an SCNNode stops moving?如何检测 SCNNode 何时停止移动?
【发布时间】:2019-08-09 19:03:27
【问题描述】:

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

我有一个地板,有一个节点通过重力落向它。节点撞到地板,弹跳,然后着陆并固定在静止位置。

我需要添加一个函数来监视 SCNNode 并在休息时做一些事情。

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

scenekit 中是否有内置的东西可以使用? 如果没有的话,是否可以使用某种形式的计时器每半秒调用一次函数?我将如何设置计时器以及如何检查 SCNNode 以查看它是否已停止移动?

编辑:

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

【问题讨论】:

标签: ios swift xcode scenekit


【解决方案1】:

James P 的评论为我解决了这个问题。

使用SCNSceneRendererDelegate 意味着我可以在每个渲染周期重复运行代码以检查节点是否停止移动。

然后我遇到了这个问题SceneKit: isResting never returns true。 isResting 总是错误的。获得我需要的唯一方法是使用Int(SCNNode.physicsBody?.velocity.z),当它为零时,我的节点完全放在地板上

【讨论】:

  • 你设置了吗。 node.physicsBody?.allowsResting = true ?
【解决方案2】:

有一个模拟,其中许多物体摇晃,寻找稳定的位置。就我而言,我只是寻找所有 3 个速度都小于某个阈值的条件。

设置一个 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
  })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多