glb数据格式
glb数据格式
glb 文件格式只包含一个glb 文件,文件按照二进制存储,占空间小
浏览
浏览glb工具的很多,ccs,3D查看器等都可以,不安装软件的话用下面网页加载就可以,免费
glTF Viewer (donmccurdy.com)
glbxz.com 模型网
GLTF 编辑器 -NSDT

参考资料
完整的介绍文档可以参考以下几个
GLB文件 (sarkuya.com)
glTF 2.0 - Blender 4.2 手册
GLB (fileformat.com)
glTF Tutorial | glTF-Tutorials (khronos.org)
文件格式
开始正文介绍,二进制的glb文件打开后结构如下:

整体结构的包含一个文件头,一个Json的chunk,一个bin的chunk存储图像,动画,纹理等
header
头部数据长度12个字节
#读取12个字节,按照小端,转换为无符号整数
header = f.read(12)
magic, version, length = struct.unpack('<III', header)
| 名称 | 说明 | 数值 | 解释 |
|---|---|---|---|
| magic | 魔术字 | 0x46546C67 | 对应ascII码glTF |
| version | 版本 | 2 | GITF的版本 |
| length | 长度 | 746776 | 包括文件头的文件总长度 |
chunk0
一个glb文件可以存在多个chunk,但是chunk0是必须的,其格式是固定的
# 读取8个字节,存储字节总长度和chunk类型,按照字节长度截取数据存储为chunkdata
chunk_header = f.read(8)
chunk_length, chunk_type = struct.unpack('<II', chunk_header)
if chunk_type != 0x4E4F534A:raise ValueError("Expected JSON chunk.")json_chunk = f.read(chunk_length)
gltf_data = json.loads(json_chunk.decode('utf-8'))
| 名称 | 说明 | 数值 |
|---|---|---|
| chunkLength | 字节总长度 | 7420(测试值) |
| chunkType | 数据类型 | 0x4E4F534A,对应ascII是JSON |
| chunkData | 数据 | JSON数据 |
#使用该指令可以将无符号整数转ascII,对应值是JSON
chunk_type.to_bytes(4, byteorder='little').decode('ascii')
chunkData

已知数据格式为JSON,所以将数据按照utf-8编码转换为对应的数据JSON数据,并打印出来
gltf_data = json.loads(json_chunk.decode('utf-8'))
print(json.dumps(gltf_data, indent=4))
对应打印值对应如下:

接下来对JSON结构进行解释,其加载顺序对应是scenes、nodes、meshes、accessors、bufferViews、buffers、materials、textures、images。其中每个mesh包括一个bufferViews和一个materials。每一层的递进都有数组下标来确定,结构存储在buffer中,纹理存储在image中
| 名称 | 说明 | 包含 | 声明 |
|---|---|---|---|
| scenes | 场景 | nodes | |
| nodes | 节点 | mesh、translation、chidren,camera、skin | |
| meshes | 网格 | attributes、indices、material | 网格所需数据 |
| accessors | 访问器 | bufferView、componentType、count、type | 缓冲器索引,数据类型,大小 |
| bufferViews | 缓冲器 | buffer、byteOffset、byteLength、target | buffer对应得位置 |
| buffers | 缓冲数据 | byteLength,uri、name | buffer的字节长度 |
| materials | 材质 | baseColorTexture、metallicFactor、roughnessFactor、extensions | 材质参数,以及纹理索引 |
| textures | 纹理 | source,sampler | 照片索引和采样器索引 |
| images | 照片 | name、uri、bufferView、mimeType | 纹理文件索引,文件格式 |
| samplers | 采样器 | magFilter、minFilter | 放大缩小时滤波器 |
scenes
对应模型得场景,一般模型一个场景,即默认场景;
每个场景包含一个node字段,指定了sence的根节点,
下图包含一个scene对象,该对应指定了一个索引为2的node节点

