Я хочу использовать данные датчика ориентации 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();
Как я уже сказал, при ручном перемещении камеры все работает идеально. Итак, что не так с матрицей вращения, которую я получаю?