A posição do grupo de nós é redefinida no início de SCNNode.runAction
Eu tenho algum código que gira vários SCNNodes ao redor do eixo x quando a tela é tocada da seguinte maneira:
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")
})
}
O problema que eu estou enfrentando é que toda vez que essa função é chamada, os nós parecem se redefinir para sua posição original antes de executar a ação. Quando a ação é concluída, eles parecem permanecer no local correto até que a tela seja tocada novamente. Como faço chamadas subseqüentes parahandleTap
girá-los de sua posição atual?
Tentei remover os nós do pai original antes de adicioná-los ao contêiner, mas ele não tem efeito visível.
Eu também tentei usar uma animação
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")
Qual teve exatamente o mesmo efeito que a ação.
Se eu colocar os nós de volta como filhos da visualização raiz no bloco completo de runAction
container.runAction(action, completionHandler: { () -> Void in
println("completed rotation")
for node: SCNNode in slice {
node.removeFromParentNode()
sceneView.scene!.rootNode.addChildNode(node)
}
})
Em seguida, os nós retornam à sua posição original após a conclusão da ação, em vez de no início de um novo toque.