Das Android-Spiel Mein Papierflugzeug ist ein großartiges Beispiel für die Implementierung von Neigungssteuerungen, aber ich habe mich schwer getan zu verstehen, wie ich etwas Ähnliches machen kann.
Ich habe das folgende Beispiel, das Folgendes verwendet getOrientation() aus dem SensorManager. Die ganze Sache ist auf Pastebin hier . Es werden lediglich die Orientierungswerte in Textfelder gedruckt. Hier ist der wichtigste Ausschnitt:
private void computeOrientation() {
if (SensorManager.getRotationMatrix(m_rotationMatrix, null,
m_lastMagFields, m_lastAccels)) {
SensorManager.getOrientation(m_rotationMatrix, m_orientation);
/* 1 radian = 57.2957795 degrees */
/* [0] : yaw, rotation around z axis
* [1] : pitch, rotation around x axis
* [2] : roll, rotation around y axis */
float yaw = m_orientation[0] * 57.2957795f;
float pitch = m_orientation[1] * 57.2957795f;
float roll = m_orientation[2] * 57.2957795f;
/* append returns an average of the last 10 values */
m_lastYaw = m_filters[0].append(yaw);
m_lastPitch = m_filters[1].append(pitch);
m_lastRoll = m_filters[2].append(roll);
TextView rt = (TextView) findViewById(R.id.roll);
TextView pt = (TextView) findViewById(R.id.pitch);
TextView yt = (TextView) findViewById(R.id.yaw);
yt.setText("azi z: " + m_lastYaw);
pt.setText("pitch x: " + m_lastPitch);
rt.setText("roll y: " + m_lastRoll);
}
}
Das Problem ist, dass die Werte, die dies ausspuckt, wie Unsinn aussehen, oder zumindest gibt es keine Möglichkeit zu isolieren, welche Art von Bewegung der Benutzer durchgeführt. Ich habe ein Diagramm gezeichnet, um die 2 Bewegungstypen zu kennzeichnen, die ich erkennen möchte - 1. "tilt" für Pitch und 2. "Drehen" für Rollen/Lenken:
(Das ist eine isometrische Ansicht eines Telefons im Querformat, natürlich)
Wenn ich das Telefon entlang seiner Längsachse vorwärts und rückwärts kippe - dargestellt durch 1. - habe ich erwartet, dass sich nur einer der Werte stark ändert, aber alle scheinen sich drastisch zu ändern. Ähnlich verhält es sich, wenn ich das Telefon um eine imaginäre Linie drehe, die aus dem Bildschirm herausragt (siehe 2.): Ich hatte gehofft, dass sich nur der Wert für die Drehung ändert, aber alle Werte ändern sich stark.
Das Problem ist, dass ich, wenn ich mein Spiel kalibriere - was bedeutet, dass ich die aktuellen Werte der Winkel x, y und z aufzeichne - später nicht weiß, wie ich die eingehenden aktualisierten Winkel interpretieren soll, um zu sagen: "Ok, sieht so aus, als ob du das Telefon gekippt hast und um 3 Grad nach links rollen willst". Es ist eher wie "ok, du hast das Telefon bewegt und du kippst und rollst gleichzeitig", auch wenn die Absicht nur eine Rolle war. Macht das Sinn?
Irgendwelche Ideen? Ich habe versucht, mit remapCoordinateSystem zu sehen, ob das Ändern der Achse irgendeine Wirkung hat. Keine Freude. Ich glaube, ich bin etwas grundlegend mit diesem fehlt :-(