nodes
节点,所有的节点构成scene,可以包含网格mesh、变换translation,子节点children,相机camera、纹理skin等
| 名称 | 说明 |
|---|---|
| mesh | 网格信息 存放网格索引 |
| children | 子节点,该节点包含的子节点 |
| translation | 平移信息 |
| rotation | 旋转信息,四元数 |
| scale | 缩放信息 |
| name | 节点名 |
| matrix | 局部变换矩阵,16浮点矩阵数组,平移,旋转,尺度 |
下图node包含
一个mesh,其索引值为0
一个子节点children,索引为0,并且包含了其变化参数translation,对应节点名称为rtc
一个子节点children,索引为1,并且包含了对应姿态matrix,对应节点名称为rootNode
所以根据使用得关系是rootnode给了rtc一个属性matrix,然后rtc给了mesh一个属性translation,等于mesh继承了器各个属性


meshes
meshes网格,包含构建一个网格所需要的数据"primitives"数组,,其包含的属性值有
- attributes:包含"NORMAL"、“POSITION”、“TEXCOORD_0”、“TANGENT”、“JOINTS_0”、“WEIGHTS_0”等数据的索引
- indices:存储属性accessors的数组索引
- material:存储属性material材质的数组索引
| 名称 | 说明,对应于accessors索引 |
|---|---|
| NORMAL | 顶点的法线 |
| POSITION | 顶点的位置 |
| TEXCOORD_0 | 顶点的uv坐标 |
| TANGENT | 顶点的切线 |
| JOINTS_0 | 顶点受骨骼节点的约束 |
| WEIGHTS_0 | 顶点受骨骼节点约束的权重 |
该mesh包含7个网格,其中第一个网格包含顶点位置索引0,对应uv坐标索引1;对应accessors索引2,材质索引0

accessors
accessors访问器:是访问buffer的中间件,是bufferView和mesh之间的桥梁,表明bufferView的索引
| 名称 | 说明 |
|---|---|
| bufferView | 在bufferViews中的索引 |
| componentType | 数据类型 5120:byte; 5121:ubyte;5122:short; 5123:ushort;5124:int; 5125:uint; 5126:float; 5130:double |
| count | 数据个数 |
| type | 数据类型, ‘SCALAR’: 1,标量 ‘VEC2’: 2,‘VEC3’: 3,‘VEC4’: 4, 对应n维向量 ‘MAT2’: 4,‘MAT3’: 9‘MAT4’: 16, //n2维矩阵 |
| max | 所有的数据中最大值 |
| min | 所有的数据中最小值 |
该accessors 访问器包含多个中间件,其中
第一个中间件,对应bufferviews索引1,float类型,共9185个三维向量数据,最大最小值对应如下
第二个中间件,对应bufferviews索引2,float类型,共9185个二维向量数据,最大最小值对应如下
第三个中间件,对应bufferviews索引3,ushort类型,共18297个标量数据,最大最小值对应如下

bufferViews
bufferViews表明数据在buffer中的具体位置
| 名称 | 说明 |
|---|---|
| buffer | buffer数据的索引 |
| byteOffset | buffer的字节偏移量 |
| byteLength | buffer的字节长度 |
| target | 缓冲类型, 顶点属性 vertex attributes,34962,代表ARRAY_BUFFER 顶点索引 vertex indices, 34963,代表ELEMENT_ARRAY_BUFFER |
该bufferViews包含多个buffer
第一个buffer,数据索引0,偏移量0,字节长度56332
第二个buffer,数据索引0,偏移量56332,字节长度110220,缓冲类型:属性
第三个buffer,数据索引0,偏移量166552,字节长度73480,缓冲类型:属性
第四个buffer,数据索引0,偏移量240032,字节长度36594,缓冲类型:属性

