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服务能力最大限度降低了物联网硬件开发的技术门槛,降低开发者的研发成本,提升…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...