首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gltfOverview中文翻译

gltfOverview中文翻译

作者头像
Jean
发布2021-04-07 12:29:07
1.6K0
发布2021-04-07 12:29:07
举报

翻译官方英文

https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/figures/gltfOverview-2.0.0b.png

glTF2.0总览

glTF由Khronos组织设计和定义,实现在网络上高效的传输3D内容。glTF的核心是通过一个Json的文件来描述3D场景的结构和组成。文件的顶层元素如下:

  1. scenes,nodes:场景的基本结构
  2. cameras:场景视口的配置
  3. meshes:3D几何对象
  4. buffers,bufferViews,accessors:数据引用和数据布局的描述
  5. materials:定义对象如何被渲染(材质)
  6. textures,images,samplers:对象表面观感(纹理)
  7. skins:顶点的蒙皮信息
  8. animations:动画

这些元素被包含在数组当中。对象之间的引用通过数组的索引进行关联。

概念

glTF资产顶层元素之间的概念关系如下图:

二进制数据引用

glTF资产的images和buffers可以引用包含呈现3d内容的外部文件。

    "buffers": [
        {
            "url": "buffer01.bin",
            "byteLength": 102040
        }
    ],
    "images": [
        {
            "url": "image01.png"
        }
    ]

buffers指向包含几何体或者动画数据的二进制文件

images指向包含模型纹理信息的图片文件

数据通过url来引用,但是也可以直接在json文件中包含数据urls。数据urls定义了MIME类型和一个base64编码的数据字符串。

scenes和nodes

glTF的json文件可以包含scenes(和一个可选的默认scene)。每一个scene可以包含nodes索引数组。如下图所示:

每个nodes可以包含子节点的索引数组。这就允许通过模型来表达一个场景的层次关系。

一个node可以包含本地变换。可以以一个matrix矩阵数组形式给出,也可以单独的以translation(平移),rotation(旋转)和scale(缩放)属性给出。其中rotation是以一个四元数的形式给出。然后本地变换矩阵计算公式如下:

M = T * R * S

其中T,R 和S是通过translation,rotation和scale创建的矩阵数组。一个node的全部变换等于从root到相应的node的所有本地变换的乘积。

每个node也可能会引用到mesh或者camera,使用数组索引来指向meshes和cameras的数组。然后会将这些元素附加到node节点。如下图:

在渲染期间,这些元素的实例会被创建和采用全部的变换矩阵变换。

一个node的translation(平移),rotation(旋转)和scale(缩放)属性也有可能会成为一个动画的目标:动画会描述这些属性如何随着时间变化。因此被附加的对象将会允许对移动物体或者相机飞行进行建模。

nodes也可以使用在顶点蒙皮中:节点的层次结构可以用来定义动画角色的骨架。然后node将会指向一个网格体或者蒙皮。蒙皮将会包含更多的信息关于如何将网格体基于当前的骨架姿势进行改变。

meshes

meshes包含多个网格体。这些网格体指向需要渲染的几何体数据,每一个mesh primitive有一个渲染mode,他是一个常量用来确定被渲染的是POINTS(点),LINES(线)或者TRIANGLES(面)。primitive会使用accessors的索引来指向indices和顶点的attributes。在渲染期间使用的material也被定义出来,使用了material数组的索引。具体格式参考下图:

每个attributes通过索引来和accessor的数据映射。这些数据将会作为渲染mesh的顶点属性。看下面的顶点位置和法线的例子:

一个mesh可以定义多个变形targets。每个变形target描述原始mesh的变化。为了定义一个mesh的变形,每个mesh可以包含一个targets数组。这些target通过索引去accessors里面去获取数据。一个mesh还可以包含一个weights(权重)数组,用来决定每个变形的target对渲染结果的影响。可以看下图:

使用不同的权重来组合多个变形targets。例如模拟一个角色的不同面部表情。这些权重会在动画中进行改变,进而实现内置几何体的不同状态。(备注:我认为这些参数是用来处理动画的)

buffers,bufferViews,accessors

buffers包含用于三维模型、动画、蒙皮的数据。bufferViews增加了这些数据的结构信息。accessors定义了数据了类型和布局。

buffers通过一个Url地址指向一个二进制文件。他是给定长度的原始数据库的源。

bufferViews指向一个buffer。他定义了哪部分的buffer属于bufferViews,通过byteOffset和byteLength来标识。另外还定义了可选的OpenGL buffer target。

accessors定义了bufferView的数据说明。他可以定义一个额外的byteOffset用来指向bufferView的开始,还定义了bufferView数据的类型和布局。例如可以定义type为VEC2和componentType为5126。这表示数据为一个loat精度的二维向量。所有数据的最大和最小值保存在min和max属性中。

这3者之间的关系可以参考下图:

