Как получить кватернион из матрицы вращения в Android? - PullRequest
2 голосов
/ 15 февраля 2012

Я пытаюсь получить ориентацию устройства Android, и мне нужно, чтобы он был в структуре кватерниона (float[4] в основном).

То, что у меня сейчас есть, это:

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
    last_acc = (float[])event.values.clone();
}
else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
    last_mag = (float[])event.values.clone();
}
if (last_acc != null && last_mag != null){
    SensorManager.getRotationMatrix(rotation, inclination, last_acc, last_mag);
    SensorManager.getOrientation(rotation, orientation);

В «вращении» у меня есть матрица вращения 4x4, а в ориентации у меня есть вектор с плавающей точкой [3], где у меня есть азимут, тангаж и крен.

Как мне теперь получить кватернион?

Ответы [ 2 ]

5 голосов
/ 16 февраля 2012

Я бы не использовал углы Эйлера (крен, наклон, рыскание), это в значительной степени ухудшает стабильность вашего приложения.

Что касается преобразования матрицы вращения в кватернион, Google говорит:

4 голосов
/ 21 сентября 2012

Если вы не возражаете против того, чтобы быть доступным только для API уровня 9 и выше, вы можете использовать Sensor.TYPE_ROTATION_VECTOR, который в любом случае возвращает кватернион единицы и экономит вам работу. Если задан массив длиной 3, значения будут равны векторной части кватерниона, удовлетворяющей sin(theta / 2) * u, где u - трехмерный единичный вектор. Если массив имеет длину 4, четвертое значение будет скалярным значением единицы кватерниона, cos(theta / 2).

http://developer.android.com/reference/android/hardware/SensorEvent.html#values

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...