Programação de jogos 3D
Programar um jogo 2D não é algo muito complexo, pois trabalhar com objetos em duas dimensões não exige muitos cálculos. Claro que existem exceções, mas, na maioria dos casos, a programação em um ambiente 2D é bem simples de fazer.
Programar um jogo 3D é um pouco mais complicado. Orientar um objeto em três dimensões não é simples de fazer, principalmente se for um objeto mais elaborado (diferente de um simples cubo, por exemplo). Este tipo de programação exige uma boa noção do que é trabalhar com três dimensões. É a mesma sensação que tive ao mexer pela primeira vez com um software de modelagem 3D; sua percepção tem que se adaptar ao ambiente 3D.
No semestre passado tive a matéria de programação 3D na pós-graduação. Por ter sido curta, não vi muitas coisas com a profundidade que gostaria, mas pelo menos a base eu tive. Nas aulas, utilizamos C++ com o Visual Studio 2005 e o DirectX SDK, que contém a biblioteca Direct3D para programação 3D.
Antes de começar a programar em 3D, é necessário entender como isto funciona. Todo o processo que gera um objeto em 3D na tela passa por uma Pipeline Gráfica no hardware. Cada estapa é responsável por uma propriedade que foi programada, como Iluminação, Textura, Projeção, Transformações, entre outros.
Na primeira aula, fiz um programar para desenhar 3 vetores, um em cada eixo (x, y e z), utilizando um array de vetores e a função DrawPrimitiveUP() para desenhar na tela. Também desenhamos um grid e os eixos. Esta foi a parte simples de fazer; a parte mais complicada é configurar o programa para funcionar, é um pouco trabalhoso, mas depois que a base está criada, podemos utilizá-la em vários outros projetos praticamente sem alterações, como foi o caso dos demais exercícios.
Depois, brincamos um pouco com a Pipeline Gráfica desenhando figuras geométricas coloridas e realizado translações. É o mesmo processo utilizado para desenhar os vetores, além doD3DXMatrixTranslation() para as translações.
Utilizamos um modelo 3D de um golfinho, fornecido pelo professor, para aprender como exibir um modelo 3D simples na tela. O modelo foi exportando na extensão .X, que é do DirectX, e desenhando na dela utilizando a função D3DXLoadMeshFromX(). Além deste função, existe uma configuração de Material *para que o objeto (Mesh) possa ser desenhado na tela com a função *DrawSubset() do mesh.
Além de modelos 3D, também utilizamos arquivos externos para Shaders. São arquivos .FX que contém efeitos que são aplicados em um objeto. A vantagem de utilizar este arquivo é que a configuração fica separada do código, e pode ser editada em softwares de criação de efeitos. O arquivo é carregado utilizando a função D3DXCreateEffectFromFile() e o efeito desejado é aplicado com a função SetTechnique() de uma variável do tipo LPD3DXEFFECT. Nesta mesma variável, a textura é aplicada com a função SetTexture().
No final desta matéria, tivemos que apresentar um projeto com um objeto 3D animado e um controlado pelo teclado. Não era obrigatório utilizar o Direct3D com C++ para isto, então utilizei XNA 3.1. Fiz um cubo com textura de dado, onde sua rotação é controlada pelo teclado, e uma esféra com shaders que fica girando em torno do dado.
Eu tive muita dificuldade em capturar eventos do teclado utilizando o Direct3D com C++, por isso resolvi utilizar o XNA. Com XNA eu já tinha feito algumas brincadeiras, porém apenas com 2D. Este projeto foi uma oportunidade para começar a programar em ambiente 3D no XNA, utilizando modelos exportados pelo Softimage XSI em extensão .X e a textura em um arquivo .JPG.
Alias, o dado que utilizei é exatamente o mesmo que modelei e apliquei textura na aula de modelagem 3D que tive no início do curso. Esta foi a melhor parte deste projeto, pois consegui exportar um modelo 3D que tinha feito no XSI (com textura feita no Photoshop) e utilizá-lo no XNA sem muitos problemas. A imagem da esfera também foi modelada no XSI com efeitos de shader, e utilizada no XNA.
A maior dificuldade que tive foi exibir os dois modelos na tela no tamanho correto, pois cada um tinha um tamanho diferente e para corrigir isto alterei o zoom pela programação, além de fazer suas animações nos 3 eixos. Trabalhar com modelos 3D no XNA é muito fácil, pois ele tem um tipo de variável que é perfeita para isto, a Model. Para desenhar na tela, criamos um objeto ModelMesh e podemos aplicar efeitos de shader com BasicEffect no mesh.
Conhecendo a teoria, tendo uma noção de modelagem 3D e programação no XNA com C#, não é muito difícil de programar 3D, é necessário apenas muita paciência para deixar tudo certo. Ainda não fiz um jogo em 3D, apenas essas brincadeiras, mas pretendo logo criar algo bem simples para aprender mais sobre isso. A programação 3D é bem complexa, mas pelo menos no XNA isso fica mais simples. Acho que não tive uma boa experiência com Direct3D e C++, mas este é mais motivo para continuar aprendendo C++.
Para os iniciantes em programação 3D, como eu, recomendo aprender as técnicas e aplicá-las no XNA, que é mais simples, e depois partir para o C++. E, embora eu seja programador, as aulas de modelagem 3D ajudaram muito! Por isso é sempre bom ter uma noção, pelo menos básica, de tudo que envolve o desenvolvimento de um game.