Позиция группы узлов сбрасывается в начале SCNNode.runAction
У меня есть некоторый код, который вращает несколько узлов SCN вокруг оси x, когда экран нажимается так:
func handleTap(gestureRecognize: UIGestureRecognizer) {
let sceneView = self.view as SCNView
let slice = self.cubes[0...8]
let container = SCNNode()
for node: SCNNode in slice {
container.addChildNode(node)
}
sceneView.scene!.rootNode.addChildNode(container)
container.runAction(SCNAction.rotateByX(CGFloat(M_PI / 2), y: 0.0, z: 0.0, duration: 1), completionHandler: { () -> Void in
println("complete")
})
}
Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда вызывается эта функция, узлы, по-видимому, возвращаются в исходное положение перед выполнением действия. Когда действие завершено, они, кажется, остаются в правильном месте до тех пор, пока экран не будет снова нажат. Как мне сделать последующие звонкиhandleTap
повернуть их из текущего положения?
Я пытался удалить узлы из их исходного родителя, прежде чем добавлять их в контейнер, но это не имеет видимого эффекта.
Я также пытался использовать анимацию
let spin = CABasicAnimation(keyPath: "rotation")
spin.fromValue = NSValue(SCNVector4: SCNVector4(x: -1, y: 0, z: 0, w: 0))
spin.toValue = NSValue(SCNVector4: SCNVector4(x: -1, y: 0, z: 0, w: Float(M_PI_2)))
spin.duration = 3
spin.repeatCount = .infinity
container.addAnimation(spin, forKey: "spin around")
Который имел тот же эффект, что и действие.
Если я верну узлы как дочерние элементы корневого представления в полном блоке runAction
container.runAction(action, completionHandler: { () -> Void in
println("completed rotation")
for node: SCNNode in slice {
node.removeFromParentNode()
sceneView.scene!.rootNode.addChildNode(node)
}
})
Затем узлы возвращаются в исходное положение после завершения действия, а не в начале нового касания.