Carregador Wavefront * .obj em C ++

7

Estou criando um jogo usando OpenGL (via SDL) e C ++ (via Visual Studios 2010 Professional). Durante o jogo, eu vou usar animação de personagens 3D. Eu gostaria de usar arquivos wavefront * .obj para todos os modelos 3D (com exceção do terreno). Os personagens precisarão ter movimentos fluentes (realistas), com 250 a 500 quadros (para caminhar, correr, correr, pular, agachar-se, engatinhar etc.). Gostaria de usar o md2 ou o md3, mas a ferramenta de modelagem / animação 3D que vou usar (Blender 3D 2.57) não oferece suporte a nenhum dos dois. O jogo só estará rodando no Windows.

O que preciso é de um pequeno e poderoso * .obj loader e analisador que suporte animação. Ele deve ser escrito em C ++ e ser utilizável pelo SDL.

obrigado

Tudo bem, depois de examinar todos os formatos de arquivo para os quais o Blender pode exportar ... Decidi usar o 3DS porque ele produz o menor formato de arquivo quando exporto o cubo padrão. Obrigado @Daniel Por recomendar o 3DS!

Joshua Vega
fonte
Você pesquisou no Google? Libobj vem à mente.
Deceleratedcaviar
Você tem certeza que o .obj suporta animações?
@ Christian Rau: não no núcleo, mas você pode exportar todos os quadros da animação como arquivo .OBJ separado.
Amir Zadeh

Respostas:

5

O OBJ não suporta animação, para mais informações leia isso .

Para um carregador de objetos compatível, lib-obj vem à mente.

Se você deseja fazer a mistura caseira e pode garantir que o arquivo contenha apenas triângulos; sem quads, etc, a análise de um OBJ é arbitrária (seu único texto!):

        char prefix[10] = {0};
        stream >> prefix;

        switch (prefix[0]) {
            case 'v' : {
                switch (prefix[1]) {
                    case 't' : {} break; // texcoords
                    case 'n' : {} break; // normals
                    default : { // points
                        float x, y, z;
                        stream >> x >> y >> z;
                        // put in a mesh etc
                    }
                }
            } break;
            case 'f' : {
                unsigned short a, b, c;
                stream >> a >> b >> c;

                // etc
            } break;
            default : {} // skip
        }
    }

Em caso de dúvida, consulte a especificação .

deceleratedcaviar
fonte
Eu usaria lib-obj ou homebrew one, mas realmente preciso da animação. Você conhece um exportador de arquivos md2 ou md3 para o blender 2.57? Eu adoraria usar um desses ...!
Existe algum motivo para MD2 ou MD3? Existem outros formatos que podem suportar animação. Talvez veja o formato 3DS?
Deceleratedcaviar
MD2 e MD3 são formatos respeitados e muito populares. Eu nunca ouvi falar do 3DS e não sei nada sobre isso. Vou dar uma olhada ... Obrigado.
2
@jsvcycling: Em que década você mora? MD2 e MD3 são da década de 1990. Atualmente, usamos formatos como o OpenCTM ou similar. Hoje, um modelo não consiste apenas em posição de vértice, coordenada normal e textura. Existem grupos de vértices, pesos ósseos, atributos adicionais, etc. MD2 e MD3 simplesmente não estão à altura do trabalho.
datenwolf
11
Não vejo nenhuma menção a isso na especificação? O enquadramento manual de teclas não conta.
Deceleratedcaviar
1

Só porque o Blender oferece um exportador para o Wavefront não significa que toda a animação também será exportada. O Wavefront OBJ não sabe animação!

Por outro lado, é perfeitamente possível implementar um exportador Add On para md2 / md3, e o AFAIK já existe.

Dito isto, como eu o entendi, você pretende armazenar a malha completa para cada quadro de animação. Esta é uma maneira muito ineficiente de fazer animação. Uma abordagem melhor seria apenas armazenar quadros-chave e interpolar entre eles. Ou melhor ainda: implemente um sistema de deformação de malha compatível com o sistema de animação do Blender ou implemente seu próprio sistema de deformação de malha para o Blender e seu programa. É fácil animar transformações simples de objetos inteiros. As deformações de malha no Blender geralmente ocorrem através do modificador de armadura incorporado, mas é perfeitamente possível implementar um operador de deformação de malha como substituto do modificador de armadura.

ATM Estou desenvolvendo um complemento de exportação / importação do Blender que despeja todos os dados atualmente carregados no formato JSON; um arquivo grande ou um único arquivo para cada bloco de dados. A idéia principal é usá-lo com o WebGL (ou seja, implementar um mecanismo WebGL que permita carregar coisas criadas originalmente para o Blender Game Engine). Talvez eu possa interessá-lo usando o JSON para armazenar informações e modelo.

datenwolf
fonte
Sim, eu esqueci de mencionar que eu vou estar usando armaduras para a animação ...
Mas qual é a relevância entre o carregador de OBJ, SDL e animação?
Deceleratedcaviar
hmm ... JSON parece muito bom! E tem muitas bibliotecas diferentes para escolher (em C ++)! Eu poderia usar isso ...
Bem, eu estava pensando em fazer algo como o modo como os vídeos mpeg4 funcionam, as partes dos modelos que não se movem na transição de uma cena para a outra serão "Copiadas". Portanto, se apenas um dedo for movido na cena 53, o resto do corpo da cena 52 será copiado para a cena 53. Alguém sabe de um formato de arquivo 3D que funciona assim ...?
11
@jsvcycling: Esse tipo de animação de substituição de malha é muito, muito ineficiente. É necessário copiar constantemente grandes quantidades de dados na memória da GPU, desperdiçando muita largura de banda. Além disso, a CPU ficará ocupada o tempo todo com a contabilidade. O que você realmente deve fazer é implementar um sistema de animação esquelética. Usar shaders de vértice é fácil: todo osso pode ser descrito por um quaternion e uma transformação neutra. Os quaternions são criados por uniformes; no sombreador, avalia-se a heirachy óssea, produzindo uma transformação para cada osso, que é aplicada aos vértices com um peso.
datenwolf
1

Embora a especificação .obj não ofereça suporte a animações nativamente, simplesmente aumentando-a com um arquivo .anm separado, você pode obter animações desossadas brilhantes.

Dê uma olhada em: - http://public.sanguinelabs.co.uk/expose/product.php?id=wastudio

Isso fornece uma ferramenta muito fácil de usar para criar as animações e também fornece uma biblioteca de modelos de código aberto (para OpenGL), para que você possa fazer com que os modelos animados trabalhem rapidamente em seu projeto.

Nota: Sou o desenvolvedor do Wavefront Animation Studio e da libwavefront, portanto, sinta-se à vontade para me enviar um e-mail se houver alguma melhoria ou bugs a serem relatados. O software foi desenvolvido durante o meu período na universidade porque achei extremamente estranho criar e exibir animações usando as ferramentas e bibliotecas complexas atualmente disponíveis.

Karsten Pedersen
fonte
0

A resposta para o que você procura não é * .obj, porque é quase como um bitmap para animação (você pode exportá-lo com o Blender, mas precisa informar ao blender para exportar todos os quadros como um único arquivo * .obj [NÃO É EFICIENTE EM QUALQUER ASPECTOS], como um filme e seus quadros). O que você realmente procura é Collada. Existe um carregador de malha chamado assimp, e ele carrega como um milhão de formatos de malha (estou usando-o para o meu novo mecanismo). E o que você disse sobre * .3DS nem sempre é verdade.

Amir Zadeh
fonte