Каков хороший способ внедрения HCI в OpenGL?

Я хотел бы попробовать и реализовать некоторые HCI для моего существующего приложения OpenGL. Если возможно, меню должны отображаться напротив моей трехмерной графики, которая будет на заднем плане.

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

Пока меню активны, камера не может двигаться, поэтому камера не отводит взгляд от меню.

Звучит ли это кому-то далеко или я на правильном пути? Как бы все это сделали?

4 ответа

Решение

Я бы просто glPushMatrix, glLoadIdentity, сделай свой рисунок, тогда glPopMatrix и не беспокойтесь о том, где находится ваша камера.

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

Как указано здесь, вам нужно применить перевод 0,375 в x и y, чтобы получить идеальное выравнивание пикселей:

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, width, 0, height);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.375, 0.375, 0.0);
/* render all primitives at integer positions */

Алгоритм прост:

  1. Нарисуйте свою 3D-сцену, предположительно, с включенным тестированием глубины.
  2. Отключите глубинное тестирование, чтобы ваши элементы графического интерфейса рисовали поверх 3D.
  3. Используйте glPushMatrix для хранения текущего представления модели и матриц проекции (при условии, что вы хотите восстановить их, в противном случае просто превзойти их)
  4. Настройте вид модели и матрицы проекции, как описано в приведенном выше коде
  5. Нарисуйте свой UI материал
  6. Используйте glPushMatrix для восстановления выдвинутых матриц (если вы их выдвинули)

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

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

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

Для этого есть библиотека GLUI (без личного опыта)
Или, если вы используете Qt, есть способы прозрачного рендеринга виджетов Qt поверх модели OpenGL, также есть бета-версия для рендеринга всего Qt в opengl.

Другие вопросы по тегам