Мне нужно вычислить вектор вращения из данных, которые я получаю от Sensor.TYPE_ORIENTATION.
Данные датчика определяются следующим образом:
- значения должны быть пересчитаны, чтобы стать правильной трехмерной позицией: значения [0]: азимут, угол между магнитным северным направлением и осью Y, вокруг оси Z (от 0 до 359). 0 = север, 90 = восток, 180 = юг, 270 = запад
- значения 1 : шаг, вращение вокруг оси X (от -180 до 180), с положительными значениями, когда ось z перемещается в направлении оси y.
- значения [2]: крен, вращение вокруг оси Y (от -90 до 90), с положительными значениями, когда ось x отходит от оси z
Мне нужны все три значения, такие как значение оси Z (от 0 до 360 градусов). Я много пробовал, но не могу понять, как это сделать: /
(правка: Чтобы увидеть идею, лежащую в основе рабочего кода, взгляните на класс ActionWithSensorProcessing DroidAR framework , где вы можете увидеть, как могут обрабатываться различные типы событий.)
Я также попытался использовать Sensor.TYPE_ACCELEROMETER и Sensor.TYPE_MAGNETIC_FIELD, чтобы рассчитать этот 3d вектор самостоятельно. вот код:
final float[] inR = new float[16];
// load inR matrix from current sensor data:
SensorManager.getRotationMatrix(inR, null, gravityValues, geomagneticValues);
float[] orientation = new float[3];
SensorManager.getOrientation(inR, orientation);
mapMagAndAcclDataToVector(orientation); //here i do some *360 stuff
orientetionChanged(orientation); //then the correct values are passed (in theorie)
Но это не сработало, и я думаю, что это очень сложно.
Держу пари, что есть простое решение, как пересчитать значения ensor.TYPE_ORIENTATION, чтобы сделать их вектором вращения 3d, но я просто не знаю, как это сделать. Если вы знаете ответ, пожалуйста, скажите мне.
EDIT:
я должен добавить, что я хочу передать туда значения в OpenGL, чтобы выровнять его по оси следующим образом:
gl.glRotatef(values[1], 1, 0, 0);
gl.glRotatef(values[2], 0, 1, 0);
gl.glRotatef(values[0], 0, 0, 1);
но из-за странных диапазонов значений я, очевидно, не могу этого сделать. та же проблема с
значения из SensorManager.getOrientation, потому что они тоже переворачиваются при прохождении линии горизонта ..
другим решением было бы вычисление углов с использованием матрицы inR, но я думаю, что должно быть более простое решение (?)