buffers
buffers是buffer数组,每一个buffer存放真是数据,通常包含bytelength、uri、name字段,后两个不是必须的,将各属性打包成字节,通过偏移地址标记
| 名称 | 说明 |
|---|---|
| byteLength | buffer字节长度 |
| uri | buffer的二进制文件地址(非必须) |
| name | 名称(非必须) |
该buffers包含一个buffer
该buffer的字节长度为739328

materials
materials包含了模型绘制时需要的纹理信息
基础颜色必须包含使用 sRGB 光电传递函数编码的 8 位值,因此 RGB 值在用于任何计算之前必须解码为实际线性值。
金属度和粗糙度属性的纹理打包纹理中。其绿色通道包含粗糙度值,蓝色通道包含金属度值。此纹理必须使用线性传递函数进行编码,并且每个通道可以使用超过 8 位的位
| 名称 | 说明 |
|---|---|
| pbrMetallicRoughness | PBR相关参数 |
| baseColorTexture | 基础颜色,index对应texture的索引 |
| metallicFactor | 0~1,材质的金属度 |
| roughnessFactor | 0~1,材质的粗糙度 |
| extensions | 扩展库属性 |
扩展属性
| 名称 | 说明 |
|---|---|
| KHR_draco_mesh_compression | glTF 格式几何压缩库 |
| KHR_lights_punctual | 场景灯光,光源 |
| KHR_materials_anisotropy | 材料各项异性 |
| KHR_materials_clearcoat | 材料透明层 |
| KHR_materials_emissive_strength | 材料发光的颜色和强度 |
| KHR_materials_ior | 材料折射率 |
| KHR_materials_iridescence | 材料薄膜厚度和折射率 |
| KHR_materials_sheen | 材料光泽 |
| KHR_materials_specular | 材料粗糙度中的镜面反射和镜面颜色 |
| KHR_materials_transmission | 薄壳材料的光学透明度 |
| KHR_materials_unlit | 无光照着色模型 |
该材料属性,其包含多个PBR属性,
第一个PBR金属模型粗糙度,基础颜色索引0,金属度0,粗糙度0.5,扩展属性是无光照着色模型
第二个PBR金属模型粗糙度,基础颜色索引1,金属度0,粗糙度0.5,扩展属性是无光照着色模型
第三个PBR金属模型粗糙度,基础颜色索引2,金属度0,粗糙度0.5,扩展属性是无光照着色模型

textures
textures对应纹理信息,用于渲染对象的:纹理由材料引用以定义基本物体的颜色以及物理特性
包含两个参数source 对应纹理照片;sampler采样器
| 名称 | 说明 |
|---|---|
| source | 照片纹理 |
| sampler | 采样器 |
textures包含多个纹理
第一个纹理,照片索引0,采样器索引0
第二个纹理,照片索引1,采样器索引1
第三个纹理,照片索引2,采样器索引2

images
图片资源
| 名称 | 说明 |
|---|---|
| name | 名称 |
| uri | 指向纹理文件(对glb文件为空,通过给出的"bufferView"的索引) |
| bufferView | 纹理对应的索引 |
| mimeType | 图片格式 |
该images图片资源包括7个
图片1,图片索引0,图片格式jpeg
图片2,图片索引4,图片格式jpeg
图片3,图片索引8,图片格式jpeg

