Каков хороший способ внедрения HCI в OpenGL? - PullRequest
1 голос
/ 02 апреля 2009

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

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

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

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

Ответы [ 4 ]

1 голос
/ 03 апреля 2009

Как указано здесь , вам нужно применить перевод 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. Нарисуй свой интерфейс
  6. Используйте glPushMatrix для восстановления ваших нажатых матриц (при условии, что вы их нажали)

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

1 голос
/ 02 апреля 2009

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

1 голос
/ 03 апреля 2009

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

Ознакомьтесь с этим отрывком , в частности, с заголовком "Projection Transformations".

1 голос
/ 02 апреля 2009

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

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

...