04 Jun, 2010 19:43

Exibindo conteúdo tridimensional modelado no iPhone

teapot

A grande questão é que essa chaleira não é carregada de um arquivo que foi modelado em alguma ferramenta, como o Maya ou o Blender. Ela é um array de vértices e de vetores normais escritos em um arquivo.h e importados pelo Objective-c, onde esse array é iterado e cada vértice desenhado é na mão no código do OpenGL:

arquivo .h

Um ponto importante é que o iPhone não usa o OpenGL normal, por ser um dispositivo móvel com processamento limitado, ele usa uma versão mais simplificada do mesmo, chamada de OpenGL ES. No OpenGL ES todos os objetos tridimensionais são desenhados como um conjunto de triângulos e estes triângulos por sua vez são formados por 3 vértices (ou pontos) e possuem apenas um lado visível (para diminuir o processamento), sendo que o lado que não fica visível geralmente é o de dentro dos objetos.

Fato que desenhar objetos complexos com triângulos via código seria uma missão muito complicada, e esse é o objetivo desse post: demonstrar como podemos transformar objetos modelados em ferramentas profissionais em um arquivo .h com os vértices dos triângulos que compõem um objeto e que sejam compatíveis com o OpenGL ES.

Primeira tentativa: obj2opengl

A minha primeira tentativa em fazer essa conversão foi usando o script em Perl descrito nesse link. A proposta é ótima! Usando uma ferramenta de modelagem, nós exportamos o objeto desejado para o formato Wavefront (.obj), tomando sempre o cuidado de transformar os objetos que serão exportados para triângulos antes (as próprias ferramentas tem suporte pra isso). Depois, basta rodar o script, que pode ser baixado nesse link, passando o arquivo .obj como parâmetro que ele gera o arquivo.h para você:

./obj2opengl.pl objetoModelado.obj

Os primeiros testes (com cubos modelados) foram um sucesso. Foi quando eu achei que havia achado a solução do problema, então comecei a modelar objetos mais complexos. Foi aí os erros começaram a aparecer. Notei que essa solução não estava funcionando bem em modelagens mais complexas com vários objetos, texturas e tudo mais. Algumas vezes ela dava um erro de divisão por zero e em outras apresentava erros na exibição do objeto final.

A solução: Script do Blender

Então procurando pela internet, achei mais uma solução, do Jeff Lamarche, aliás eu já conhecia o Jeff por causa de uma série de posts ótima que eu havia lido dele, explicando passo a passo o OpenGL ES no iPhone. A solução que ele desenvolveu foi um script em Python que funciona direto do Blender (como se fosse um plugin) e permite que você exporte seus objetos diretamente para os arquivos headers que são recomendados pela Apple no OpenGL ES do iPhone.

Dessa vez os testes foram ótimos, todos os objetos modelados foram exportados com sucesso, inclusive o Jeff lançou uma atualização para o seu script que já converte os objetos para triângulos diretamente e também captura as informações de textura dos mesmos, que na versão anterior tinham que ser inseridas no código depois da importação.

Para ilustrar, criei um exemplo com o conhecido macaco do Blender rodando no openGL do iPhone:

macaco do blender no iphone

Quem tiver uma solução alternativa, sinta-se livre para comentar! :)

Ao navegar neste site, você consente o uso de cookies nossos e de terceiros, que coletam informações anônimas e são essenciais para melhorar sua experiência em nosso site.