2016-06-30 27 views
0

Ich versuche die Ausrichtung eines Körpers mit Beschleunigungsmesserdaten zu simulieren und habe Schwierigkeiten, eine glatte Animation zu erhalten.Glatte Animation mit SceneKit unter OS X

Ich habe eine große Datei mit Beschleunigungsmesserdaten und möchte die Orientierung mit den aus den Beschleunigungsmesserdaten berechneten Nick- und Rollwerten animieren. Die Daten werden in konstanten Zeitintervallen abgetastet und ich dachte, dass ich das annähern könnte, indem ich die Dauer = auf die Sample-Zeit setze, die zwischen 80 ms und 640 ms variieren könnte.

Der folgende Code scheint nicht zu funktionieren und die Änderung der Dauer scheint keinen Einfluss auf die Zeit zu haben, die für die Animation des Übergangs zur neuen Ausrichtung benötigt wird.

Was wäre der richtige Weg, um die Orientierungsänderungen des Körpers zu animieren und die Simulationsgeschwindigkeit so anzupassen, dass sie der tatsächlichen Zeit oder einem Vielfachen davon entspricht?

func animate(scan: ScanData) { 

    if let accel = scan.next() { 
     let orientation = accel.orientation 
     let start = scan.startTimeString 
     let time = StringFromDate(scan.dateFromTime(orientation.ms)!)   

     let pitch = Double(DegreesToRadians(0.0)) 
     let yaw = Double(DegreesToRadians(CGFloat(orientation.roll))) 
     let roll = Double(DegreesToRadians(CGFloat(orientation.pitch))) 

     CATransaction.begin() 
      CATransaction.setCompletionBlock({ 
       animate(scan) 
      }) 

      bodyNode.eulerAngles = SCNVector3(pitch, yaw, roll) 

      CATransaction.setAnimationDuration(0.16) 
     CATransaction.commit() 

    } else { 
     print("No more data") 
     return 
    } 
} 

Antwort

2

Für SceneKit implizite Animationen verwenden SCNTransaction (nicht CATransaction).