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