quarta-feira, 10 de novembro de 2010

Assimp, Blender, DevIL = Objeto renderizado com mapeamento UV usando OpenGL

Continuo buscando meios para fazer meu jogo. Já decidi algumas coisas, porém colocar todas as coisas juntas, escrever o código e fazer executar é a coisa mais difícil, ainda mais quando se está aprendendo todas as tecnologias necessárias para isso, no entanto é recompensador cada progresso feito.

Eu decidi que o Blender será meu editor, tendo em vista duas alternativas: escrever meu próprio editor ou utilizar um já disponível. Hoje em dia a quantidade de editores 3D é enorme, sendo que se eu fosse escrever um, até que este chegasse em um nível de maturidade aceitável levaria muito tempo, sendo assim optei por utilizar o Blender, que possui uma comunidade enorme a sua volta e é extensível através de plugins, permitindo customizá-los de forma a obter algumas das facilidade que é possível quando se usa um editor próprio, tal como verificar determinadas propriedades de uma cena criada.

O Blender oferece o suporte para realizar o unwrapping (abrir a malha) de um objeto, criando um mapa de textura UV. Nesta página você pode encontrar mais informações a respeito do que estou dizendo: http://www.blender.org/development/release-logs/blender-234/uv-unwrapping/. Este mapa pode ser exportado e editado em seu aplicativo de edição de imagens preferido.

No meu aprendizado eu fiz algo bem simples, abri a malha de um cubo e com o Gimp pintei cada face de uma cor. Após preparar esta textura voltei ao Blender e a apliquei ao cubo. Pronto, este era o objeto que eu queria renderizar em minha aplicação OpenGL, sendo assim exportei-a para o formato Collada 1.4 através do Blender.

Para carregá-la em minha aplicação utilizei a biblioteca Assimp. Apesar de muitos dizerem que escrever código para carregar um formato específico é bastante simples não queria me ater a esta tarefa, pois o principal motivo para fazê-lo é desempenho e eu por enquanto quero experimentar com as peças que podem me auxiliar e o mais rápido possível :).

Além da Assimp utilizei a bilbioteca DevIL que permite importar diversos formatos de arquivo para memória e serem utilizados como textura em uma aplicação OpenGL. Além disso a Assimp também importa todos os pontos do mapeamento UV, sendo possível dizer em quais locais determinados pontos da textura devem ser aplicados na malha do cubo.

Para fazer tudo isso rodar, ainda era necessário escrever o código para carregar o objeto e renderizá-lo na tela. Para facilitar a vida a biblioteca Assimp traz um código de exemplo: http://assimp.svn.sourceforge.net/viewvc/assimp/trunk/samples/SimpleOpenGL/, porém este não utiliza texturas. Um outro desenvolvedor criou um novo exemplo com suporte a texturas: http://assimp.svn.sourceforge.net/viewvc/assimp/trunk/samples/SimpleTexturedOpenGL/, porém apenas com suporte para compilar no Windows usando o Visual Studio, que eu não pretendo utilizar :). Eu fiz uma mistura dos dois alterando o primeiro exemplo e compilei no GNU/Linux, porém não vou publicar o código que escrevi, pois é algo simples e tenho certeza que você consegue fazer também :).

O resultado final? Olha aí que beleza!!!

Um passo de nada para a humanidade dos programadores de jogos, mas um grande passo para mim :P. Agora prentendo colocar dois cubos na minha tela, cada um girando para lados opostos, sendo que quero criar os dois cubos na mesma cena do Blender e tratá-los separadamente na aplicação (ou como um único objeto). Acredito que esta é uma forma interessante de representar objetos que durante a execução da aplicação possam ser quebrados.

Após isto quero adicionar suporte a princípios físico através da utilização da biblioteca Bullet. Após isto o céu é o infinito!!! Estarei bem armado para escrever meu jogo de Fórmula 1.