Я нахожусь на стадии разработки игры, где мне нужно сделать HUD или GUI. Я никогда не дошел до этой части, поэтому я не знаю, как это делается. Я попытался отрендерить простой квад в фиксированной позиции на экране, но есть проблема. Чтобы заставить мою камеру работать с орфографией, я использую это:
public void lookThrough()
{
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(position.x, position.x + Display.getDisplayMode().getWidth()/zoom, position.y + Display.getDisplayMode().getHeight()/zoom, position.y, -1, 1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
}
Я не вижу, как я мог бы сделать что-то фиксированное на экране, используя этот метод? Есть ли способ обойти это? Благодарность :)
([0...1], [0...1], 0, 1)
без проекции, вида или матрицы мира, они всегда окажутся в пространстве экрана.Ответы:
Это от старого игрового движка на основе OpenGL, который я пытался написать около семи лет назад, написанного на C ++, настолько обнаженного, как я, пытаясь объяснить, как я справляюсь с операциями рендеринга 3D-мира и 2D-интерфейса в нем. В моем классе визуализации OpenGL (OGLRender) я использовал четыре основных метода:
render2D () для фактического чертежа 2D GUI.
А затем в цикле основного потока я бы просто вызывал методы в следующем порядке:
Итак, что я делаю, так это сначала рисую свою трехмерную мировую сцену, а затем в последний раз рисую свой графический интерфейс таким образом, чтобы графический интерфейс всегда был на вершине мировой сцены. Метод ready3D () готовит трехмерную проекцию мира к рисованию мировой сцены, а метод ready2D () готовит орто-сцену 2D для рисования в графическом интерфейсе.
m_Setup.width
иm_Setup.height
только размеры экрана просмотра порта.Что особенного в методе ready2D (), так это то, что
gluOrtho2D()
функция вызывается с аргументами, которые сообщают ей, когда мы рисуем примитивы GUI, мы рисуем их в координатах экрана, указанных для соответствия Windows, Mac и другим системам координат экрана рабочего стола. Например, верхний левый - (0,0) в формате (X, Y), а нижний правый -(ViewportWidth-1, ViewportHeight-1)
. ИglTranslatef()
используется для коррекции точного позиционирования на пиксель. Таким образом, когда мы рисуем линию от (0,0) до (0,9), тогда линия на самом деле будет рисоваться из верхнего левого и прямого вниз десяти пикселей общей длины и одного пикселя шириной.В целом вам, скорее всего, просто интересно, что делает метод ready2D () . Я предоставил примеры исходного кода других методов, чтобы дать вам общее представление о том, как большинство игр выполняют сцену в 3D мире и порядок отрисовки графического интерфейса.
источник