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服务能力最大限度降低了物联网硬件开发的技术门槛,降低开发者的研发成本,提升…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
