GLTF y GLB Conceptos básicos, Parte 2

Este artículo es una continuación de los conceptos básicos de los formatos GLTF y GLB. Puedes encontrar la primera parte del artículo aquí . En la primera parte, examinamos con usted por qué el formato se planeó originalmente, así como los artefactos y sus atributos del formato GLTF como Escena, Nodo, Buffer, BufferView, Accessor y Mesh. En este artículo, consideraremos Material, Textura, Animaciones, Máscara, Cámara, y también terminaremos de crear un archivo GLTF válido mínimo.


imagen

Material y textura


Los materiales y las texturas están indisolublemente unidos a la malla. Si es necesario, la malla se puede animar. El material almacena información sobre cómo el motor representará el modelo. GLTF define materiales utilizando un conjunto común de parámetros que se basan en la representación basada en física (PBR). El modelo PBR le permite crear una visualización "físicamente correcta" del objeto en diferentes condiciones de iluminación debido al hecho de que el modelo de sombreado debe funcionar con las propiedades de superficie "física". Hay varias formas de describir PBR. El modelo más común es el modelo de rugosidad metálica, que se usa por defecto en GLTF. También puede usar el modelo de brillo especular, pero solo con una extensión separada (extensión). Los principales atributos del material son los siguientes:


  1. nombre es el nombre de la malla.
  2. baseColorFactor / baseColorTexture : almacena información de color. En el caso del atributo Factor, la información se almacena en un valor numérico para RGBA, en el caso de Texture, la referencia de textura se almacena en el objeto de texturas.
  3. metallicFactor - almacena información metálica
  4. roughnessFactor : almacena información sobre la aspereza
  5. doubleSided : verdadero o falso (el valor predeterminado) e indica si la malla se representará en ambos lados o solo en el lado "frontal".
    "materials": [ { "pbrMetallicRoughness": { "baseColorTexture": { "index": 0 }, "metallicFactor": 0.0, "roughnessFactor": 0.800000011920929 }, "name": "Nightshade_MAT", "doubleSided": true } ], 

Metálico o el significado de "metalicidad". Este parámetro describe cuán fuertemente reflejado es similar al metal real, es decir. cuánta luz se refleja desde la superficie. El valor se mide de 0 a 1, donde 0 es un dieléctrico y 1 es un metal puro.


Rugosidad o "rugosidad". Este atributo muestra cuán "rugosa" es la superficie, afectando así la dispersión de la luz desde la superficie. Medido de 0 a 1, donde 0 es perfectamente plano y 1 es una superficie completamente rugosa que refleja solo una pequeña cantidad de luz.


Textura : un objeto que almacena mapas de textura (mapas de textura). Dichas tarjetas dan un modelo realista. Gracias a ellos, puede designar la apariencia del modelo, para dar varias propiedades como metalicidad, aspereza, atenuación natural del entorno e incluso las propiedades del brillo. Las texturas se describen mediante tres matrices de alto nivel: texturas, muestras, imágenes. El objeto Texturas usa índices para hacer referencia a muestras y ejemplos de imágenes. El objeto más importante es la imagen, porque Es él quien almacena la información de ubicación del mapa. En texturas, se describe por la palabra fuente. La imagen puede estar ubicada en algún lugar del disco duro (por ejemplo, "uri": "duckCM.png") o codificada en GLTF ("bufferView": 14, "mimeType": "image / jpeg"). Samplers es un objeto que define los parámetros de filtro y ajuste correspondientes a los tipos GL.


En nuestro ejemplo de triángulo, no hay texturas, pero le daré JSON de otros modelos con los que trabajé. En este ejemplo, las texturas se escribieron en el búfer, por lo que también se leen desde el búfer usando BufferView:


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

Animaciones


GLTF admite animaciones de objetivo articuladas, desolladas y transformadas mediante fotogramas clave. La información de estos cuadros se almacena en buffers y se refiere a animaciones que usan accesores. GLTF 2.0 solo define la tienda de animación, por lo que no define ningún comportamiento específico de tiempo de ejecución, como el orden de reproducción, reproducción automática, bucles, visualización de la línea de tiempo, etc. Todas las animaciones se almacenan en la matriz de animaciones y se definen como un conjunto canales (atributo de canal), así como un conjunto de muestras definidas por accesores que procesan información sobre fotogramas clave y el método de interpolación (atributo de muestras)


