Сцена медленно вращается

В моем GLSurfaceView.Renderer я рисую свою сцену в двух частях. Первая группа смещена и повернута, а вторая выровнена с «камерой», поэтому я применяю glRotate и glTranslate, а затем применяю точные противоположные glTranslate и glRotate. На некоторых устройствах это работает отлично, но на других, вся сцена медленно вращается с «центра».

Images: At start and After ~5 mins

Вот функция onDraw ():

@Override
public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

   //rotate card table
    gl.glRotatef(-20f, 1f, 0f, 0f);
    gl.glRotatef(  5f, 0f, 1f, 0f);
    gl.glRotatef(-10f, 0f, 0f, 1f);
    gl.glTranslatef( 1f, 3f, 0f);

    mDeck.draw(gl);

   //undo rotate for buttons/overlays
    gl.glTranslatef(-1f, -3f, 0f);
    gl.glRotatef( 10f, 0f, 0f, 1f);
    gl.glRotatef( -5f, 0f, 1f, 0f);
    gl.glRotatef( 20f, 1f, 0f, 0f);

    mOverlayBtns.draw(gl);
    mPass.draw(gl);
}

The full source can be found on GitHub, here.

Есть ли что-то очевидное, что мне не хватает? Есть ли лучший способ справиться с вращением, а затем вернуться назад?

До сих пор я заметил эту проблему:

  • Nexus 4
  • HTC Sensation
  • Другой телефон LG, имя которого я не могу запомнить

Эти устройства не показывают проблемы:

  • Galaxy Nexus
  • Nexus 7
  • Xoom
0
nl ja de

2 ответы

Ваш код применял набор аффинных преобразований в каждом кадре, проблема в том, что каждое преобразование является накопительным, поэтому вы применяете преобразование снова и снова. Вам либо необходимо сбросить текущую загруженную матрицу MODELVIEW, используя glLoadIdentity ( http: //www.khronos.org/opengles/sdk/1.1/docs/man/glLoadIdentity.xml ) или нажмите текущую матрицу, загрузите новую матрицу, нарисуйте, а затем поместите матрицу назад (как вы делали в ваш исправление).

Я бы поставил glLoadIdentity в начале каждого кадра. Кроме того, с вашим исправлением, я бы тоже сделал это:

gl.glPushMatrix();

gl.glLoadIdentity();//Be sure we start clean

// rotate card table
gl.glRotatef(-20f, 1f, 0f, 0f);
gl.glRotatef(  5f, 0f, 1f, 0f);
gl.glRotatef(-10f, 0f, 0f, 1f);
gl.glTranslatef( 1f, 3f, 0f);

mDeck.draw(gl);

gl.glPopMatrix();

Надеюсь, это поможет.

1
добавлено

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

Вместо того, чтобы вращать сцену, а затем поворачивать назад, я могу использовать glPushMatrix и glPopMatrix, чтобы изолировать две группы. Таким образом, группа glTranslate и glRotate для перемещения сцены назад не нужна.

@Override
public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);


    gl.glPushMatrix();

   //rotate card table
    gl.glRotatef(-20f, 1f, 0f, 0f);
    gl.glRotatef(  5f, 0f, 1f, 0f);
    gl.glRotatef(-10f, 0f, 0f, 1f);
    gl.glTranslatef( 1f, 3f, 0f);

    mDeck.draw(gl);

    gl.glPopMatrix();


    gl.glPushMatrix();
   //undo rotate for buttons/overlays
   //gl.glTranslatef(-1f, -3f, 0f);
   //gl.glRotatef( 10f, 0f, 0f, 1f);
   //gl.glRotatef( -5f, 0f, 1f, 0f);
   //gl.glRotatef( 20f, 1f, 0f, 0f);

    mOverlayBtns.draw(gl);
    mPass.draw(gl);

    gl.glPopMatrix();
}
0
добавлено
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 участник(ов)