GLTF e GLB Basics, Parte 2

Este artigo é uma continuação dos conceitos básicos dos formatos GLTF e GLB. Você pode encontrar a primeira parte do artigo aqui . Na primeira parte, examinamos com você por que o formato foi originalmente planejado, bem como esses artefatos e seus atributos do formato GLTF como Cena, Nó, Buffer, BufferView, Acessor e Malha. Neste artigo, consideraremos Material, Textura, Animações, Aparência, Câmera e também concluiremos a criação de um arquivo GLTF mínimo válido.


imagem

Material e Textura


Materiais e texturas estão indissociavelmente ligados à malha. Se necessário, a malha pode ser animada. O material armazena informações sobre como o modelo será renderizado pelo mecanismo. GLTF define materiais usando um conjunto comum de parâmetros que são baseados na renderização baseada em física (PBR). O modelo PBR permite criar uma exibição "fisicamente correta" do objeto em diferentes condições de luz, devido ao fato de que o modelo de sombreamento deve funcionar com as propriedades da superfície "física". Existem várias maneiras de descrever a PBR. O modelo mais comum é o modelo de rugosidade metálica, que é usado por padrão no GLTF. Você também pode usar o modelo especular-glosiness, mas apenas com uma extensão separada (extensão). Os principais atributos do material são os seguintes:


  1. name é o nome da malha.
  2. baseColorFactor / baseColorTexture - armazena informações de cores. No caso do atributo Fator, as informações são armazenadas em um valor numérico para RGBA; no caso de Texture, o link para a textura é armazenado no objeto textures.
  3. metallicFactor - armazena informações metálicas
  4. roughnessFactor - armazena informações sobre a rugosidade
  5. doubleSided - verdadeiro ou falso (o valor padrão) e indica se a malha será renderizada nos dois lados ou apenas no lado "frontal".
    "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicFactor": 0.0, "roughnessFactor": 0.800000011920929 }, "name": "Nightshade_MAT", "doubleSided": true } ], 

Metálico ou o significado de "metalicidade". Este parâmetro descreve o quão fortemente refletido é semelhante ao metal real, ou seja, quanta luz é refletida na superfície. O valor é medido de 0 a 1, onde 0 é um dielétrico e 1 é um metal puro.


Rugosidade ou "rugosidade". Este atributo exibe o quão "áspera" é a superfície, afetando assim a dispersão da luz da superfície. Medido de 0 a 1, onde 0 é perfeitamente plano e 1 é uma superfície completamente áspera que reflete apenas uma pequena quantidade de luz.


Textura - um objeto que armazena mapas de textura (mapas de textura). Tais cartões dão um modelo realista. Graças a eles, você pode designar a aparência do modelo, para fornecer várias propriedades, como metalicidade, rugosidade, escurecimento natural do ambiente e até mesmo as propriedades do brilho. As texturas são descritas por três matrizes de alto nível: texturas, amostradores, imagens. O objeto Textures usa índices para fazer referência a instâncias de amostrador e imagem. O objeto mais importante é a imagem, porque É ele quem armazena as informações de localização do mapa. Nas texturas, é descrito pela fonte da palavra. A imagem pode estar localizada em algum lugar do disco rígido (por exemplo, “uri”: “duckCM.png”) ou codificada em GLTF (“bufferView”: 14, “mimeType”: “image / jpeg”). Samplers é um objeto que define os parâmetros de filtro e quebra automática correspondentes aos tipos GL.


No nosso exemplo de triângulo, não há texturas, mas darei JSON de outros modelos com os quais trabalhei. Neste exemplo, as texturas foram gravadas no buffer, para que também sejam lidas no buffer usando o BufferView:


 "textures": [ { "sampler": 0, "source": 0 } ], "images": [ { "bufferView": 1, "mimeType": "image/jpeg" } ], 

Animações


O GLTF suporta animações de alvo articuladas, com skin e morph usando quadros principais. As informações desses quadros são armazenadas em buffers e referem-se a animações usando acessadores. O GLTF 2.0 define apenas o armazenamento de animação, portanto, não define nenhum comportamento específico do tempo de execução, como ordem de reprodução, reprodução automática, loops, exibição da linha do tempo, etc. Todas as animações são armazenadas na matriz Animações e definidas como um conjunto canais (atributo de canal), bem como um conjunto de amostras determinadas por acessadores que processam informações sobre quadros-chave e o método de interpolação (atributo de amostras)


Os principais atributos do objeto Animações são os seguintes:


  1. nome - nome da animação (se houver)
  2. canal - uma matriz que conecta os valores de saída dos quadros-chave da animação a um nó específico na hierarquia.
  3. sampler é um atributo que se refere ao Accessor, que processa os quadros-chave do buffer.
  4. target é um objeto que determina qual nó (objeto Node) precisa ser animado usando o atributo node e também qual propriedade do nó precisa ser animada usando o atributo path - translação, rotação, escala, pesos etc. Atributos não animados retêm seus valores durante as animações. Se o nó não estiver definido, o atributo do canal deverá ser omitido.
  5. samplers - define pares de entrada e saída: um conjunto de valores escalares de ponto flutuante que representam o tempo linear em segundos. Todos os valores (entrada / saída) são armazenados no buffer e são acessíveis através de acessadores. O atributo interpolação armazena o valor de interpolação entre chaves.

