Каков хороший способ внедрения 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 */
Алгоритм прост:
- Нарисуйте свою 3D-сцену, предположительно, с включенным тестированием глубины.
- Отключите глубинное тестирование, чтобы ваши элементы графического интерфейса рисовали поверх 3D.
- Используйте glPushMatrix для хранения текущего представления модели и матриц проекции (при условии, что вы хотите восстановить их, в противном случае просто превзойти их)
- Настройте вид модели и матрицы проекции, как описано в приведенном выше коде
- Нарисуйте свой UI материал
- Используйте glPushMatrix для восстановления выдвинутых матриц (если вы их выдвинули)
Если сделать это так, положение камеры не будет иметь значения - фактически, когда камера перемещается, трехмерные детали будут работать как обычно, но наложение 2D остается на месте. Я ожидаю, что это поведение, которое вы хотите.
Вы также можете сделать все ваши 3D-рендеринга, затем переключиться на ортогональную проекцию и нарисовать все ваши объекты меню. Это было бы намного проще, чем положить все это на большой квадратный щит, как вы и предлагали.
Ознакомьтесь с этой выдержкой, в частности, с заголовком "Проекционные преобразования".
Для этого есть библиотека GLUI (без личного опыта)
Или, если вы используете Qt, есть способы прозрачного рендеринга виджетов Qt поверх модели OpenGL, также есть бета-версия для рендеринга всего Qt в opengl.