La posición del grupo de nodos se restablece al comienzo de SCNNode.runAction
Tengo un código que gira varios SCNNodes alrededor del eje x cuando la pantalla se toca así:
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")
})
}
El problema con el que me encuentro es que cada vez que se llama a esta función, los nodos parecen restablecerse a su posición original antes de realizar la acción. Cuando se completa la acción, parecen permanecer en el lugar correcto hasta que se vuelve a tocar la pantalla. ¿Cómo hago llamadas posteriores ahandleTap
rotarlos desde su posición actual?
Intenté eliminar los nodos de su padre original antes de agregarlos al contenedor, pero no tiene ningún efecto visible.
También he intentado usar una animación.
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")
Que tuvo exactamente el mismo efecto que la acción.
Si vuelvo a colocar los nodos como hijos de la vista raíz en el bloque completo de runAction
container.runAction(action, completionHandler: { () -> Void in
println("completed rotation")
for node: SCNNode in slice {
node.removeFromParentNode()
sceneView.scene!.rootNode.addChildNode(node)
}
})
Luego, los nodos se devuelven a su posición original al finalizar la acción, en lugar de al comienzo de un nuevo toque.