Estou no estágio de desenvolvimento de jogos em que preciso criar um HUD ou GUI. Eu nunca cheguei a essa parte, então não sei como é feito. Tentei renderizar um quad simples em uma posição fixa na tela, mas há um problema. Para fazer minha câmera funcionar com ortografia, eu uso o seguinte:
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);
}
Não vejo como seria capaz de corrigir algo na tela usando esse método? Alguma maneira de contornar isso? Obrigado :)
([0...1], [0...1], 0, 1)
sem projeção, exibição ou matriz mundial, elas sempre aparecerão no espaço da tela.Respostas:
Isso é de um antigo mecanismo de jogo baseado em OpenGL que eu estava tentando escrever há cerca de sete anos, escrito em C ++ tão nu comigo, enquanto tentava explicar como lidei com o mundo 3D e as operações de renderização da GUI 2D dentro dele. Eu usei quatro métodos principais dentro da minha classe de renderizador OpenGL (OGLRender), dos quais são:
render2D () para o desenho real da GUI 2D.
E então, no loop principal do thread, eu basicamente chamava os métodos na seguinte ordem:
Então, o que estou fazendo é desenhar minha cena mundial em 3D primeiro e depois desenhar minha GUI por último, para que a GUI esteja sempre no topo da cena mundial. O método ready3D () prepara a projeção do mundo 3D para o desenho da cena mundial e o método ready2D () prepara a cena orto 2D pronta para o desenho da GUI.
m_Setup.width
em_Setup.height
são apenas as dimensões da tela da porta de visualização.O que há de especial no método ready2D () é que a
gluOrtho2D()
função é chamada com argumentos que informam que, quando desenhamos as primitivas da GUI, as desenhamos nas coordenadas da tela especificadas para corresponder ao Windows, Mac e outros sistemas de coordenadas da tela da área de trabalho. Como no canto superior esquerdo, é (0,0) no formato (X, Y), enquanto no canto inferior direito(ViewportWidth-1, ViewportHeight-1)
. EglTranslatef()
é usado para corrigir o posicionamento preciso por pixel. Assim, quando traçarmos uma linha de (0,0) a (0,9), a linha será realmente desenhada do canto superior esquerdo e direto para baixo, totalizando dez pixels de comprimento e largura de um pixel.No geral, você provavelmente só está interessado no que o método ready2D () está fazendo. Forneci os exemplos de código-fonte dos outros métodos para dar uma idéia geral de como a maioria dos jogos faz cena do mundo 3D e ordem de desenho da GUI.
fonte