Ориентация датчика -> GLRotation не работает должным образом

Я хочу использовать данные датчика ориентации Android для моей камеры GLES, предоставив ей матрицу вращения. Я нашел очень хороший пример здесь:

Как использовать данные датчика onSensorChanged в сочетании с OpenGL

но это работает только с GL1.0, и мне нужно поработать над этим для GLES2.0. С моими шейдерами все работает, ручное перемещение камеры нормально. Но в тот момент, когда я использую матрицу вращения, как в примере, это не работает.

Я генерирую матрицу вращения с помощью:

SensorManager.getRotationMatrix(rotationMatrix, null, bufferedAccelGData, bufferedMagnetData);

Мое приложение работает в LANDSCAPe, поэтому я использую этот метод после (как в примере кода):

float[] result = new float[16];
SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, result);
return result;

Он отлично работал на моем телефоне в его коде, но не в моем. Мой экран выглядит так:

введите здесь описание изображения

Матрица поворота, кажется, повернута на 90° вправо (как будто я забыл переключиться на альбомную ориентацию для своей деятельности).

Я думал о неправильном использовании метода remap(), но в примере это имеет смысл, движение камеры теперь работает. Если я поворачиваю влево, то и экран поворачивается влево, хотя, так как все повернуто, он поворачивается "вверх" (по сравнению с землей, которая не внизу, а справа). Просто похоже, что я сделал стену вместо земли, но я уверен, что мои координаты подходят для вершин.

Я взглянул на метод рисования для GLSurface и не вижу, что я мог сделать здесь неправильно:

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
MatrixStack.glLoadMatrix(sensorManager.getRotationMatrix());  // Schreibt die MVMatrix mit der ogn. Rotationsmatrix
GameRenderer.setPerspMatrix(); // Schreibt die Perspektivmatrix Uniform für GLES. Daran sollte es nicht liegen.
MatrixStack.mvPushMatrix();
  drawGround();    
MatrixStack.mvPopMatrix();

Как я уже сказал, при ручном перемещении камеры все работает идеально. Итак, что не так с матрицей вращения, которую я получаю?


person Tobias Reich    schedule 31.07.2012    source источник
comment
кроме того, вот сообщение, которое, я думаю, похоже на мою проблему. Возможно, там его легче понять: 11739878" title="ориентация и android opengl с датчиком не работают так, как я ожидал"> stackoverflow.com/questions/9342283/   -  person Tobias Reich    schedule 31.07.2012


Ответы (3)


Ну да ладно, это была очень старая проблема, но теперь, когда я снова взглянул на код, я нашел решение. Имея телефон в альбомной ориентации, мне пришлось переназначить ось, используя

SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, R);

Но это все еще не вращало изображение - хотя сопоставление осей Y и -X работало нормально. Так что просто используя

Matrix.rotateM(R, 0, 90, 1, 0, 0);

Делает работу. Не очень красиво, но работает.

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

Надеюсь, это поможет, Тобиас

person Tobias Reich    schedule 04.06.2014

Если он (был) работает на конкретном телефоне, но не на вашем, я предполагаю, что версия Android может сыграть здесь роль. Мы столкнулись с проблемой в движке дополненной реальности mixare , когда вид с поверхности накладывается на вид с камеры. Учтите, что приведенная здесь информация может не относиться к вашему случаю, поскольку мы не используем OpenGL.

Современная версия Android вернет ориентацию по умолчанию, тогда как ранее по умолчанию была портретная. Вы можете проверить, как мы запрашиваем это, в классе совместимости. Затем эта информация используется для применения различных значений к вызову RemapCoordinateSystem проверьте строки 739 и далее в этом файле. Mixare также использует ландшафтный режим по умолчанию, поэтому я думаю, что наши значения для переназначения должны применяться и к вашему случаю. Как я сказал ранее, мы используем матрицы 3x3, так как мы не используем OpenGL, но я думаю, что то же самое должно быть и для матриц, совместимых с OpenGL.

person Daniele    schedule 31.07.2012
comment
Эй, спасибо за ваш ответ. Дело в том, что на моем устройстве он работает, но с OpenGL 1.0, но когда я просто поменял все на GL2.0 (GLES), он больше не работал (или просто повернул все изображение вправо). Я знаю об изменении ориентации. Поскольку я использую его только в альбомной ориентации, я сделал то же самое, что и вы: SensorManager.AXIS_X, SensorManager.AXIS_MINUS_Z, но, как вы можете видеть на скриншоте, внезапно все повернулось вправо... странно. Но спасибо за попытку хотя бы! :-) - person Tobias Reich; 03.08.2012
comment
О, и, кстати, я не думаю, что это проблема только GL2.0, поскольку здесь, похоже, та же проблема: stackoverflow.com/questions/9342283/ который сделан в GL1.1 :-( - person Tobias Reich; 03.08.2012
comment
Ну, у меня есть идея. На developer.android.com/reference/android/hardware/ находится упомянуто: оси не меняются местами при изменении ориентации экрана устройства. Так что я предполагаю, что это проблема. Кто-нибудь знает, как это изменить, поскольку у меня альбомный режим, а не портрет? Я хотел бы попробовать это. Большое тебе спасибо! - person Tobias Reich; 04.08.2012

Не торопитесь, поиграйте с матрицей ориентации, вы найдете столбец, который содержит полезные значения.

Помимо значений журнала для каждого столбца, посмотрите, какое из них полезно, попробуйте кватернионы, продолжайте играть со значениями, никогда не пробуйте код непосредственно в средстве визуализации, сначала проверьте значения.

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

person Patt Mehta    schedule 05.08.2012