2017-02-15 2 views
2

Derzeit stoße ich ein Problem auf iOS-Plattform. Grundsätzlich lade ich einen Pfeil, der nach Osten in 2D-Umgebung zeigt (nach oben ist Norden, links ist Westen, rechts ist Osten und unten ist Süden). Ich erwarte, dass es in der 3D-Umgebung auf echten Osten zeigen kann, so dass es sich automatisch in die richtige Richtung dreht. Ich zeichne ein Bild, um meine Situation genau zu beschreiben. (Der gepunktete Pfeil ist mein loaded Pfeil und der feste Pfeil, was ich will, wenn ich Kern Bewegungsdaten verwenden)Zeigen auf die richtige Richtung in SceneKit

enter image description here

Jetzt habe ich

let motionManager = CMMotionManager() 
    motionManager.deviceMotionUpdateInterval = 1.0/60.0 
    if motionManager.isDeviceMotionAvailable { 
     motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: { (devMotion, error) -> Void in 
       parent_arrows[0].orientation = SCNQuaternion(-CGFloat((motionManager.deviceMotion?.attitude.quaternion.x)!), -CGFloat((motionManager.deviceMotion?.attitude.quaternion.y)!), -CGFloat((motionManager.deviceMotion?.attitude.quaternion.z)!), CGFloat((motionManager.deviceMotion?.attitude.quaternion.w)!)) 

     })} 

Das Snippet kann nicht automatisch das machen Pfeil dreht sich in die richtige Richtung. Meine Idee ist, den Winkel zwischen dem Gerät und dem Norden zu bekommen und dann diesen Winkel auf die Ausrichtung des Pfeils anzuwenden. Aber wie kann ich den Winkel zu einer Quaternion hinzufügen? Und gibt es eine andere Idee, dies zu erreichen?

+0

Was ist das eigentliche Problem? Wird "parent_arrows [0]" aktualisiert und das Update wird nicht angezeigt? Wird 'parent_arrows [0]' nicht aktualisiert? Wird es aktualisiert und zeigt die falsche Ausrichtung? – Grimxn

+0

Machen Sie die Frage einfach, ich lade einen 3D-Pfeil und ich möchte, dass dieser Pfeil auf die Richtung zeigt (zum Beispiel: Osten). Ich habe geantwortet, was ich unten bekommen habe, aber es scheint, dass das Gimbal Lock herauskommt. – OtakuFitness

Antwort

1

Diese thread erleuchtet mich.

let motionManager = CMMotionManager() 
    motionManager.deviceMotionUpdateInterval = 1.0/60.0 
    if motionManager.isDeviceMotionAvailable { 
     motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: { (devMotion, error) -> Void in 
      parent_arrows[0].orientation = self.orient(q: (motionManager.deviceMotion?.attitude.quaternion)!) 

     })} 
} 

func orient(q:CMQuaternion) -> SCNQuaternion{ 
    let gq1: GLKQuaternion = GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(-heading), 0, 0, 1) 
    // add a rotation of the yaw and the heading relative to true north 
    let gq2: GLKQuaternion = GLKQuaternionMake(Float(q.x), Float(q.y), Float(q.z), Float(q.w)) 
    // the current orientation 
    let qp: GLKQuaternion = GLKQuaternionMultiply(gq1, gq2) 
    // get the "new" orientation 
    var rq = CMQuaternion() 
    rq.x = Double(qp.x) 
    rq.y = Double(qp.y) 
    rq.z = Double(qp.z) 
    rq.w = Double(qp.w) 
    return SCNVector4Make(-Float(rq.x), -Float(rq.y), -Float(rq.z), Float(rq.w)) 
} 

Danach zeigt der Pfeil am Anfang in die richtige Richtung. Es bringt jedoch ein anderes Problem, das ich in einem anderen thread gefragt habe. Die endgültige Antwort ist in this

+0

Dieses Snippet funktioniert nicht so perfekt. Wenn ich das iPhone halte, kann der Pfeil einfach in der X- und Y-Achse rotieren. Z-Achsen-Rotation verschwindet. – OtakuFitness

Verwandte Themen