samplers
采样器,对应照片的滤波和环绕方式
| 名称 | 说明 |
|---|---|
| magFilter | 模型放大时,纹理滤波方式 |
| minFilter | 模型缩小时,纹理滤波方式 |
| wrapS | 纹理环绕方式 |
| wrapT | 纹理环绕方式 |
滤波方式
| 名称 | 值 | 说明 |
|---|---|---|
| GL_NEAREST | 9728 | 最临近插值(临近那个就是那个,单色) |
| GL_LINEAR | 9729 | 线性插值(使用周围多个线性插值,混合色) |
| GL_NEAREST_MIPMAP_NEAREST | 9984 | 最邻近的mipmap级别,临近插值采样 |
| GL_LINEAR_MIPMAP_NEAREST | 9985 | 最邻近的mipmap级别,线性插值采样 |
| GL_NEAREST_MIPMAP_LINEAR | 9986 | 两个最匹配像素的mipmap间线性插值,使用临近插值采样 |
| GL_LINEAR_MIPMAP_LINEAR | 9987 | 两个最匹配像素的mipmap间线性插值,使用线性插值采样 |
环绕方式
对纹理坐标范围超出对应纹理时的处理方式,即就是纹理坐标范围是0~1,当纹理坐标超出该值的处理方式
| 名称 | 值 | 说明 |
|---|---|---|
| GL_CLAMP_TO_EDGE | 33071 | 忽略边缘,超出部分直接使用边缘纹理,1.1处纹理使用1 |
| GL_MIRRORED_REPEAT | 33648 | 重复纹理,不过重复的图片是镜像方式的 |
| GL_REPEAT | 10497 | 重复纹理,即1.1处纹理和0.1处纹理一致 |
该处的采样器集合samplers,包含多个采样器,其采样器对应值一致
模型放大时滤波器使用线性插值,模型缩小时滤波器使用线性插值。

