2013-05-26 7 views
6

Ich würde gerne wissen, wie man den Ausgang des "Rotationsvektorsensors" richtig verwendet. Zur Zeit habe ich folgendes herausgefunden und wollte Gier und Ton von result[] berechnen, um zu wissen, wo das Gerät hinweist (im Querformat). Aber ich habe Probleme mit den Ergebnissen. Die Gierberechnung ist ziemlich genau, aber die Tonhöhe verhält sich merkwürdig. Vielleicht kann mir jemand in die richtige Richtung zeigen, wie die Daten zu verwenden sind. Eine andere Sache, die ich auch gerne wissen würde ist, ob die Ausrichtung des Geräts (Querformat oder Hochformat) einen Einfluss auf die Ausgabe dieses Sensors hat. Danke im Voraus.Verwendung des Rotationsvektorsensors

private double max = Math.PI/2 - 0.01; 
private double min = -max; 

private float[] rotationVectorAction(float[] values) { 
    float[] result = new float[3]; 
    float vec[] = values; 
    float quat[] = new float[4]; 
    float[] orientation = new float[3]; 
    SensorManager.getQuaternionFromVector(quat, vec); 
    float[] rotMat = new float[9]; 
    SensorManager.getRotationMatrixFromVector(rotMat, quat); 
    SensorManager.getOrientation(rotMat, orientation); 
    result[0] = (float) orientation[0]; 
    result[1] = (float) orientation[1]; 
    result[2] = (float) orientation[2];  
    return result; 
} 

private void main() { 
    float[] result = rotationVectorAction(sensorInput); 
    yaw = result[0]; 
    pitch = result[1]; 
    pitch = (float) Math.max(min, pitch); 
    pitch = (float) Math.min(max, pitch); 
    float dx = (float) (Math.sin(yaw) * (-Math.cos(pitch))); 
    float dy = (float) Math.sin(pitch); 
    float dz = (float) (Math.cos(yaw) * Math.cos(pitch)); 
} 

Und in OpenGL ES 2.0 Diese stelle ich meine Kamera bewegen:

Matrix.setLookAtM(mVMatrix, 0, 0, 0, 0, dx, dy, dz, 0, 1, 0); 

Antwort

4

Endlich habe ich es selbst gelöst. Der Grund dafür, dass die Tonhöhe nicht richtig funktioniert, ist der Unterschied zwischen INPUT und OUTPUT von SensorManager.getQuaternionFromVector(quat, vec);. Die Methode erwartet, dass ein Vektor vec(x|y|z|w) ist und die Ausgabe quat wie folgt aussieht (w|x|y|z). In meinem Fall musste ich einfach den ersten Wert von quat Array bis zum Ende verschieben und es funktionierte wie ein Zauber.

+2

Könnten Sie Code hinzufügen? Bitte. –

0

ich Teil dieser Frage beantworten kann.

Die Ausrichtung des Geräts hat keine Auswirkung auf die Sensorausgabe, da die Sensoren immer relativ zur Standardausrichtung des Geräts sind. Wenn Sie jedoch Zeichen auf dem Bildschirm zeichnen, z. B. einen Kompasspfeil, der nach Norden zeigt, müssen Sie die Geräteausrichtung berücksichtigen, da das Koordinatensystem der Zeichenfläche, auf der Sie zeichnen, gedreht wurde, wenn sich das Gerät nicht in der Position befindet Standardausrichtung

+0

Danke für Hilfe, jetzt bin ich sicher, dass ich auf diesen Teil aufpasste. – dima

2

Die obige Lösung hat mir nicht geholfen. Kam zum Entfernen SensorManager.getQuaternionFromVector(quat, vec); als docs Zustand, dass SensorManager.getRotationMatrixFromVector() fragt nach dem Rotationsvektor, der von ROTATION_VECTOR Sensor zurückgegeben wird.

private float[] rotationVectorAction(float[] values) 
{ 
    float[] result = new float[3]; 
    float vec[] = values; 
    float[] orientation = new float[3]; 
    float[] rotMat = new float[9]; 
    SensorManager.getRotationMatrixFromVector(rotMat, vec); 
    SensorManager.getOrientation(rotMat, orientation); 
    result[0] = (float) orientation[0]; //Yaw 
    result[1] = (float) orientation[1]; //Pitch 
    result[2] = (float) orientation[2]; //Roll 
    return result; 
} 
+0

Danke! Gute Arbeit! –