1

Исходя из фона iOS, я начинаю видеть некоторые из наиболее интересных частей Android, таких как поддержка устройств для датчиков и даже вызовов OpenGL.Android: вращение 3D-объекта на основе датчиков: TYPE_ROTATION_VECTOR vs TYPE_ACCELEROMETER

Я использую Sensor.TYPE_ROTATION_VECTOR в Android для поворота объекта в 3D-пространстве на основе устройства. Отлично работает на Nexus 7 (2012) без проблем. Тем не менее, любое другое устройство (Nexus 5, HTC sensation, Terga Note) скачет так же, как и его скорость.

Это был тот же самый результат я получил, когда я просто использовал Sensor.TYPE_ACCELEROMETER

Кто-нибудь есть какие-либо советы, код или что-либо о получении гладкой (на большинстве устройств) значение датчика.

Override 
    public void onSensorChanged(SensorEvent event) { 

     int type = event.sensor.getType(); 

     //Log.i("TAG", "Sensor " + type); 

     // It is good practice to check that we received the proper sensor event 
     if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { 
      //lowPass(event.values.clone(), MagneticFieldValues_last); 

      // Convert the rotation-vector to a 4x4 matrix. 
      SensorManager.getRotationMatrixFromVector(mRotationMatrix, 
        event.values); 

      SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, mRotationMatrix); 
      SensorManager.getOrientation(mRotationMatrix, orientationVals); 

      Matrix.multiplyMV(orientationVector, 0, mRotationMatrix, 0, sZVector, 0); 
      orientation = (float) (-Math.atan2(orientationVector[0], orientationVector[1]) * RADIANS_TO_DEGREES); 

      Matrix.invertM(mRotationMatrix_inv, 0, mRotationMatrix, 0); 
      Matrix.multiplyMV(azimuthVector, 0, mRotationMatrix_inv, 0, sZVector, 0); 
      azimuth = (float) (180 + Math.atan2(azimuthVector[0], azimuthVector[1]) * RADIANS_TO_DEGREES); 

      // Optionally convert the result from radians to degrees 
      orientationVals[0] = (float) Math.toDegrees(orientationVals[0]); 
      orientationVals[1] = (float) Math.toDegrees(orientationVals[1]); 
      orientationVals[2] = (float) Math.toDegrees(orientationVals[2]); 

     } 


     if (type == Sensor.TYPE_MAGNETIC_FIELD) { 

      pitch = event.values[2] * axisSwapper; 
     } 
    } 

Я использовал фильтр нижних частот, однако на Nexus 7 он не требовался и, похоже, не работал.

// protected float[] lowPass(float[] input, float[] output) { 
//  if (output == null) return input; 
// 
//  for (int i=0; i<input.length; i++) { 
//   output[i] = output[i] + ALPHA * (input[i] - output[i]); 
//  } 
//  return output; 
// } 

ответ

0

Я нашел переезд в Google Cardboard для отслеживания головы, чтобы все просто работало! действительно легко реализовать. Скопировано

https://github.com/MasDennis/RajawaliVR

Смежные вопросы