ie Position der @ Knotengruppe wird zu Beginn von SCNNode.runAction @ zurückgesetz
Ich habe Code, der mehrere SCNNodes um die x-Achse dreht, wenn auf den Bildschirm getippt wird:
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")
})
}
Das Problem, auf das ich stoße, ist, dass sich die Knoten jedes Mal, wenn diese Funktion aufgerufen wird, auf ihre ursprüngliche Position zurückzusetzen scheinen, bevor die Aktion ausgeführt wird. Wenn die Aktion abgeschlossen ist, scheinen sie an der richtigen Stelle zu bleiben, bis Sie erneut auf den Bildschirm tippen. Wie tätige ich nachfolgende Anrufe beihandleTap
drehen sie von ihrer aktuellen Position?
Ich habe versucht, die Knoten von ihrem ursprünglichen übergeordneten Element zu entfernen, bevor sie dem Container hinzugefügt wurden, aber es hat keine sichtbaren Auswirkungen.
Ich habe auch versucht mit einer Animation
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")
Welche genau die gleiche Wirkung hatte wie die Aktion.
Wenn ich die Knoten als untergeordnete Elemente der Stammansicht in den vollständigen Block der runAction zurücksetze
container.runAction(action, completionHandler: { () -> Void in
println("completed rotation")
for node: SCNNode in slice {
node.removeFromParentNode()
sceneView.scene!.rootNode.addChildNode(node)
}
})
Dann werden die Knoten nach Abschluss der Aktion an ihre ursprüngliche Position zurückgesetzt und nicht zu Beginn eines neuen Abgriffs.