Jogo Tiro Ao Alvo - Etapa 4 - Final
Nesta terceira e última versão, foram aplicadas as texturas e feitas algumas pequenas correções.
Para manter o requisito de destaque para o alvo, ao invés de mudar a cor do prédio, foi colocada uma marcação na textura do piso onde se ele se encontra. Como a noite o piso não pode ser visualizado totalmente, o prédio ficará com as janelas todas acesas.
Foram feitas as seguintes melhorias/correções e funcionalidades:
- Aplicação de texturas em todos os objetos da cena
- Remoção de objetos desnecessários
- Remoção de métodos e arquivos fonte desnecessários
- Rearranjo da iluminação (diurna e noturna)
- Seleção correta do projétil. Agora, uma vez escolhido, só poderá ser mudado
após ele ter completado seu trajeto.
- Adição de um gramado e bancos de concreto no cenário
Para atender aos novos requisitos de texturização, foram criados novos métodos e alterados alguns já existentes na classe CGameCore. Os principais são:
Novos:
- ShowModelData ()
- Exibe na tela dados do arquivo de modelos:
Exibe na tela as características do
modelo tais como nome dos objetos, ID da textura, mapeamento, etc.
Este método apenas chama o método de mesmo nome
da classe CAux (ex CEngine). É um método auxiliar para a fase de
desenvolvimento/debug para verificar alguns dados dos objetos presentes no
arquivo tais como se o objeto está preparado para receber texturas, se está
mapeado, etc. além do respectivo nome.
Um detalhe: o mapa de texturas foi criado no próprio 3D Studio seguindo
os modelos conhecidos de mapa de texturas: Plano, Cilíndrico e Esférico. Para
os edifícios, foi escolhido o mapa Plano. Para o projétil, o Cilíndrico. Caso
não tivesse sido criado no 3D Studio, o mapa seria informado ao OpenGL através
da função glTexCoord2f()
que informa os limites max/min da textura na respectiva coordenada (s,t) de
acordo com os max/min do objeto que irá receber a textura. Esse processo é que
se chama mapeamento de texturas.
- LoadTextures ()
/ AssignTextures() - Carrega as texturas do jogo:
Faz a carga de todas as texturas para a
biblioteca OpenGL.
LoadTextures() faz a leitura enquanto que AssingTextures() faz a atribuição. O procedimento para a carga de uma textura no OpenGL é o seguinte:
1. Utilizar uma função para ler uma imagem e
convertê-la para bitmap (no nosso caso, utilizamos uma função da biblioteca de
funções auxiliares do OpenGL -
auxDIBImageLoad ()). No jogo, esta função
foi encapsulada pelo método LoadBMP
() (classe CAux) e utilizada pelo método
LoadTextures ()
2. Solicitar ao OpenGL para iniciar um vetor de
ID de texturas através da chamada de
glGenTextures (). No jogo, esta função
inicia o vetor com MAX_NUM_TEXTURES entradas.
3. Chamar a função glBindTexture () para informar no contexto do OpenGL essa textura.
4. Uma vez informado, chama-se glTexImage2D () que faz a passagem dos dados da imagem (lida conforme descrição acima) para o OpenGL.
5. Finalmente, fazer uso das técnicas de mapeamento de texturas através da função glTexParameteri (). Esta função oferece diversos modos de relacionamento entre o mapa de coordenadas das texturas (s, t) com o mapa de coordenadas dos objetos.
Para facilitar o uso dessa seqüência, LoadTexture() deve ser alterado a cada nova textura aplicada. Adiciona-se a linha correspondente à leitura do arquivo BMP da textura e adiciona-se a chamada de AssignTextures() para o ID correspondente.
- FlushTextures
() - Libera memoria usada na carga das texturas
Como a chamada de LoadTexture() faz
alocação dinâmica, foi criado esse método para liberar a memória utilizada
quando necessário.
OBS: Chamar glEnable(GL_TEXTURE_2D) no início para uso dessas função descritas.
Alterados:
- InitLighting
()
Uso de luzes cinza/branca e não
mais colorida já que estão sendo usadas texturas. Por causa do gramado, foi
adicionada uma nova luz para iluminar a região.
- CreateScenario () /
DrawPlane () / DrawBomb ()
Para utilizar as texturas, basta chamar
glBindTexture ()
com o ID da textura desejada antes da chamada de
DrawObject().
A chamada de
glBindTexture ()
informa ao OpenGL que as instruções seguintes de desenho de polígonos deverão
ser feitas utilizando a textura escolhida.
No caso de objetos que não devem ficar "no escuro", um material "self-illuminated"
foi escolhido.
Screenshots:
|
|
|
|
|
Fig. 6: Vista detalhada do projétil
|
- Código fonte (para
Microsoft C++ Visual Studio 6.0)
- Executável
Através do projeto, foi possível por em prática alguns dos tópicos dados em aula como transformações geométricas, cor, iluminação e texturização utilizando uma biblioteca de médio nível como o OpenGL.
Além da modelagem geométrica dos objetos, outro grande esforço durante a elaboração do jogo está na modelagem de comportamentos da natureza como quedas livres, colisões e outras características que não foram exploradas nesse jogo como efeitos de partículas, fumaça, iluminação volumétrica entre outros.
Foi possível entender como funciona o processo de texturização tanto do lado de código quanto do lado "artístico" no qual o realismo da cena está muito ligado com a qualidade da textura.
-
http://www.dca.fee.unicamp.br/courses/IA725/1s2006/calender.html - Notas
de aula da disciplina
-
http://www.dcc.ufla.br/~bruno/aulas/cg/monte-mor/index.htm
-
http://www.dca.fee.unicamp.br/courses/EA978/1s2003/proj/p1task5.html#demo
-
http://pyopengl.sourceforge.net/documentation/manual/index.html - Manual
de OpenGL
-
http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/ -
Manual de OpenGL