3

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

How to use onSensorChanged sensor data in combination with OpenGL

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

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

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

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

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

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

матрица

enter image description here

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

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

Я посмотрел ATH методом жеребьевки для 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(); 

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

+0

к тому же здесь пост, который выглядит liky моей проблемы, я думаю. Возможно, его легче понять там: http://stackoverflow.com/questions/9342283/orientation-and-android-opengl-with-sensor-not-working-the-way-i-expected/11739878#11739878 –

ответ

1

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

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

Но это еще не провернуть изображение - даже при том, что отображение Y и оси -й работало отлично. Поэтому просто используя

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

Выполняет эту работу. Не очень хорошо, но это работает.

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

Надеется, что это помогает, Tobias

0

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

Современная версия андроида вернет ориентацию по умолчанию, тогда как ранее портрет был по умолчанию. Вы можете проверить, как мы запрашиваем это в Compatibility class. Эта информация затем используется для применения различных значений к вызову RemapCoordinateSystem check lines 739 and onwards of this file. Mixare также использует ландшафтный режим по умолчанию, поэтому я думаю, что наши значения для переназначения также должны применяться к вашему делу. Как я уже говорил, мы используем матрицы 3x3, так как мы не используем OpenGL, но я думаю, что это должно быть одинаковым для совместимых с OpenGL матриц.

+0

Привет, спасибо вы за свой ответ. Дело в том, что оно работает на моем устройстве, но с OpenGL 1.0, но когда я просто изменил все на GL2.0 (GLES), он больше не работал (или просто повернул все изображение вправо). Я знаю об изменении ориентации. Поскольку я использую его только в Landscape, я делал то же самое: SensorManager.AXIS_X, SensorManager.AXIS_MINUS_Z, но, как вы можете видеть на скриншоте, внезапно все повернуто вправо ... странно. Но спасибо за попытку хотя бы! :-) –

+0

О, и, кстати, я не думаю, что это только проблема с GL2.0, так как это похоже на ту же проблему: http://stackoverflow.com/questions/9342283/orientation-and-android- opengl-with-sensor-not-working-the-way-i-expected/11739878 # 11739878, который сделан в GL1.1 :-( –

+0

Ну, у меня есть идея. На http://developer.android.com /reference/android/hardware/SensorEvent.html упоминается: «Оси не меняются местами, когда меняется ориентация экрана устройства». Поэтому я предполагаю, что это проблема. Кто-нибудь знает, как изменить это, поскольку у меня есть режим ландшафта а не портрет? Я бы хотел попробовать. Большое спасибо! –

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^