Я должен вычислить вектор вращения из данных, которые я получаю от Датчика. TYPE_ORIENTATION.
Данные датчика определяются как это:
Мне нужны все три значения как значение оси Z (от 0 до 360 градусов). Я попробовал много, но фигура наклона, как сделать этот:/
(редактирование: Для наблюдения идеи позади в рабочем коде смотрят на класс ActionWithSensorProcessing платформы DroidAR там, Вы видите, как различные типы событий могут быть обработаны.)
я также пытался использовать Датчик. TYPE_ACCELEROMETER и Датчик. TYPE_MAGNETIC_FIELD для вычисления этого 3-го вектора самостоятельно. вот код:
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)
Но это не работало, и я думаю, что это очень к сложному. Таким образом, я держал пари, что существует простое решение как к recalc значения ensor. TYPE_ORIENTATION для создания их 3-м вектором вращения но я просто не знаю, как сделать это. Если Вы знаете ответ, скажите мне.
Править: я должен добавить, что хочу передать туда значения 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 матрицы, но я думаю, что должно быть более легкое решение (?)
Хорошо, теперь у меня есть решение, вы должны выполнить ротацию openGl в следующем порядке:
gl.glRotatef(values[2], 0, 1, 0);
gl.glRotatef(values[1], 1, 0, 0);
gl.glRotatef(values[0], 0, 0, 1);
используйте это в сочетании с SensorManager.getOrientation, и он будет работать. если кто-то знает, как это сделать с данными Sensor.TYPE_ORIENTATION, дайте мне знать.
Это должно работать (с использованием входов Sensor.TYPE_MAGNETIC_FIELD и Sensor.TYPE_ACCELEROMETER)
switch (event.sensor.getType()) {
case Sensor.TYPE_MAGNETIC_FIELD:
magnitude_values = event.values.clone();
sensorReady = true;
break;
case Sensor.TYPE_ACCELEROMETER:
accelerometer_values = event.values.clone();
}
if (magnitude_values != null && accelerometer_values != null && sensorReady) {
sensorReady = false;
float[] R = new float[16];
float[] I = new float[16];
SensorManager.getRotationMatrix(R, I, this.accelerometer_values, this.magnitude_values);
float[] actual_orientation = new float[3];
SensorManager.getOrientation(R, actual_orientation);
}
Поместите этот conde в свой onSensorChanged. В actual_orientation у вас будет вектор, указывающий на север относительно вашего фактического положения.
если вы хотите определять север с точки зрения камеры, вам нужно изменить последнюю строку кода следующим образом
float[] outR = new float[16];
SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR);
SensorManager.getOrientation(outR, actual_vals);