Japanese
Leave Your Message

Explicação da estrutura de arquivos do modelo FBX

O formato FBX é compatível com quase todos os motores 3D e é um formato proprietário para modelos 3D desenvolvido pela Autodesk. Ele suporta vértices, índices, normais, coordenadas UV, materiais e animações.
A Autodesk fornece oficialmente o SDK FBX, que permite importar e exportar arquivos FBX ou outras bibliotecas com a mesma finalidade. O SDK expõe duas interfaces, uma em C++ e outra em Python.
Você também pode escrever analisadores FBX personalizados para evitar dependências de outras bibliotecas.
A estrutura de um arquivo FBX é descrita neste artigo. Compreendê-la nos permite escrever um analisador FBX personalizado e leve. Para exemplos de analisadores FBX personalizados, você pode consultar o plugin FBX Importer/Exporter do Blender.
O formato FBX está disponível em ASCII (arquivo de texto legível por humanos) ou em formato binário.

    1. Estrutura de arquivo FBX

    Este é um arquivo FBX de exemplo.
    A primeira coisa a observar é que algumas linhas começam com um ponto e vírgula: esses são comentários e devem ser ignorados ao ler o arquivo.
    Após o comentário inicial, encontra-se o identificador FBXHeaderExtension. Este é o primeiro nó principal da estrutura do arquivo. O formato de arquivo FBX é, de fato, uma estrutura em árvore que segue o seguinte esquema:
    Estrutura do arquivo do modelo FBX explicada (1)
    Cada nó ou nó filho pode ter seus próprios atributos específicos. Atributos também podem ser encontrados fora do nó principal, mas geralmente podem ser ignorados. Em geral, a estrutura básica de um nó é a seguinte:
    nome do nó: eventual_properties {
    Propriedade_do_nó_1: valor
    Propriedade_do_nó_2: valor
    Subnó1 : {
    Subnó_Propriedade_1: valor
    […]
    }
    Propriedade_do_nó_3: valor
    […]
    }
    Este é um nó (o primeiro) encontrado no arquivo de exemplo:
    FBXHeaderExtension: {
    FBXHeaderVersion: 1003
    Versão FBX: 6100
    CreationTimeStamp: {
    Versão: 1000
    Ano: 2014
    Mês: 03
    Dia: 20
    Hora: 17
    Minuto: 38
    Segundo: 29
    Milissegundo: 0
    }
    Criador: "FBX SDK/FBX Plugins build 20070228"
    OtherFlags: {
    FlagPLE: 0
    }
    }
    Compreender a estrutura é a base para escrever um analisador sintático eficiente.
    No primeiro nó, encontramos dois atributos (FBXHeaderVersion e FBXVersion) cujos valores são versões de formato. Neste caso, trata-se da versão 6.1. As demais informações podem ser ignoradas, a menos que também se deseje ler a data de criação (CreationTimeStamp).

    2. Nós de objeto FBX

    O nó mais importante é, sem dúvida, o nó do objeto.
    O nó do objeto contém os vértices, índices, normais, coordenadas UV e materiais do modelo. Sua estrutura é a seguinte:
    Objetos: {
    Modelo: 'nome do modelo', 'Malha' {
    [...]
    Vértices: [...]
    Índice de vértice do polígono: [...]
    LayerElementNormal: { }
    LayerElementUV: { }
    }
    Material: 'nome do material', '' { }
    [...]
    }

    3. Vértice FBX

    Como vimos, os vértices podem ser encontrados na propriedade 'Vertex' dos nós filhos do modelo.
    A sintaxe é a seguinte:
    Vértices: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
    Cada vértice possui três coordenadas espaciais (x, y, z), separadas por vírgulas (que também separam um vértice do outro). As coordenadas são expressas, obviamente, em formato decimal com pontos.
    Um exemplo é o seguinte:
    Vértices: 0.000000,0.104800,39.291698,0.000000,0.043400,-44.424301,0.000000,38.654301,-41.818802,-0.000000,39.455002,44.424400
    Os vértices que compõem o modelo serão:
    v1(0,000000,0,104800,39,291698)
    v2(00,000000,0,043400,-44,424301)
    v3(0,000000,38,654301,-41,818802)
    v4(0,000000,39,455002,44,424400)

    4. Índice do vértice do polígono FBX

    O índice pode ser encontrado na propriedade PolygonVertexIndex.
    Os arquivos FBX podem exportar polígonos trilaterais (triângulos) ou mais. A maioria dos arquivos exporta polígonos quadriláteros (quadriláteros). A sintaxe é semelhante à de vértices, mas há um detalhe importante a observar:
    PolygonVertexIndex: i1, i2,-i3, i4, i5,-i6,[...]
    PolygonVertexIndex: i1, i2, i3, -i4, i5, i6, i7, -i8, [...]
    Os índices que compõem um polígono estão em ordem; um índice negativo significa que é o último índice do polígono. O índice precisa ser definido como um número positivo e, em seguida, você deve subtrair 1 dele!
    [Se você está se perguntando o porquê, é porque o índice original é tudo ou nada com -1. Por exemplo, o índice 3 se torna -4]
    O exemplo é o seguinte:
    Índice do vértice do polígono: 8,7,3,-7,4,8,7,-3,0,5,8,-5
    Os polígonos que compõem o modelo serão:
    p1(8,7,3,6)
    p2(4,8,7,2)
    p3(0,5,8,4)
    Observe que o índice que indica o final do polígono foi definido como um número positivo e, em seguida, subtrai-se 1 dele.
    Lembrete: as placas gráficas não lidam bem com quadriláteros, portanto, cada polígono com quatro lados deve ser dividido em dois triângulos antes de exibir o modelo.

    5. Normais FBX

    As normais podem ser encontradas no nó filho da propriedade Normals, LayerElementNormal (que, por sua vez, é um nó filho de Model). A sintaxe é a mesma que a de um dos vértices, ou seja, uma série de coordenadas (x, y, z).
    Normais: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
    Você precisa prestar atenção à propriedade MappingInformationType, que pode ter os seguintes valores:
    ▪ Por polígono: por polígono, o que significa que cada polígono do modelo possui uma normal.
    ▪ Por vértice do polígono: processado por vértice do polígono, o que significa que cada vértice de cada polígono do modelo possui uma normal. Por exemplo, se o modelo tiver 8 vértices formando quatro quadriláteros, haverá 16 normais (1 normal * 4 polígonos * 4 vértices do polígono). Observe que, geralmente, os motores de jogos precisam de apenas uma normal por vértice. Portanto, se você encontrar um vértice com mais de uma normal, pode ignorar as normais encontradas após a primeira ou calcular a média de todas as normais (suavização de normais).
    ▪ ByVertex: processamento por vértice, o que significa que cada vértice do modelo possui uma normal. Às vezes chamado de ByVertice, como está escrito no exportador do Blender. Acho que o autor é espanhol.
    ▪ Por aresta: processado por aresta, o que significa que cada aresta do modelo tem um valor normal (raro)
    ▪ AllSame: isso significa que todos os vértices do modelo têm a mesma normal, o que é raro ou impossível para a maioria dos modelos.
    Outra propriedade importante é a propriedade ReferenceInformationType, que pode ter os seguintes valores:
    ▪ Direto: indica que as normais estão ordenadas.
    ▪ IndexToDirect (ou index em versões mais antigas do formato FBX): indica que a ordem das normais é dada pela propriedade NormalsIndex.
    Abaixo, segue um exemplo gráfico que pode ser mais claro do que o texto. O modelo de exemplo é um plano nos eixos X e Y (portanto, todos os vértices terão coordenada Z igual a 0), composto por 9 vértices e 4 polígonos (quadriláteros). A imagem de exemplo mostra uma vista superior do plano.
    Estrutura do arquivo do modelo FBX explicada (2)

    6. Coordenadas UV FBX

    As coordenadas UV podem ser encontradas na propriedade UV do nó filho LayerElementUV (que, por sua vez, é um nó filho de Model). A sintaxe é semelhante à de vértices e normais, mas, obviamente, haverá duas coordenadas em vez de três.
    UV: u1, v1, u2, v2, [...]
    Você ainda precisa prestar atenção às propriedades MappingInformationType e ReferenceInformationType! Essas duas propriedades podem ter os mesmos valores que as normais, portanto, as mesmas regras se aplicam. A propriedade de índice (se houver, ou seja, IndexToDirect estiver definida) é UVIndex.