SceneKit: SCNPhysicsBody获取当前速度

6

如何获取SCNPhyisicsBody的当前速度?

velocity属性总是返回(0.0, 0.0, 0.0),而且我的SCNNode的presentationNode的physicsBody也为空。


你找到答案了吗?另外,你如何直接在SCNNode上设置速度? - Crashalot
2个回答

7
您可以使用以下代码获取“当前”速度:
physicsBody.velocity

但是这只在“游戏循环”回调(updateAtTime、didApplyAnimations、didSimulatePhysics、will/didRenderScene)内才有效。

3
你是怎么知道这件事的?在文档中并没有明确提到。 - Confused
这是否意味着你只能在游戏循环回调中设置“速度”?到目前为止,设置速度似乎没有起作用,但将尝试使用游戏循环回调。@困惑 - Crashalot
1
我需要构建一个项目并进行检查。已经有一段时间没有玩弄SceneKit物理引擎了。@Crashalot - Confused
2
@Confused...刚试了一下,直接设置速度属性似乎没有效果(即使在游戏循环函数内)。 - Crashalot
1
@Confused 你能直接设置速度属性来移动SCN节点吗?感谢你的帮助! - Crashalot
答案是错误的。.velocity在任何时候都有效。它“报告”游戏循环中最后计算的速度。与@Crashalot一样,我发现很难设置速度。 - Fattie

1

在您的视图控制器中,您需要使用SCNSceneRendererDelegate协议,如下所示:

class GameViewController: UIViewController,SCNSceneRendererDelegate{...

在viewDidLoad方法中,将SCNView委托设置为scnView.delegate=self。然后您可以实现例如:
func renderer(renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: NSTimeInterval) {

    let scnView = self.view as! SCNView
    let scene = scnView.scene
    let compass = scene?.rootNode.childNodeWithName("ObjectName", recursively: true)

    print((compass?.physicsBody?.angularVelocity)!)
}

这在我的情况下有效。 希望能有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接