2012-05-30 9 views
5

Ich erinnere mich an WWDC, dass es eine Diskussion gab, die eine Teekanne in OpenGL ES zeigte, die sich mit der Bewegung des Geräts drehte. Es schien, als stünde die Teekanne still im Raum.Wie erhält man eine Drehung um die Y-Achse, relativ zur Art, wie der Benutzer das Gerät hält?

Als die App startete, startete die Teekanne in einer bestimmten Position. Dann, wenn das Gerät gedreht wurde, drehte sich die Teekanne, um still im Raum zu stehen.

Bei diesem Gespräch erwähnten sie, dass wir den "Referenzrahmen" z. nach dem Start der App, die uns sagt, wie der Benutzer das Gerät anfänglich gehalten hat.

Zum Beispiel ist hier die Beschleunigungsmesser-Achse:

accelerometer

I Rotation um Y-Achse wissen will, aber in Bezug auf, wie der Benutzer das Gerät hält. Wenn der Benutzer es aufrecht hält und sich um Y dreht, muss ich den Rotationswert wissen.

Ich denke, der Schlüssel ist das Entfernen der Schwerkraft von den Messwerten? Auch ich ziele auf iPhone 4/4S mit Gyros, aber ich denke, dass CoreMotion sie automatisch sensor-fusionieren würde.

Wie könnte ich herausfinden, um wie viel der Benutzer das Gerät um die Y-Achse gedreht hat?

+0

möglicherweise dies kann Ihnen die Idee http://stackoverflow.com/questions/6464569/changing-uiviews-during-uiinterfaceorientation-on-ipad –

+0

@ Praveen-K Nein, es geht nicht um Geräteausrichtung Ereignisse. Ich möchte den genauen Drehwinkel um Y wissen, wie der Benutzer das Gerät hielt. –

+0

Nun, Sie können immer wissen, bei App-Start, in welcher Ausrichtung der Benutzer das Gerät hält, und basierend auf dieser Bedingung können Sie die Y-Achse berechnen (ich bin nicht sicher, wenn Sie fragen, wo der Benutzer das Gerät hält im seltsamen Winkel: P_) –

Antwort

2

Von Ihrer anderen Frage Why is this CMDeviceMotionHandler never called by CoreMotion? Ich weiß, dass Sie auf iOS 4 arbeiten - Dinge haben sich leicht in iOS5 geändert. Im Allgemeinen sind Gyro-Daten oder eine noch bessere Sensorfusion von Beschleunigungs- und Gyro-Daten wie in DeviceMotion der beste Ansatz, um korrekte Ergebnisse zu erhalten.

Also, wenn Sie dies eingerichtet haben, müssen Sie mit CMAttitude's multiplyByInverseOfAttitude Methode arbeiten, um alle CMDeviceMotion Ergebnisse relativ zu Ihrem Referenzrahmen zu erhalten. Speichern Sie einfach einen Verweis der allerersten CMAtitude in einem Klassenmember und rufen Sie bei allen nachfolgenden Aufrufen MultiplyByInverseOfAttitude damit auf. Dann beziehen sich alle Mitglieder von CMDeviceMotion.attitude auf diesen Referenzrahmen.

Um die Drehung um die Y-Achse zu erhalten, ist ein erster Ansatz, Euler-Winkel zu nehmen, d. H. CMAttitude.roll. Wenn Sie nur kleine Bewegungen verfolgen müssen, könnte dies in Ordnung sein. Wenn die Bewegungen umfangreicher sind, werden Sie Probleme bezüglich Gimbal Lock bekommen. Dann brauchen Sie fortgeschrittene Techniken wie die Quaternion-Operation, um stabile Ergebnisse zu erhalten, aber das klingt nach einer eigenen Frage.