Обороты Android opengl с использованием данных датчиков

Я пытаюсь создать приложение Augmented Reality с представлением opengl поверх предварительного просмотра камеры. Я получил предварительный просмотр камеры и просмотр opengl, я собираю данные датчиков из диспетчера датчиков, а затем создаю матрицу поворота, чтобы применить ее к моему представлению opengl. Все идет нормально. Я использую только ориентацию ландшафтного телефона. Но вот моя проблема:

Я использую матрицу вращения от датчиков, применяю ее к opengl, а затем я хочу нарисовать модели, которые находятся в постоянном движении вокруг (0,0,0) точки. Но когда я поворачиваю свой телефон, я могу, конечно, следить за движением объектов, но когда я меняю направление (предположим, что я поворачиваю свой телефон в правильном направлении, а затем меняю его на противоположное - влево. В этот момент мой объект должен двигаться по его пути, но он остается на месте и немного отходит назад.

Мой код и экран с телефона:

 private float[] rotationMatrix = new float[16];

onDrawFrame:
moveObjects(smoothedDeltaRealTime_ms);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glMultMatrixf(rotationMatrix, 0);
gl.glRotatef(90.0f, 1f, 0f, 0f);
drawObjects(gl);

 @Override
public void onSurfaceChanged(GL10 gl, int width, int height) {

    ArOpenGlLogger.info("onSurfaceChanged " + width + "x" + height);

    this.screenWidth = width;
    this.screenHeight = height;

    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//Set color's clear-value 
    gl.glClearDepthf(1.0f);//Set depth's clear-value to farthest
    gl.glEnable(GL10.GL_DEPTH_TEST);  //Enables depth-buffer for hidden surface removal
    gl.glDepthFunc(GL10.GL_LEQUAL);     //The type of depth testing to do

    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();

    GLU.gluPerspective(gl, 45.0f, (float) width/(float) height, 0.1f, 100.0f);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();

    gl.glShadeModel(GL10.GL_SMOOTH);   //Enable smooth shading of color
    gl.glDisable(GL10.GL_DITHER);  //Disable dithering for better performance
    gl.glEnable(GL10.GL_TEXTURE_2D);   //Enable texture
}

  protected void draw(GL10 gl) {

    //loading textures
    if(!isTextureLoaded) loadTexture(gl);

    gl.glTranslatef(translation.getX(), translation.getY(), translation.getZ());
    gl.glScalef(scale.getX(), scale.getY(), scale.getZ());

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);  
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, vertices.length/3);

    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

}

Датчики:

  rootMeanSquareBuffer(bufferedAccelerometrData, accelerometrData);
        rootMeanSquareBuffer(bufferedMagneticFieldData, magneticFieldData);
        SensorManager.getRotationMatrix(rotationMatrix, null, bufferedAccelerometrData, bufferedMagneticFieldData);

        if(deviceOrientation == ORIENTATION_LANDSCAPE) {

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

            sensorCallback.onNewRotationMatrix(result);
        }
        else sensorCallback.onNewRotationMatrix(rotationMatrix);

  private void rootMeanSquareBuffer(float[] target, float[] values) {

      final float amplification = 200.0f;
      float buffer = 20.0f;

      target[0] += amplification;
      target[1] += amplification;
      target[2] += amplification;
      values[0] += amplification;
      values[1] += amplification;
      values[2] += amplification;

      target[0] = (float) (Math.sqrt((target[0] * target[0] * buffer + values[0] * values[0])/(1 + buffer)));
      target[1] = (float) (Math.sqrt((target[1] * target[1] * buffer + values[1] * values[1])/(1 + buffer)));
      target[2] = (float) (Math.sqrt((target[2] * target[2] * buffer + values[2] * values[2])/(1 + buffer)));

      target[0] -= amplification;
      target[1] -= amplification;
      target[2] -= amplification;
      values[0] -= amplification;
      values[1] -= amplification;
      values[2] -= amplification;
}

Screen from device: http://i.imgur.com/JJIyohL.png

4
nl ja de
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

pro.graphon (and gamedev)
pro.graphon (and gamedev)
389 участник(ов)

Обсуждаем стандарты консорциума Khronos: OpenGL, OpenCL и пр., предлагаем различные работы, туторы, интересные материалы по этим стандартам (и помечаем их тегами). Правила чата и инфо по системе тегов – /rules. Реклама только по согласованию с @AlexFails.

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)