Android-датчик ориентации для вращения 3D-куба - PullRequest
3 голосов
/ 31 марта 2011

Я пытаюсь сделать 3-dof контроллер с помощью телефона Android, похожий на Wiimote. Использует акселерометр для определения ориентации контроллера (для расчета используется метод getOrientation ())

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

Не зная компьютерной графики, я нашел ссылку, в которой говорится, что при вращении Эйлера конечная фигура трехмерного объекта зависит от порядка вращения по каждой оси. Это связано с проблемой ?? Если так, то каков правильный порядок? Текущий ордер "yaw-> pitch-> roll"

Я не думаю, что это из-за так называемой проблемы калибровки, так как изменения значения значительны.

Ответы [ 2 ]

1 голос
/ 30 января 2014

Датчик ориентации устарел. Лучший способ получить достоверные значения датчика - использовать датчик вектора вращения. Это программный датчик, который получает данные от аппаратных датчиков акселерометра и магнитометра.

Вектор вращения представляет ориентацию устройства в виде комбинации угла и оси, в которой устройство повернулось на угол θ вокруг оси (x, y или z). Следующий код показывает, как получить экземпляр датчика вектора вращения по умолчанию. См. информацию об этом датчике на Android Dev Site.

Это пример того, как использовать вектор вращения для получения надежных значений:

public void onSensorChanged(SensorEvent event) {
       if(sensor.getType()==Sensor.TYPE_ROTATION_VECTOR){
           float[] rotationMatrix = new float[16];
           SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values);
           SensorManager.getOrientation(rotationMatrix, mOrientValues);
           for(int i=0; i<3; i++)
              mOrientValues[i]=(float)
                  Math.toDegrees(mOrientValues[i])+180.0f;//orientation in degrees
}
0 голосов
/ 02 мая 2011

У меня была похожая проблема с getOrientation() возвратом странных результатов, когда телефон приближается к вертикальному положению, а калибровка не помогает.

Простое решение - использовать этот датчик:

manager = (SensorManager) context.getApplicationContext()
                                 .getSystemService(Context.SENSOR_SERVICE);
Sensor orientationSensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);`

Видимо, этоНа новых платформах датчик устарел, но все равно работает нормально.

...