Los principales atributos del objeto Animaciones son los siguientes:


  1. nombre : nombre de la animación (si existe)
  2. canal : una matriz que conecta los valores de salida de los fotogramas clave de la animación a un nodo específico en la jerarquía.
  3. sampler es un atributo que se refiere a Accessor, que procesa fotogramas clave desde el búfer.
  4. target es un objeto que determina qué nodo (objeto Node) necesita ser animado usando el atributo del nodo, y también qué propiedad del nodo necesita ser animado usando el atributo de ruta - traslación, rotación, escala, pesos, etc. Los atributos no animados conservan sus valores durante las animaciones. Si el nodo no está definido, se debe omitir el atributo del canal.
  5. samplers : define los pares de entrada y salida: un conjunto de valores de punto flotante escalar que representan el tiempo lineal en segundos. Todos los valores (entrada / salida) se almacenan en el búfer y son accesibles a través de los accesores. El atributo de interpolación almacena el valor de interpolación entre claves.

No hay animaciones en el GLTF más simple. Se toma un ejemplo de otro archivo:


 "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 } ] }, 

La piel


La información de skinning, también conocida como skinning, también conocida como animación de huesos, se almacena en la matriz de máscaras. Cada máscara se define utilizando el atributo inverseBindMatrices, que se refiere al descriptor de acceso con datos de IBM (matriz de vinculación inversa). Estos datos se utilizan para transferir las coordenadas al mismo espacio que cada articulación, así como el atributo de la matriz de articulaciones, que enumera los índices de los nodos utilizados como articulaciones para la animación de la máscara. El orden de las conexiones se determina en la matriz skin.joints y debe coincidir con el orden de datos de inverseBindMatrices. El atributo esqueleto apunta a un objeto Nodo que es la raíz común de la jerarquía de uniones, o el nodo primario directo o indirecto de una raíz común.


Un ejemplo de uso del objeto de máscara (no en el ejemplo del triángulo):


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

Los principales atributos:


  1. nombre - nombre de skinning
  2. inverseBindMatrices : indica el número de acceso que almacena información sobre la matriz de unión inversa
  3. articulaciones : indica el número de acceso que almacena información sobre las articulaciones
  4. esqueleto : indica el número del descriptor de acceso que almacenó información sobre la "raíz"
    articulación / articulación con la que comienza el esqueleto del modelo

Cámara


La cámara determina la matriz de proyección, que se obtiene transformando la "vista" en las coordenadas del clip. Si es más simple, las cámaras determinan la apariencia visual (ángulo de visión, dirección de "mirar", etc.) que el usuario ve al cargar el modelo.


La proyección puede ser "Perspectiva" y "Ortogonal". Las cámaras están contenidas en nodos y pueden tener transformaciones. Las cámaras se fijan en objetos Node y, por lo tanto, pueden tener transformaciones. La cámara se define de modo que el eje local + X se dirija hacia la derecha, la lente mira en la dirección del eje local -Z y la parte superior de la cámara se alinea con el eje local + Y. Si no se especifica la transformación, la cámara está en el origen. Las cámaras se almacenan en la matriz de cámaras. Cada uno de ellos define un atributo de tipo que asigna un tipo de proyección (perspectiva u ortogonal), así como atributos como perspectiva u ortografía, que ya almacenan información más detallada. Dependiendo de la presencia del atributo zfar, las cámaras con el tipo de perspectiva pueden usar proyección finita o infinita.


Un ejemplo de cámara en JSON con perspectiva de tipo. No es relevante para un ejemplo de un archivo GLTF mínimo correcto (triángulo):


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

Los principales atributos del objeto Cámara:


  1. nombre - nombre de skinning
  2. tipo - tipo de cámara, perspectiva u ortográfica.
  3. perspectiva / ortografía : atributo que contiene detalles del valor de tipo correspondiente
  4. aspectRatio - Relación de aspecto (fov).
  5. yfov - ángulo del campo de visión vertical (fov) en radianes
  6. zfar - distancia al plano de recorte lejano
  7. znear - distancia al plano de recorte cercano
  8. extras - datos específicos de la aplicación

Archivo GLTF válido mínimo


Al comienzo del artículo, escribí que recopilaremos un archivo GLTF mínimo que contendrá 1 triángulo. JSON amortiguado se puede encontrar a continuación. Simplemente cópielo en un archivo de texto, cambie el formato del archivo a .gtlf. Para ver un activo 3D en un archivo, puede usar cualquier visor que admita GLTF, pero yo personalmente uso esto


 { "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" } } 

Cual es el resultado?


En conclusión, quiero señalar la creciente popularidad de los formatos GLTF y GLB, muchas compañías ya lo están utilizando activamente, y algunas ya están luchando activamente por esto. La facilidad de su uso en la red social Facebook (publicaciones en 3D y, más recientemente, fotos en 3D), el uso activo de GLB en Oculus Home, así como una serie de innovaciones que se anunciaron durante el GDC 2019 contribuyen en gran medida a la popularización del formato. Ligereza, velocidad de representación rápida, La facilidad de uso, la promoción del Grupo Khronos y la estandarización del formato son las principales ventajas, que, estoy seguro, eventualmente harán su trabajo para promoverlo aún más.

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


All Articles