Wie vermeide ich, mit einer von Core Motion gesteuerten SceneKit-Kamera zu rollen?

Ich stelle meine SceneKit-Kamera auf das aktuelle @ eiCMDeviceMotion Haltung mit derCMDeviceMotion Erweiterung beschrieben in diesemAntworte:

func deviceDidMove(motion: CMDeviceMotion?, error: NSError?) {
    if let motion = motion {
        let orientation = motion.gaze(atOrientation: UIApplication.sharedApplication().statusBarOrientation)
        cameraNode.orientation = orientation
    }
}

Das funktioniert wunderbar, aber ich möchte die Drehung (Rollen) blockieren und nur zulassen, dass sich die Kamera dreht (Gieren) und neigt.

Ich habe versucht, das Quaternion wieder in Euler-Winkel umzuwandeln und einfach roll auf 0 zu lassen:

cameraNode.eulerAngles = SCNVector3(
            x: orientation.pitch(),
            y: orientation.yaw(),
            z: 0)

Dies funktioniert jedoch nur für die Hälfte der Gierbewegung. Für die andere Hälfte ist die Kamera umgedreht. Ich vermute, dass dies ein Problem mit Gimbal Lock ist, bei dem es um Euler-Winkel geht.

Quaternionen sind für mich ein bisschen wie schwarze Magie, aber gibt es eine Möglichkeit, die Rollenkomponente direkt auf der Quaternionsebene zu entfernen, damit ich Euler-Winkel vermeiden kann?

Antworten auf die Frage(0)

Ihre Antwort auf die Frage