OpenGl и QT координаты - PullRequest
       46

OpenGl и QT координаты

0 голосов
/ 11 июня 2018

когда я использую OpenGL в не-qt проекте и мне нравится рисовать линию, я использую этот код:

glMatrixMode(GL_PROJECTION);
glOrtho(0,500,0,500,-1,1);

glBegin(GL_LINES);
   glVertex(50, 50);
   glVertex2i(200,200);
glEnd();

когда я пытаюсь сделать это в qt (используя продвижение виджетов),эти цифры не точны.

, но если я использую:

glBegin(GL_LINES);
   glVertex2f(-0.5, 0.5);
   glVertex2f(1, 1);
glEnd();

, как я видел во многих уроках, я не писал здесь glOrtho и glMatrixMode

так почему в windows или linux координаты отличаются от qt и как правильно их использовать?

1 Ответ

0 голосов
/ 12 июня 2018

Прежде всего, обратите внимание, что матричный стек OpenGL и чертеж с последовательностями glBegin / glEnd устарели уже более 10 лет.Прочитайте о Конвейере фиксированных функций и посмотрите Спецификация вершины для современного способа рендеринга.


glOrtho Установите матрицу ортогональной проекции.Матрица проекции описывает отображение от трехмерных точек вида на сцене к двухмерным точкам в области просмотра.В ортогональной проекции координаты в пространстве вида линейно отображаются на координаты пространства отсечения, а координаты пространства отсчета равны нормализованным координатам устройства, поскольку компонент w равен 1 (для декартовой входной координаты).Значения слева, справа, снизу, сверху, близко и далеко определяют поле.Вся геометрия, которая находится внутри объема окна, «видна» в окне просмотра.

orthographic projection

Но glOrhto умножает текущую матрицу в стеке mtrix на новую матрицу ортографической проекции.

Это означает, что если вы делаете

glMatrixMode(GL_PROJECTION);
glOrtho(0,500,0,500,-1,1);

в каждом кадре, то матрица проекции будет непрерывно и постепенно изменяться

Чтобы установить матрицу в стек матрицы, матрицастек должен быть инициализирован сначала с помощью единичной матрицы:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,500,0,500,-1,1);

Еще одна возможность - использовать glPushMatrix и glPopMatrix в начале и в конце поднятия.Нажмите матрицу, прежде чем изменить ее, и вставьте ее после рендерингаПоскольку glOrtho меняет самую верхнюю матрицу в стеке матриц, glPopMtrix отменяет изменения.

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glOrtho(0,500,0,500,-1,1);

// do the rendering here

glPopMatrix();
...