多个accessors的数据可以同一个bufferView交错。在这种情况,bufferVIew定义了一个byteStride属性来定义每个元素之间字节大小。下图通过一个示例详细的描述了accessor到bufferView再到buffer之间的数据关系。

这种数据的设计为了更好的配合OpenGL进行渲染。例如假设buffer中保存2d的纹理坐标,bufferView的数据对于OpenGl的接口glBindBuffer。accessor对应OpenGl的接口glVertexAttribPointer。

Sparse accessors

当一个accessor中的元素只有很少一部分和默认的值不相同(这种场景经常在变形targets中),这些数据可以通过sparse数据表达。看下图示例:

这里accessor定义了scalar的float数据类型和整个元素的数量。sparse数据快包含了sparse数据元素的数量。values指向了sparse数据在哪个bufferView中。目标indices定义了指向哪个bufferView和componentType。

数据最终根据indices写入accessor里面。下图示例描述了values 和indices 还有数据的关系。

materials

每个网格体都可能指向glTF资产中的某个material。materials描述了一个对象如何基于物理的材质属性被渲染。这里允许使用Physically Based Rendering(PBR)技术来确保被渲染对象的外观具有一致性。

默认的material模型是Metallic-Roughness-Model。它通过0.0到1.0之间的值来描述一个materail的金属相似度和表面粗糙度。这些属性可以为整个对象设置一个值,也可以从纹理中读取。下图为0.0-1.0的粗糙度不同显示外观

下面通过一个示例来描述具体的参数如何填写

Metallic-Roughness-Model模型的属性设置都在定义在pbrMetallicRoughness的对象中。

baseColorTexture是被应用到对象中的主要纹理。

baseColorFactor包含了red,green,blue和alpha值的比例因子。如果没有纹理使用的话,这些值将会应用到所有对象的颜色中去。

metallicRoughnessTexture通过blue颜色通道来表示金属程度,通过green颜色通道来表示粗糙程度。metallicFactor和roughnessFactor会和上面的值相乘。如果没有其他纹理,这些缩放因子反应所有对象的反射特性。

我们扩展了Metallic-Roughness-Model模型,增加了一些其他的属性来反应对象的外观。

normalTexture指向包含tangent-space法线信息的纹理,scale因子也会应用到这些法线中去。

occlusionTexture用来表示一个物体表面避光的区域,这样渲染出来会更加黑暗。这个属性在纹理的red通道里面包含,通过strength来进行比例因子的缩放。

emissiveTexture用来表示物体表面被照亮的部分。他定义了从物体表面发出的光线的颜色。

emissiveFactor定义了这些颜色的缩放因子

下图表达了meshes,materials和textures之间的关系。

cameras

每个node节点都可以引用定义在glTF资产中的camera。有两种类型的camera:perspective(透视)和orthographic(正交),他们都定义了一个投影矩阵。

透视投影的裁剪平面的zfar参数是可选的,当这个参数被省略,会使用一个特殊的投影矩阵来实现无限的投影。

cameras的使用示例如下:

当一个node引用了camera之后,会创建一个camera的实例。camera实例的矩阵采用node节点的全局变换矩阵。

textures,images,samplers

textures包含了包含了渲染对象的纹理信息。Textures在materials中被引用,通过定义对象的基本颜色和物理参数来决定渲染对象的外观。

texture由source和sampler组成。source指向某个image资产,sampler指向某个sampler。

images定义了被texture使用的图片数据。图片数据可以通过一个url来定位图片的位置,也可以指向bufferview,通过MIME type来定义一个存储在buffer view的图片数据。

samplers描述了纹理的wrapping 和scaling。这些常量对应于OpenGL的glTexParamter参数。

skins

一个GlTF的资产可以包含必要实现顶点蒙皮的信息。依靠顶点蒙皮,他可以使网格体的顶点受到骨架当前姿势的影响。这里不翻译了,暂时用不到。Computing the skinning matrix和animations由于暂时用不到,也跳过了。

Binary GlTF files

在标准的gltf格式中,有两种选择去包含外部的二进制数据比如缓存数据和纹理。他们可以指向外部的url或者使用数据url去嵌入到gltf的json数据中。当他们指向外部的url的时候,每个外部的资源意味着一次新的下载请求。当他们以base64的编码形式的二进制嵌入到json内部时,会大幅度增加文件的大小。

为了克服这些缺陷,有一个选项可以整合GlTF的json和二进制数据到一个二进制的gltf文件。这是一个以.glb为后缀的小端序文件。他包含一个包含版本和数据结构的信息的header,和一个或者多个包含实际数据的chunks。第一个chunk总是包含json数据,剩下的数据包含二进制数据。具体的结构含义看下图。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WebHub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • glTF2.0总览
  • 概念
  • 二进制数据引用
  • scenes和nodes
  • meshes
  • buffers,bufferViews,accessors
  • materials
  • cameras
  • textures,images,samplers
  • skins
  • Binary GlTF files
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档