¿Cómo uso la orientación de la brújula de Android para apuntar una cámara opengl?

Estoy usando libgdx para desarrollar un juego básico en 3D para Android y estoy teniendo dificultades para orientar correctamente la cámara dados los tres ángulos de rotación proporcionados por la brújula (acimut - rotación sobre Z, giro - rotación sobre Y, inclinación - rotación sobre X ) He tenido un ligero éxito con el siguiente código, ya que puedo apuntar correctamente la cámara virtual hacia el eje Z y el eje X como esperaba. (Los ángulos están en grados [-180,180])

camera.direction.x = 0;
camera.direction.y = 0;
camera.direction.z = 1;
camera.up.x = -1;
camera.up.y = 0;
camera.up.z = 0;

camera.rotate(azimuth,0,0,1);
camera.rotate(roll,0,1,0);
camera.rotate(pitch,1,0,0);

También tuve cierto éxito con esto, pero no orienta el vector ascendente de la cámara. (Los ángulos se han convertido a radianes en esta versión)

float x,y,z;
roll = (float) (roll + Math.PI/2.0);
x = (float) (Math.cos(azimuth) * Math.cos(roll));
y = (float) (Math.sin(azimuth) * Math.cos(roll));
z = (float) (Math.sin(roll));
Vector3 lookat = new Vector3(x,y,z);
camera.lookAt(lookat.x, lookat.y, lookat.z);

Puede alguien arrojar algo de luz sobre cómo orientar adecuadamente la cámara virtual desde estos tres ángulos?

Además, estoy tratando de que el teléfono esté en modo horizontal, de modo que la parte superior del teléfono esté a la izquierda y la inferior a la derecha. Por lo tanto, la dirección predeterminada de la cámara (todas las rotaciones están en 0, la parte superior del teléfono apunta hacia el norte) sea la cámara apuntando hacia el suelo (Z positivo) con el apuntando hacia el este (X negativo).

Respuestas a la pregunta(1)

Su respuesta a la pregunta