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.

Pipiline Gráfica do DirectX

Pipiline Gráfica da Direct3D

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.

Eixos desenhados utilizando DrawPrimitiveUP()

Eixos desenhados utilizando DrawPrimitiveUP()

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.

Figuras geométricas desenhadas e com translação

Figuras geométricas desenhadas e com translação

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.

Modelo 3D de golfinho e pirâmides de vetores desenhados na tela

Modelo 3D de golfinho e pirâmides de vetores desenhados na tela

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().

Modelo com Shaders e textura

Modelo com Shaders e textura

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.

Dado com textura e esfera animada utilizando XNA

Dado com textura e esfera com shaders - animadas utilizando XNA

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.


  1. Guilherme says:

    Velho muito maneiro seu post gosto muito de 3D e tenho um conhecimento muito bom no Blender 3D no qual só modelo já tem um ano então decidi fazer um game 3D a sua explicação sobre as ferramentas são muito boas e por sorte tenho uma leve experiência em programar com C# então decidi baixar o XNA e aprender com alguns cursos e livros, depois parto pro DirectX valeu mesmo!!

Leave a Reply