Não há animações no GLTF mais simples. Um exemplo é obtido de outro arquivo:


 "animations": [ { "name": "Animate all properties of one node with different samplers", "channels": [ { "sampler": 0, "target": { "node": 1, "path": "rotation" } }, { "sampler": 1, "target": { "node": 1, "path": "scale" } }, { "sampler": 2, "target": { "node": 1, "path": "translation" } } ], "samplers": [ { "input": 4, "interpolation": "LINEAR", "output": 5 }, { "input": 4, "interpolation": "LINEAR", "output": 6 }, { "input": 4, "interpolation": "LINEAR", "output": 7 } ] }, 

Pele


As informações de skinning, também conhecidas como skinning, também conhecidas como animação óssea, são armazenadas na matriz de skins. Cada capa é definida usando o atributo inverseBindMatrices, que se refere ao acessador com dados da IBM (matriz de ligação inversa). Esses dados são usados ​​para transferir as coordenadas para o mesmo espaço que cada junta, bem como o atributo da matriz de juntas, que lista os índices dos nós usados ​​como juntas para animação de capa. A ordem das conexões é determinada na matriz skin.joints e deve corresponder à ordem dos dados de inverseBindMatrices. O atributo skeleton aponta para um objeto Node que é a raiz comum da hierarquia de juntas ou o nó pai direto ou indireto de uma raiz comum.


Um exemplo de uso do objeto skin (não no exemplo do triângulo):


  "skins": [ { "name": "skin_0", "inverseBindMatrices": 0, "joints": [ 1, 2 ], "skeleton": 1 } ] 

Os principais atributos:


  1. nome - nome de aparência
  2. inverseBindMatrices - indica o número do acessador que armazena informações sobre a matriz de ligação inversa
  3. juntas - indica o número de acessador que armazena informações sobre juntas
  4. esqueleto - indica o número do acessador que armazenou informações sobre a "raiz"
    articulação / articulação com a qual o esqueleto do modelo começa

Camera


A câmera determina a matriz de projeção, que é obtida transformando a “vista” nas coordenadas do clipe. Se for mais simples, as câmeras determinam a aparência visual (ângulo de visão, direção da “aparência” etc.) que o usuário vê ao carregar o modelo.


A projeção pode ser "Perspectiva" e "Ortogonal". As câmeras estão contidas em nós e podem ter transformações. As câmeras são fixas nos objetos Node e, portanto, podem ter transformações. A câmera é definida de modo que o eixo local + X seja direcionado para a direita, a lente esteja olhando na direção do eixo local -Z e a parte superior da câmera esteja alinhada com o eixo local + Y. Se a transformação não for especificada, a câmera estará na origem. As câmeras são armazenadas no conjunto de câmeras. Cada um deles define um atributo de tipo que atribui um tipo de projeção (perspectiva ou ortogonal), bem como atributos como perspectiva ou ortográfica, que já armazenam informações mais detalhadas. Dependendo da presença do atributo zfar, as câmeras com o tipo de perspectiva podem usar projeção finita ou infinita.


Um exemplo de câmera em JSON com perspectiva de tipo. Não é relevante para um exemplo de arquivo GLTF mínimo correto (triângulo):


 "cameras": [ { "name": "Infinite perspective camera", "type": "perspective", "perspective": { "aspectRatio": 1.5, "yfov": 0.660593, "znear": 0.01 } } ] 

Os principais atributos do objeto Câmera:


  1. nome - nome de aparência
  2. tipo - tipo de câmera, perspectiva ou ortografia.
  3. perspective / orthographic - atributo que contém detalhes do valor do tipo correspondente
  4. aspectRatio - Relação de aspecto (fov).
  5. yfov - ângulo do campo de visão vertical (fov) em radianos
  6. zfar - distância do plano de recorte distante
  7. znear - distância ao plano de recorte próximo
  8. extras - dados específicos da aplicação

Arquivo GLTF mínimo válido


No começo do artigo, escrevi que coletaremos um arquivo GLTF mínimo que conterá 1 triângulo. JSON com buffer pode ser encontrado abaixo. Basta copiá-lo para um arquivo de texto, alterar o formato do arquivo para .gtlf. Para visualizar um ativo 3D em um arquivo, você pode usar qualquer visualizador que suporte GLTF, mas eu pessoalmente o uso


 { "scenes" : [ { "nodes" : [ 0 ] } ], "nodes" : [ { "mesh" : 0 } ], "meshes" : [ { "primitives" : [ { "attributes" : { "POSITION" : 1 }, "indices" : 0 } ] } ], "buffers" : [ { "uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=", "byteLength" : 44 } ], "bufferViews" : [ { "buffer" : 0, "byteOffset" : 0, "byteLength" : 6, "target" : 34963 }, { "buffer" : 0, "byteOffset" : 8, "byteLength" : 36, "target" : 34962 } ], "accessors" : [ { "bufferView" : 0, "byteOffset" : 0, "componentType" : 5123, "count" : 3, "type" : "SCALAR", "max" : [ 2 ], "min" : [ 0 ] }, { "bufferView" : 1, "byteOffset" : 0, "componentType" : 5126, "count" : 3, "type" : "VEC3", "max" : [ 1.0, 1.0, 0.0 ], "min" : [ 0.0, 0.0, 0.0 ] } ], "asset" : { "version" : "2.0" } } 

Qual é o resultado?


Concluindo, quero observar a crescente popularidade dos formatos GLTF e GLB, muitas empresas já o estão usando ativamente e algumas já estão se esforçando ativamente para isso. A facilidade de uso na rede social Facebook (postagens em 3D e, mais recentemente, em 3D Photos), o uso ativo do GLB no Oculus Home, bem como várias inovações anunciadas no GDC 2019, contribuem muito para a popularização do formato. facilidade de uso, promoção do Grupo Khronos e padronização do formato - essas são as principais vantagens que, tenho certeza, acabarão fazendo o trabalho de promovê-lo!

Source: https://habr.com/ru/post/pt448298/


All Articles