热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

glTF格式详解

原标题:glTF格式详解文章目录简介.g

原标题:glTF格式详解


文章目录



  • 简介


    • .gltf+bin+纹理


      • asset

      • scene, scenes, nodes

      • materials

      • meshes

      • textures, images, samplers

      • accessors, buffers, bufferViews

      • cameras



  • 压缩优化


    • 图片压缩

    • EXT_meshopt_compression


  • 总结




简介

本文主要通过总结glTF文件格式来对3d模型有一个整体的认识概念,对glTF有了一个清晰的概念后文章来源地址56137.html我们可以简单试下如何解析一个glTF文件为模型,并且简单介绍下我对glTF文件在实际项目中应用优化的落地实践。

glTF作为一个标准的3d场景和模型文件格式,类似于图形中的jpeg,有两种文件扩展名:.gltf(JSON/ASCII)或者.gbl(二进制文件)两种类型。下图我们可以看到我在blender里简单放了一个cube后导出glTF2.0文件的话可以选择以下三种格式:glTF二进制(.glb)、glTF分离(.gltf+bin+纹理)、glTF嵌入式(.gltf)。
在这里插入图片描述


.gltf+bin+纹理

由于glb和glTF嵌入式主要是把所有的二进制 纹理数据全部打入到了一个文件中,道理是一样的,所以我们这里重点来拆解gltf+bin+纹理结构类型。
在这里插入图片描述
我们先来看一个.gltf+bin+纹理图片的文件目录例子,.gltf其实就是一个json文件,里面包括了3d 模型的场景的结构和组成。我们先来看这个json文件下的top-level elements:
在这里插入图片描述
这其中包含了一个模型场景中必备的几个元素:
asset标签里介绍了glTF版本这些基础信息;
scene,scenes,nodes标签里包含了一个场景的基本元素;
materials标签里包含了每个对象是如何呈现出来的定义;
meshes 标签里定义了所有的3d对象的几何形状;
textures, images, samplers标签里包含了物体的表面外观,贴纸等信息;
accessors, buffers, bufferViews标签里包含了整个3d模型场景里的数据引用和数据布局的描述。

当然还有我这个gltf里不包括的,也很常见的几个标签元素:
cameras 标签里包含了查看场景的配置信息;
上面标签信息我们下文都会有各自的案例介绍来帮助大家更全面的理解。


asset

在这里插入图片描述
glTF2.0版本以及是blender导出的等基础信息。关于glTF2.0与1.0的更新区别 可以参考这里。


scene, scenes, nodes

我们先来看我们这个gltf文件的结构
在这里插入图片描述
这代表我们scene里有一个场景,这个场景下包括了19个nodes节点,具体每个节点的属性我们看nodes节点,
在这里插入图片描述
nodes作为一个jsonArrayList包括了rotation旋转信息,scale大小 信息,translation位移信息等。然后每个节点都会指向一个mesh或者一个camera,上图中我们的模型中的nodes就指向的是meshid为0,name为转义过后的\ue573\u9762的mesh。然后在渲染的时候会将这些元素全部附加到这些个节点上,创建这些元素的实例就会使用节点上的各种旋转信息,大小信息,位移信息等进行变换了。
当然如果你的模型中出现group的时候,那么你的nodes下的节点会出现children,children是一个数组,里面的id对应的是nodes节点下的nodes[x],即为nodes[x]是有children的节点的children。
另外在模型场景中如果我们对某个mesh做动画的话,这里的translation,scale,rotation都是可变的,会随着动画的进行而重新建模。


materials

在这里插入图片描述

ok我们接下来来看materials,在3d设计中,要创造出逼真的效果,就必须弄清楚材质属性。材质的意思就是文章来源地址56137.html虚拟中模拟物体真实的物体性质,例如颜色、反光、透明、贴图等;而材质球就是对这个材质的属性整合的统称。
这里我们重点来看pbrMetallicRoughness属性,baseColorTexture属性是应用于对象的主要纹理,基本颜色因子包括了三个基础颜色,RED GREEN BLUE和代表alpha的比例因子。如果没有使用纹理的话,这些值的意思就是金属粗糙度纹理的颜色。粗糙度纹理包含金属度值“蓝色”颜色通道,粗糙度值包含“绿色”颜色通道。
metallicFactor代表了金属系数,很明显我们上面的模型中金属系数为0。
当然除了金属粗糙度以外,material可能还包括www.yii666.com其他影响对象外观的特性,这里建议直接在threejs editor里调整好再用于开发,editor上可以很直观的看到金属感和粗糙度上变更后效果的差异。


