0 votos

Tengo leido el dato del sensor con este código:

float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values);
// Remap the axes as if the device screen was the instrument panel,
// and adjust the rotation matrix for the device orientation.
switch (mWindowManager.getDefaultDisplay().getRotation())
{
  case Surface.ROTATION_0:
   default:{
       worldAxisForDeviceAxisX = SensorManager.AXIS_X;
       worldAxisForDeviceAxisY = SensorManager.AXIS_Z;
       break;}
   case Surface.ROTATION_90:{
       worldAxisForDeviceAxisX = SensorManager.AXIS_Z;
       worldAxisForDeviceAxisY = SensorManager.AXIS_MINUS_X;
       break;}
   case Surface.ROTATION_180:{
       worldAxisForDeviceAxisX = SensorManager.AXIS_MINUS_X;
       worldAxisForDeviceAxisY = SensorManager.AXIS_MINUS_Z;
       break;}
   case Surface.ROTATION_270:{
       worldAxisForDeviceAxisX = SensorManager.AXIS_MINUS_Z;
       worldAxisForDeviceAxisY = SensorManager.AXIS_X;
       break;}
}
float[] adjustedRotationMatrix = new float[9];
SensorManager.remapCoordinateSystem(rotationMatrix, worldAxisForDeviceAxisX, worldAxisForDeviceAxisY, adjustedRotationMatrix);
// Transform rotation matrix into azimuth/pitch/roll
float[] orientation = new float[3];
SensorManager.getOrientation(adjustedRotationMatrix, orientation);
float[] mQuaternion = new float[4];
SensorManager.getQuaternionFromVector(mQuaternion, orientation);

myglRender.q1 = mQuaternion[0];
myglRender.q2 = mQuaternion[1];
myglRender.q3 = mQuaternion[2];
myglRender.q4 = mQuaternion[3];

yaw = orientation[0] * -57.315f;
pitch = orientation[1] * -57.315f;
roll = orientation[2] * -57.315f;

pero el angulo Pitch cambia en este sentido: 0..90|90..0|0..-90|-90..0

y quiero poder llevarlo a una lectura de 0...360 grados.

preguntado por Hamlet Oct 20, 2017 en Android

1 Respuesta

0 votos

El pitch tiene un rango de -180 a 180 grados

Para traducirlo de 360 grados voy a suponer cuatro cuartos del círculo descrito por el giro:

  • 0 a 90: cuarto superior derecho. En 360 se traduce de 0 a 90
  • 90 a 180: cuarto inferior derecho. En 360 se traduce de 90 a 180
  • -180 a -90: cuarto inferior izquierdo. En 360 se traduce de 180 a 270
  • -90 a 0: cuarto superior izquierdo. En 360 se traduce de 270 a 360 (360 = 0)

Por tanto nos bastaría con hacer el módulo de 360 para convertir cualquier valor al rango 360. Fórmula en pseudocódigo:

pitchEn360 = pich % 360;

Información sobre el uso de módulo y ejemplos en https://jarroba.com/digito-de-control-deteccion-de-errores/

respondido por Ramon [Admin] Oct 28, 2017
Esá solución es más rápida que la expuesta en mi pregunta. Gracias por la respuesta. Puse el código y actualice el apk en el telefono, pero cuando el telefono gira los 90 grados, si desde un lado me da un rango entre -90 y 90 grados, del otro lado se repite la misma lectura entre -90 y 90 grados, al parecer esto tiene que ver con la rotación de la pantalla y hay que ternerla en cuenta. Es por eso que este angulo en el sensor de giro de los telefonos presenta solo estos valores.

Sinembargo las aplicaciones VR de google resuelven esto de alguna forma, al eejcutarlas giro el telefono los 360 grados y de alguna forma en el mundo virtual no hay perdida de orientación y puedes verlo patas arriba incluso, pero hay otras aplicaciones que no trabajan esto y al mirar 90 grados hacia arriba se pierde la orientación.

Donde puedo encontrar como lo hacen las app que manejan bien las vistas en 3D para no sufrir ese inconveniente y poder orientar la vista en el mundo virtual con ayuda del vector UP de la función de opengl llamada GluLookat?

Gracias.