相关文章:
glb数据格式
glb数据格式 glb 文件格式只包含一个glb 文件,文件按照二进制存储,占空间小 浏览 浏览glb工具的很多,ccs,3D查看器等都可以,不安装软件的话用下面网页加载就可以,免费 glTF Viewer (donmccurdy.com) glb…...
手语识别系统源码分享
手语识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …...
Oracle 数据库部署与实施
文章目录 1. macOS 上部署 Oracle 数据库通过 Docker 在 macOS 上部署 2. Linux 上部署 Oracle 数据库直接在 Linux 上部署通过 Docker 在 Linux 上部署 3. Windows 上部署 Oracle 数据库4. 使用 Docker 部署 Oracle 数据库前提条件拉取 Oracle 数据库 Docker 镜像运行 Oracle …...
【Python】 ast.literal_eval 与 eval
一、背景 我在在编写管理后台的过程中,遇到一个小问题,是关于用户名的存储和解码。用户名以base64编码的形式存储在 MySQL 数据库中,并且还保留了b这样的形式,具体为什么要这样存我也不知道,可能是因为有些特殊字符无法直接存储。…...
Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器
文章目录 垃圾回收机制垃圾收集器垃圾收集器分类ZGC 收集器ZGC 的性能优势复制算法指针染色读屏障 ZGC 的工作过程Stop-The-World 暂停阶段并发阶段 垃圾回收机制 垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空…...
基于 K8S kubernetes 的常见日志收集方案
目录 1、日志对我们来说到底重不重要? 2、常见的日志收集方案 2.1 EFK 2.2 ELK Stack 2.3 ELKfilebeat 2.4 其他方案 2、elasticsearch组件介绍 3、filebeat组件介绍 3.1 filebeat和beat关系 3.2 filebeat是什么? 3.3 Filebeat工作原理 3.4 …...
Unity3D 小案例 像素贪吃蛇 02 蛇的觅食
Unity3D 小案例 像素贪吃蛇 第二期 蛇的觅食 像素贪吃蛇 食物生成 在场景中创建一个 2D 正方形,调整颜色,添加 Tag 并修改为 Food。 然后拖拽到 Assets 文件夹中变成预制体。 创建食物管理器 FoodManager.cs,添加单例,可以设置…...
【sgCreateCallAPIFunction】自定义小工具:敏捷开发→调用接口方法代码生成工具
<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">调用接口方法定义列表</div…...
京东商品详情的 API 探秘与应用
在当今数字化的商业世界中,获取准确而详细的商品信息对于开发者、商家以及消费者都具有至关重要的意义。京东作为国内领先的电商平台之一,提供了丰富的商品资源和强大的 API 接口,让我们能够轻松获取京东商品的详情信息。本文将带你深入了解如…...
功能测试干了三年,快要废了。。。
8年前刚进入到IT行业,到现在学习软件测试的人越来越多,所以在这我想结合自己的一些看法给大家提一些建议。 最近聊到软件测试的行业内卷,越来越多的转行和大学生进入测试行业,导致软件测试已经饱和了,想要获得更好的待…...
【C++】多态的认识和理解
个人主页 文章目录 ⭐一、多态的概念🎄二、多态的定义及实现1.多态的构成2.实现多态的条件3.虚函数的概念4.虚函数的重写和覆盖5.析构函数的重写6.协变7.override和 final关键字8.重载、重写/覆盖、隐藏这三者的区别 🏠三、纯虚函数和抽象类的关系&#…...
linux-安全管理-用户认证
Linux 安全管理:用户认证 一、概述 用户认证是 Linux 安全管理的核心部分,确保系统能够识别并验证合法用户,同时阻止未经授权的访问。Linux 提供了多种用户认证机制,包括用户名和密码认证、基于密钥的认证、双因素认证ÿ…...
webpack5 构建优化方案看这篇就够了!【Node.js进阶】
无论在面试还是内部晋升,webpack 构建优化方案 一直都是非常重要的部分。 webpack5构建加持 一、项目完成目标二、搭建项目1. 安装koa、koa/router (如果已经配置可路过)2. 创建入口文件3. 安装构建依赖4. 在项目根目录添加 .babelrc 文件5. …...
esp32-C2 对接火山引擎实现智能语音(一)
目录 一、火山引擎大模型简介 1)火山引擎网址: 2)首先需要先注册火山引擎账号 3)语音识别——即语音转为文本 一句话识别 流式语音识别 录音文件识别标准版 录音文件识别极速版 4)语音合成——文本转音频 一、火山引擎大模型简介 火山引擎的智能语音技术,基于业界先…...
【MySQL-初级】mysql基础操作(账户、数据库、表的增删查改)
概述 数据备份与恢复 数据库备份:在cmd下 root用户:sudo mysqldump -u root -p Test > Test.sql普通用户:mysqldump -u zzz -p db_name > db_name.sql 数据库恢复 先创建一个空的数据库在cmd下:sudo mysql -u root -p d…...
centos bash脚本一键运行安装go环境
复制到install_go.sh直接bash install_go.sh运行就完了 echo ----------安装go环境 wget https://go.dev/dl/go1.21.13.linux-amd64.tar.gz tar -zxvf go1.21.13.linux-amd64.tar.gzmkdir /srv cp -r go /srv/echo "PATH$PATH:/srv/go/bin ">> ~/.bashrc echo…...
vue2制作高复用页面
记录一下页面搭建记录,利用vue2组件化开发的思想。这个页面适合于大部分信息管理系统~。模板固定,每次使用,直接修改表单表格参数,api接口等。 以上图页面为例,一个基础数据信息页面可以分为,分类ÿ…...
Feed流系统重构:架构篇
重构对我而言,最大的乐趣在于解决问题。我曾参与一个C#彩票算奖系统的重构,那时系统常因超时引发用户投诉。接手任务时,我既激动又紧张,连续两天几乎废寝忘食地编码。结果令人振奋,算奖时间从一小时大幅缩短至十分钟。…...
Android 后台服务之Persistent 属性
在 Android 开发中,有时我们需要后台服务持续运行,以保持应用的某些功能。例如,音乐播放器需要在后台播放音乐,或者健康应用需要持续跟踪用户的运动数据。后台服务是 Android 中的一种组件,它不与用户界面交互,能够在后台执行长时间运行的任务。由于 Android 系统的资源管…...
STM32+ESP01连接到机智云
机智云,全球领先的智能硬件软件自助开发及物联网(iot)云服务平台。机智云平台为开发者提供了自助式智能硬件开发工具与开放的云端服务。通过傻瓜化的自助工具、完善的SDK与API服务能力最大限度降低了物联网硬件开发的技术门槛,降低开发者的研发成本,提升…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
