2017-12-05 1 views
1

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.

Antwort

2

Ich habe Animieren unter Verwendung CAKeyframe Animationen in perfekter Harmonie zu fünfzig SCNNodes hatte bis die angehalten sind (.speed = 0) und Einstellen der Animation des Zeitoffset (.timeOffset) innerhalb einer SCNSceneRendererDelegate "Renderer (updateAtTime :)" -Funktion.

Es ist ziemlich erstaunlich, wie Sie eine angehaltene Animation mit einer Zeitverschiebung alle 1/60 einer Sekunde für eine große Anzahl von Knoten hinzufügen können. Hut ab vor den SceneKit-Entwicklern, die so wenig Aufwand beim Hinzufügen und Entfernen von CAAnimations haben.

Ich versuchte viele verschiedene CAAnimation/SCNAction-Techniken, bevor Sie sich darauf einigten. Bei anderen Methoden würden die Animationen im Laufe der Zeit aus dem Takt geraten.

+0

Klingt interessant, ich bin gerade unterwegs - werde Ihren Vorschlag nutzen und dann wissen lassen, ob diese Optimierung funktioniert hat. Danke Sean! – Manganese

+1

Ja, CAKeyframe-Animation funktioniert so reibungslos wie CABasicAnimation. Ich lehne mich vorerst an CABasicAnimation an. Ich würde dies jedoch als Antwort akzeptieren. – Manganese

1

Mangan,

Ich bin nur eine Vermutung hier nehmen oder könnte eine Idee für Sie funken :-)

ich auf diesem Teil Ihrer Frage bin konzentriert: „Was ich suche ist eine Logik, bei der ich Animationen an allen Knoten anhängen und diese Animationen später zusammen aufrufen kann, wenn der Benutzer beispielsweise den richtigen Knoten anklopft. "

Ich frage mich, ob SCNTransaction: [https://developer.apple.com/documentation/scenekit/scntransaction][1] könnte der Trick

oder vielleicht dispatch.sync oder Asynchron (total raten ... aber helfen könnte) [https://developer.apple.com/documentation/dispatch][1]

oder ich bin weg das Zeichen :-) nur versucht zu helfen ....

Wir alle lernen durch den Austausch, was wir wissen,

RAD

+0

Dank Mate, das zugrunde liegende Problem bleibt gleich, unabhängig davon, ob ich SCNTransaction/CAAnimation oder SCNAction verwenden. Ich müsste die Eigenschaft des Knotens ändern, für die ich dasselbe Array verwenden werde, das ich während der Verwendung von CAAnimation verwendet habe. Letztendlich führt dies zum selben Problem, nicht synchrone Animation aller Knoten. Eigentlich habe ich SCNTransaction schon einmal ausprobiert, daher weiß ich, dass ich am Ende mit dem gleichen Problem zu tun habe. Ich werde versuchen, Dispatches obwohl - klingt wie dort könnte etwas sein, falls es keine andere elegante Lösung gibt. Danke – Manganese

Verwandte Themen