在scenekit (swift)中跟踪动画



我试图在右边旋转一个几何图形,只要我触摸屏幕的右边,触摸左边时向左。当不接触屏幕时,动画应该停止。为此,我想出了以下代码,直到我再次按下屏幕,几何形状回到其原始状态,而不是从以前的位置开始旋转。我还需要跟踪未来开发的角度,node. rotate .w总是返回0。

func respondToLPGesture(gestureRecognize: UILongPressGestureRecognizer)
{
    let scnView = self.view as SCNView
    let spin = CABasicAnimation(keyPath: "rotation")
    spin.duration = 2
    spin.repeatCount = .infinity
    let p = gestureRecognize.locationInView(scnView)
    switch gestureRecognize.state
        {
    case .Began:
        //Determine rotation direction
        if p.x < scnView.frame.width / 2 {
            //spin.fromValue = NSValue(SCNVector4: SCNVector4(x: 0, y: 0, z: 1, w: angle))
            //spin.toValue = NSValue(SCNVector4: SCNVector4(x: 0, y: 0, z: 1, w: angle + 2*Float(M_PI)))
            spin.byValue = NSValue(SCNVector4: SCNVector4(x: 0, y: 0, z: 1, w: 2*Float(M_PI)))
            scnView.scene.rootNode.childNodes[1].addAnimation(spin, forKey: "spin around")
        }
        else {
            spin.byValue = NSValue(SCNVector4: SCNVector4(x: 0, y: 0, z: 1, w: 2*Float(-M_PI)))
            scnView.scene.rootNode.childNodes[1].addAnimation(spin, forKey: "spin around")
        }
    case .Ended:
        println(scnView.scene.rootNode.childNodes[1].rotation.w) // Always returns 0.
        scnView.scene.rootNode.childNodes[1].pauseAnimationForKey("spin around")
    default:
        println("Inside default")
    }
}

观看WWDC 2014"What's New in SceneKit"帮助我找到了答案。要在Scenekit中跟踪节点位置/旋转,请使用"presentationNode"。在下面的例子:

let angle = scnView.scene.rootNode.childNodes[1].presentationNode().rotation.w

使用以下命令将返回动画的目标结束值,在我的代码示例中始终为0:

let angle = scnView.scene.rootNode.childNodes[1].rotation.w

最新更新