meshes

在这里插入图片描述
mesh的意思其实就是模型的几何体,与material配合,每个网格图元都有一个渲染模式,该模式是一个常量,指示是否应渲染为点。线。或三角形基本体还引用顶点的音调和属性,使用访问器的属性来访问其数据。这里我们主要来看primitives属性,primitives引用了顶点的vertices和属性,使用访问器的属性就可以直接访问他的数据了。每个属性都是通过将attributename映射到包含属性数据的访问器的索引来定义的。渲染网格时,此数据将用作顶点属性。例如,属性可以定义顶点的位置和法线:
在这里插入图片描述


textures, images, samplers

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
textures包含有关可应用于渲染对象文章来源站点https://www.yii666.com/的纹理的信息:材质引用纹理来定义对象的基本颜色,以及影响对象外观的物理属性。
这些图像定义了用于纹理的imagedata,数据通过一个URI(图像在文件中的位置)来给定,或者通过引用一个bufferView和一个MIME类型来定义存储在缓冲区视图中的iamgedata类型。这个很好理解


accessors, buffers, bufferViews

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
buffers包含了用于三维模型几何体、动画和蒙皮的数据缓冲区视图等结构信息。每个缓冲区使用URL引用一个二进制数据文件。它是一个原始数据块的源,每个缓冲区视图引用一个缓冲区。它是字节偏移量(byteoffset)和字节长度(abytelength),定义属于bufferview的缓冲区的部分,以及可选的Openglbuffer目标。访问器定义如何对bufferview的数据进行交互。它们可以定义引用bufferview开始的附加字节偏移量,并包含有关bufferview数据类型和布局的信息。
其实可以这么理解,例如,当类型为“VEC2”且组件类型为GL FLOAT(5126)时,可以将数据定义为浮点值的二维向量。所有值的范围存储在“最小值”和“最大值”属性中。多个存取器的数据可以在bufferview中交错。在这种情况下。bufferview将有一个bytestride属性,该属性表示Accessor的一个元素的开头之间有多少字节。


cameras

camera总共分为两种,透视相机和正交相机,它们定义了投影矩阵。透视camerazfar的远剪裁平面距离的值是可选的。当省略时,摄像机会为无限投影使用一个特殊的投影矩阵。
当文件中一个节点引用摄像机时,就可以理解成创建了一个相机的实例,该相机实例的摄像机矩阵其实就是该node下的transform、scale等变换矩阵给到的。


压缩优化


图片压缩

上面我们看到其实一个模型的texutures是直接引用外部的URI链接来引用图片然后链接到面上的贴图,那么如果从图片角度,我们就可以做到图片的压缩来实现模型的压缩。
blender里导出的默认是png格式的图片,那么我们就可以转换成webp格式,至于webp格式比png的区别,如果不知道www.yii666.com的朋友可以去看这篇webp相对png、jpg有什么优势。

经测试,图一中的模型,压缩前为2.21MB,压缩后为1.01MB,压缩率可见一斑,而且如果你是webp无损压缩的话,理论上来说模型效果其实没啥影响。

这里推荐一个官方出的插件,EXT_texture_webp.

当然这个方案也有一个问题,如果你是使用threejs 的话,webp的不支持浏览器类型和threejs 不支持的浏览器有所出入,适配上需要考虑到这一点。


EXT_meshopt_compression

刚才我们压缩针对的是texture图片资源,那么这个方案我们针对的就是glTF文件中的各种二进制数据了,理论上来说glTF文件中的二进制数据包含了各种顶点属性数据、索引数据、变形目标增量、动画输入输出数据,他们可能会占据整个glTF文件中很大一部分,所以这些二进制数据我们可以采用gzip通用压缩的形式去处理。

使用方式:

gltfpack -i untitled.glb -o untitled-meshopt-compression.glb -cc

经测试,图一中的模型,压缩前为2.21mb,压缩后为1.45mb。


总结

其实gltf官方还给了我们很多优秀的压缩插件,具体我们可以查看glTF官方git地址,https://github.com/KhronosGroup/glTF 查阅。

来源于:glTF格式详解


推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
author-avatar
mobiledu2502885517
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有