Ich erstelle eine Anwendung, in der ich SceneKit-Inhalte in der AR-App verwende. Ich habe mehrere Knoten, die an verschiedenen Stellen in meiner Szene platziert sind. Sie können oder müssen nicht notwendigerweise innerhalb eines Elternknotens sein. Der Benutzer muss einen korrekten Knoten auswählen, wie von der Anwendung festgelegt. Wenn der Benutzer den richtigen Knoten auswählt, durchläuft der richtige Knoten eine Art von Animation und inkorrekte (möglicherweise mehrere) durchlaufen einen anderen Satz von Animation. Ich bearbeite Animationen mit CAAnimation direkt, was alles gut ist. Um dies zu erreichen, erstelle ich ein Array aller Knoten und verwende sie für die Animation.CAAnimation auf mehreren SceneKit-Knoten gleichzeitig
Wenn der Benutzer den Knoten "Ziel" auswählt, durchläuft dieser Knoten einen Animationssatz und andere durchlaufen einen anderen Satz von Animationen.
RiseUpSpinAndFadeAnimation:
private func riseUpSpinAndFadeAnimation(on shape: SCNNode) {
let riseUpAnimation = CABasicAnimation(keyPath: "position")
riseUpAnimation.fromValue = SCNVector3(shape.position.x, shape.position.y, shape.position.z)
riseUpAnimation.toValue = SCNVector3(shape.position.x, shape.position.y + 0.5, shape.position.z)
let spinAnimation = CABasicAnimation(keyPath: "eulerAngles.y")
spinAnimation.toValue = shape.eulerAngles.y + 180.0
spinAnimation.autoreverses = true
let fadeAnimation = CABasicAnimation(keyPath: "opacity")
fadeAnimation.toValue = 0.0
let riseUpSpinAndFadeAnimation = CAAnimationGroup()
riseUpSpinAndFadeAnimation.animations = [riseUpAnimation, fadeAnimation, spinAnimation]
riseUpSpinAndFadeAnimation.duration = 1.0
riseUpSpinAndFadeAnimation.fillMode = kCAFillModeForwards
riseUpSpinAndFadeAnimation.isRemovedOnCompletion = false
shape.addAnimation(riseUpSpinAndFadeAnimation, forKey: "riseUpSpinAndFade")
}
FadeAnimation:
private func fadeAnimation(on shape: SCNNode) {
let fadeAnimation = CABasicAnimation(keyPath: "opacity")
fadeAnimation.toValue = 0.0
fadeAnimation.duration = 0.5
fadeAnimation.fillMode = kCAFillModeForwards
fadeAnimation.isRemovedOnCompletion = false
shape.addAnimation(fadeAnimation, forKey: "fade")
}
ich Animationen erwarten heraus zu arbeiten, was sie tatsächlich sind. Das Problem besteht jedoch darin, dass die Knoten in einer Array-Animation nicht zur gleichen Zeit für alle Knoten ausgeführt werden. Es gibt winzige Unterschiede beim Start der Animation, was zu einer nicht so guten Benutzeroberfläche führt.
Was ich suche ist eine Logik, in der ich Animationen auf allen Knoten anhängen und diese Animationen zusammen später nennen kann, wenn man sagt, dass der Benutzer richtigen Knoten tippt. Arrays scheinen mir keine kluge Wahl zu sein. Allerdings habe ich Angst, wenn ich alle diese Knoten Kinder Knoten eines leeren Knoten und die Laufanimation auf diesem leeren Knoten machen würde, wäre es möglicherweise schwierig, die Platzierung dieser Kindknoten an erster Stelle zu verwalten, da sie beibehalten werden sollen zufällige Abstände und nicht notwendigerweise nahe beieinander. In Anbetracht dessen, dass dies letztendlich die AR-Erfahrung antreibt, wird es mehr und mehr zum Misserfolg.
Anfordern von einigen Eingaben, ob es Methoden gibt, eine Animation an mehrere (ausgewählt aus diesen) Objekten anzuhängen (auch wenn sequentiell), aber sie gemeinsam auszuführen. Ich habe shape.addAnimation(fadeAnimation, forKey: "fade")
"forKey" verwendet, kann das in solchen Anwendungsfällen genutzt werden? Alle Hinweise geschätzt.
Klingt interessant, ich bin gerade unterwegs - werde Ihren Vorschlag nutzen und dann wissen lassen, ob diese Optimierung funktioniert hat. Danke Sean! – Manganese
Ja, CAKeyframe-Animation funktioniert so reibungslos wie CABasicAnimation. Ich lehne mich vorerst an CABasicAnimation an. Ich würde dies jedoch als Antwort akzeptieren. – Manganese