2016-02-03 2 views
0

Я пытаюсь прочитать физическую ориентацию устройства android по сравнению с конкретным началом вращения, но я не могу получить от него правильное вращение, независимо от того, какой датчик я использую , Я инициализировать датчик, как это:Данные о физическом вращении устройства Android

mySensorManager.GetDefaultSensor(SensorType.RotationVector); 

Я пытался читать «ценности» о событии SensorChanged, как X, Y, Z на индекс 0, 1 и 2. Это было дать некоторые цифры, которые изменились, как я но я не могу понять, как я могу получить вращательное значение вокруг определенной оси.

Я развиваюсь на планшете в портретном режиме. Это должно по-прежнему работать, даже если планшеты обычно находятся в ландшафтном режиме. Вот почему я убежден, что именно поэтому показания, которые он сообщает, не являются простыми 0,0,0, но более вероятно, что-то вроде 90,0,0.

Это нелегкая проблема для объяснения (частично потому, что я не уверен, что даже понимаю ее полностью), и как таковой еще более сложная проблема. Поэтому в основном я задаю этот вопрос в надежде, что кто-то там столкнулся с похожим сценарием и, возможно, сможет мне помочь.

Или, возможно, просто гениальный математик 3D-вектор, который хочет потратить несколько минут на случайный вопрос.

Примечание:

Если значения, сообщаемые устройства действительно отчитывается различные значения, в зависимости от того, является ли это телефон или планшетный ПК, я действительно ценю решение, которое обрабатывает и выдает значение это одинаково для всех устройств. Конечно, любой ввод приветствуется.

+0

Посмотрите на этот код https://bitbucket.org/jskripkauskas/mobilesensors немного устаревший, хотя он может несколько помочь вам. Взгляните на «MainActivity» для показаний датчиков и TimerTask внутри него для расчета угла (хотя здесь применяются плавные показания датчика вместо вектора вращения на 3D-модели. – JuliusScript

ответ

0

Так после того, как много копаться, а некоторые портирования Java кода, мне удалось заставить его работать, используя код из этого BlogPost: Using orientation sensors: Simple Compass sample

Вот как мой SensorChanged метод в конечном итоге ищет:

private float[] mGravity; 
    private float[] mGeomagnetic; 
    public void OnSensorChanged(SensorEvent e) 
    { 
     if (e.Sensor.Type == SensorType.Accelerometer) 
      this.mGravity = e.Values.ToArray(); 
     if (e.Sensor.Type == SensorType.MagneticField) 
      this.mGeomagnetic = e.Values.ToArray(); 
     if (this.mGravity != null && this.mGeomagnetic != null) 
     { 
      float[] R = new float[9]; 
      float[] I = new float[9]; 
      bool success = SensorManager.GetRotationMatrix(R, I, this.mGravity, this.mGeomagnetic); 
      if (success) 
      { 
       var orientation = new float[3]; 
       SensorManager.GetOrientation(R, orientation); 

       var rotation = new Vector3(orientation[0], orientation[1], orientation[2]); 
       this.ReadingReceived?.Invoke(this, rotation); 
      } 
     } 
    } 
Смежные вопросы