当前位置: 首页 > news >正文

glb数据格式

glb数据格式

glb 文件格式只包含一个glb 文件,文件按照二进制存储,占空间小

浏览

浏览glb工具的很多,ccs,3D查看器等都可以,不安装软件的话用下面网页加载就可以,免费

glTF Viewer (donmccurdy.com)

glbxz.com 模型网

GLTF 编辑器 -NSDT

image-20240916132645849

参考资料

完整的介绍文档可以参考以下几个

GLB文件 (sarkuya.com)

glTF 2.0 - Blender 4.2 手册

GLB (fileformat.com)

glTF Tutorial | glTF-Tutorials (khronos.org)

文件格式

开始正文介绍,二进制的glb文件打开后结构如下:

image-20240916134704827

整体结构的包含一个文件头,一个Json的chunk,一个bin的chunk存储图像,动画,纹理等

header

头部数据长度12个字节

#读取12个字节,按照小端,转换为无符号整数
header = f.read(12)
magic, version, length = struct.unpack('<III', header)
名称说明数值解释
magic魔术字0x46546C67对应ascII码glTF
version版本2GITF的版本
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

img

已知数据格式为JSON,所以将数据按照utf-8编码转换为对应的数据JSON数据,并打印出来

gltf_data = json.loads(json_chunk.decode('utf-8'))
print(json.dumps(gltf_data, indent=4))

对应打印值对应如下:

image-20240916141139346

接下来对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、targetbuffer对应得位置
buffers缓冲数据byteLength,uri、namebuffer的字节长度
materials材质baseColorTexture、metallicFactor、roughnessFactor、extensions材质参数,以及纹理索引
textures纹理source,sampler照片索引和采样器索引
images照片name、uri、bufferView、mimeType纹理文件索引,文件格式
samplers采样器magFilter、minFilter放大缩小时滤波器

scenes

对应模型得场景,一般模型一个场景,即默认场景;

每个场景包含一个node字段,指定了sence的根节点,

下图包含一个scene对象,该对应指定了一个索引为2的node节点

image-20240916152026773

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继承了器各个属性

img

image-20240916152107240

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

image-20240916153256371

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个标量数据,最大最小值对应如下

image-20240916162112679

bufferViews

bufferViews表明数据在buffer中的具体位置

名称说明
bufferbuffer数据的索引
byteOffsetbuffer的字节偏移量
byteLengthbuffer的字节长度
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,缓冲类型:属性

image-20240916162112679

buffers

buffers是buffer数组,每一个buffer存放真是数据,通常包含bytelength、uri、name字段,后两个不是必须的,将各属性打包成字节,通过偏移地址标记

名称说明
byteLengthbuffer字节长度
uribuffer的二进制文件地址(非必须)
name名称(非必须)

该buffers包含一个buffer

该buffer的字节长度为739328

image-20240916222858636

materials

materials包含了模型绘制时需要的纹理信息

基础颜色必须包含使用 sRGB 光电传递函数编码的 8 位值,因此 RGB 值在用于任何计算之前必须解码为实际线性值。

金属度和粗糙度属性的纹理打包纹理中。其绿色通道包含粗糙度值,蓝色通道包含金属度值。此纹理必须使用线性传递函数进行编码,并且每个通道可以使用超过 8 位的位

名称说明
pbrMetallicRoughnessPBR相关参数
baseColorTexture基础颜色,index对应texture的索引
metallicFactor0~1,材质的金属度
roughnessFactor0~1,材质的粗糙度
extensions扩展库属性

扩展属性

名称说明
KHR_draco_mesh_compressionglTF 格式几何压缩库
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,扩展属性是无光照着色模型

image-20240916223150363

textures

textures对应纹理信息,用于渲染对象的:纹理由材料引用以定义基本物体的颜色以及物理特性

包含两个参数source 对应纹理照片;sampler采样器

名称说明
source照片纹理
sampler采样器

textures包含多个纹理

第一个纹理,照片索引0,采样器索引0

第二个纹理,照片索引1,采样器索引1

第三个纹理,照片索引2,采样器索引2

image-20240916232759087

images

图片资源

名称说明
name名称
uri指向纹理文件(对glb文件为空,通过给出的"bufferView"的索引)
bufferView纹理对应的索引
mimeType图片格式

该images图片资源包括7个

图片1,图片索引0,图片格式jpeg

图片2,图片索引4,图片格式jpeg

图片3,图片索引8,图片格式jpeg

image-20240916233748518

samplers

采样器,对应照片的滤波和环绕方式

名称说明
magFilter模型放大时,纹理滤波方式
minFilter模型缩小时,纹理滤波方式
wrapS纹理环绕方式
wrapT纹理环绕方式

滤波方式

名称说明
GL_NEAREST9728最临近插值(临近那个就是那个,单色)
GL_LINEAR9729线性插值(使用周围多个线性插值,混合色)
GL_NEAREST_MIPMAP_NEAREST9984最邻近的mipmap级别,临近插值采样
GL_LINEAR_MIPMAP_NEAREST9985最邻近的mipmap级别,线性插值采样
GL_NEAREST_MIPMAP_LINEAR9986两个最匹配像素的mipmap间线性插值,使用临近插值采样
GL_LINEAR_MIPMAP_LINEAR9987两个最匹配像素的mipmap间线性插值,使用线性插值采样

环绕方式

对纹理坐标范围超出对应纹理时的处理方式,即就是纹理坐标范围是0~1,当纹理坐标超出该值的处理方式

名称说明
GL_CLAMP_TO_EDGE33071忽略边缘,超出部分直接使用边缘纹理,1.1处纹理使用1
GL_MIRRORED_REPEAT33648重复纹理,不过重复的图片是镜像方式的
GL_REPEAT10497重复纹理,即1.1处纹理和0.1处纹理一致

该处的采样器集合samplers,包含多个采样器,其采样器对应值一致

模型放大时滤波器使用线性插值,模型缩小时滤波器使用线性插值。

image-20240916234810978

相关文章:

glb数据格式

glb数据格式 glb 文件格式只包含一个glb 文件&#xff0c;文件按照二进制存储&#xff0c;占空间小 浏览 浏览glb工具的很多&#xff0c;ccs&#xff0c;3D查看器等都可以&#xff0c;不安装软件的话用下面网页加载就可以&#xff0c;免费 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

一、背景 我在在编写管理后台的过程中&#xff0c;遇到一个小问题&#xff0c;是关于用户名的存储和解码。用户名以base64编码的形式存储在 MySQL 数据库中&#xff0c;并且还保留了b这样的形式&#xff0c;具体为什么要这样存我也不知道,可能是因为有些特殊字符无法直接存储。…...

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器

文章目录 垃圾回收机制垃圾收集器垃圾收集器分类ZGC 收集器ZGC 的性能优势复制算法指针染色读屏障 ZGC 的工作过程Stop-The-World 暂停阶段并发阶段 垃圾回收机制 垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;&#xff0c;顾名思义就是释放垃圾占用的空…...

基于 K8S kubernetes 的常见日志收集方案

目录 1、日志对我们来说到底重不重要&#xff1f; 2、常见的日志收集方案 2.1 EFK 2.2 ELK Stack 2.3 ELKfilebeat 2.4 其他方案 2、elasticsearch组件介绍 3、filebeat组件介绍 3.1 filebeat和beat关系 3.2 filebeat是什么&#xff1f; 3.3 Filebeat工作原理 3.4 …...

Unity3D 小案例 像素贪吃蛇 02 蛇的觅食

Unity3D 小案例 像素贪吃蛇 第二期 蛇的觅食 像素贪吃蛇 食物生成 在场景中创建一个 2D 正方形&#xff0c;调整颜色&#xff0c;添加 Tag 并修改为 Food。 然后拖拽到 Assets 文件夹中变成预制体。 创建食物管理器 FoodManager.cs&#xff0c;添加单例&#xff0c;可以设置…...

【sgCreateCallAPIFunction】自定义小工具:敏捷开发→调用接口方法代码生成工具

<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">调用接口方法定义列表</div…...

京东商品详情的 API 探秘与应用

在当今数字化的商业世界中&#xff0c;获取准确而详细的商品信息对于开发者、商家以及消费者都具有至关重要的意义。京东作为国内领先的电商平台之一&#xff0c;提供了丰富的商品资源和强大的 API 接口&#xff0c;让我们能够轻松获取京东商品的详情信息。本文将带你深入了解如…...

功能测试干了三年,快要废了。。。

8年前刚进入到IT行业&#xff0c;到现在学习软件测试的人越来越多&#xff0c;所以在这我想结合自己的一些看法给大家提一些建议。 最近聊到软件测试的行业内卷&#xff0c;越来越多的转行和大学生进入测试行业&#xff0c;导致软件测试已经饱和了&#xff0c;想要获得更好的待…...

【C++】多态的认识和理解

个人主页 文章目录 ⭐一、多态的概念&#x1f384;二、多态的定义及实现1.多态的构成2.实现多态的条件3.虚函数的概念4.虚函数的重写和覆盖5.析构函数的重写6.协变7.override和 final关键字8.重载、重写/覆盖、隐藏这三者的区别 &#x1f3e0;三、纯虚函数和抽象类的关系&#…...

linux-安全管理-用户认证

Linux 安全管理&#xff1a;用户认证 一、概述 用户认证是 Linux 安全管理的核心部分&#xff0c;确保系统能够识别并验证合法用户&#xff0c;同时阻止未经授权的访问。Linux 提供了多种用户认证机制&#xff0c;包括用户名和密码认证、基于密钥的认证、双因素认证&#xff…...

webpack5 构建优化方案看这篇就够了!【Node.js进阶】

无论在面试还是内部晋升&#xff0c;webpack 构建优化方案 一直都是非常重要的部分。 webpack5构建加持 一、项目完成目标二、搭建项目1. 安装koa、koa/router &#xff08;如果已经配置可路过&#xff09;2. 创建入口文件3. 安装构建依赖4. 在项目根目录添加 .babelrc 文件5. …...

esp32-C2 对接火山引擎实现智能语音(一)

目录 一、火山引擎大模型简介 1)火山引擎网址: 2)首先需要先注册火山引擎账号 3)语音识别——即语音转为文本 一句话识别 流式语音识别 录音文件识别标准版 录音文件识别极速版 4)语音合成——文本转音频 一、火山引擎大模型简介 火山引擎的智能语音技术,基于业界先…...

【MySQL-初级】mysql基础操作(账户、数据库、表的增删查改)

概述 数据备份与恢复 数据库备份&#xff1a;在cmd下 root用户&#xff1a;sudo mysqldump -u root -p Test > Test.sql普通用户&#xff1a;mysqldump -u zzz -p db_name > db_name.sql 数据库恢复 先创建一个空的数据库在cmd下&#xff1a;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制作高复用页面

记录一下页面搭建记录&#xff0c;利用vue2组件化开发的思想。这个页面适合于大部分信息管理系统~。模板固定&#xff0c;每次使用&#xff0c;直接修改表单表格参数&#xff0c;api接口等。 以上图页面为例&#xff0c;一个基础数据信息页面可以分为&#xff0c;分类&#xff…...

Feed流系统重构:架构篇

重构对我而言&#xff0c;最大的乐趣在于解决问题。我曾参与一个C#彩票算奖系统的重构&#xff0c;那时系统常因超时引发用户投诉。接手任务时&#xff0c;我既激动又紧张&#xff0c;连续两天几乎废寝忘食地编码。结果令人振奋&#xff0c;算奖时间从一小时大幅缩短至十分钟。…...

Android 后台服务之Persistent 属性

在 Android 开发中,有时我们需要后台服务持续运行,以保持应用的某些功能。例如,音乐播放器需要在后台播放音乐,或者健康应用需要持续跟踪用户的运动数据。后台服务是 Android 中的一种组件,它不与用户界面交互,能够在后台执行长时间运行的任务。由于 Android 系统的资源管…...

STM32+ESP01连接到机智云

机智云,全球领先的智能硬件软件自助开发及物联网(iot)云服务平台。机智云平台为开发者提供了自助式智能硬件开发工具与开放的云端服务。通过傻瓜化的自助工具、完善的SDK与API服务能力最大限度降低了物联网硬件开发的技术门槛&#xff0c;降低开发者的研发成本&#xff0c;提升…...

电脑实时监控软件有哪些?七个电脑屏幕监控软件任你选择

电脑实时监控软件种类繁多&#xff0c;每款软件都有其独特的功能和适用场景。 以下是七个备受推荐的电脑屏幕监控软件&#xff0c;供您选择&#xff1a; 1.安企神&#xff1a; 功能&#xff1a;它是一款国内领先的企业级电脑监控解决方案&#xff0c; 提供实时屏幕监控、 文…...

信奥学习规划(CSP-J/S)

CSP-J组学习路线规划 CSP-S组学习规划...

【Linux取经之路】编译器gcc/g++的使用 调试器gdb的使用

目录 背景知识 编译器gcc/g的安装 编译器gcc/g的使用 调试器gdb的使用 cgdb 条件断点 背景知识 子曰&#xff1a;“温故而知新”。在谈gcc/g的使用之前&#xff0c;我们先来复习编译的4个阶段&#xff0c;也算是为下面的内容做一些铺垫&#xff0c;请看思维导图。 编译…...

自动化流程机器人(RPA)

自动化流程机器人&#xff08;RPA&#xff09;正逐渐成为企业提高效率和降低成本的强有力工具。 一、RPA的概念 自动化流程机器人&#xff08;Robotic Process Automation&#xff0c;简称RPA&#xff09;是一种利用软件机器人&#xff08;Robot&#xff09;模拟和执行复杂任务…...

Unity persistentDataPath使用案例

Unity persistentDataPath使用案例 一、Application.persistentDataPath 1、概念 persistentDataPath&#xff1a;此属性用于返回一个持久化数据存储目录的路径&#xff0c;可以在此路径下存储一些持久化的数据文件&#xff1b;是一个可读写的目录&#xff1b;此文件夹在Edi…...

Android 测试手册

1. 介绍 Android 测试是确保应用程序质量的重要步骤。它包括不同类型的测试&#xff0c;用于验证应用程序的功能、性能、安全性和用户体验。这个手册将指导你了解和实施 Android 测试的主要方法和工具。 2. 测试类型 2.1 单元测试 目的&#xff1a;验证单个组件&#xff08…...

各大平台统遭入侵??区块链市场遭攻击损失近3亿!

今年&#xff0c;全球发生多起骇人听闻的勒索入侵软件攻击事件&#xff0c;黑客组织利用各种手段和技术&#xff0c;不断试图突破网络安全防线&#xff0c;窃取敏感信息、破坏系统运行&#xff0c;甚至进行勒索和敲诈&#xff0c;使得网络安全问题日益凸显其重要性和紧迫性。 S…...

Java泛型(“代码模板”,一套代码套用各种类型)

1.什么是泛型 a.定义 i.如果不用泛型定义&#xff0c;在使用ArrayList时需要为每个class编写特定类型代码。 ii.泛型就是定义一种模板&#xff0c;既实现了编写一次&#xff0c;万能匹配&#xff0c;又通过编译器保证了类型安全。 iii.编写模板代码来适应任意…...

速响低代码平台:升级营销管理系统,开启高效无忧新体验!

当前日新月异的商业环境&#xff0c;企业面临着前所未有的挑战与机遇。随着市场竞争的日益加剧和企业业务的不断拓展&#xff0c;传统的营销方式和管理手段逐渐显露出其局限性&#xff0c;难以适应快速变化的市场需求。 数据收集难&#xff1a;传统的营销管理缺乏对客户数据的收…...

Gitlab升级14.0.12-->14.3.6遇到的gitlab-ctl reconfigure错误

问题描述 在按照官方文档升级路线11.0.2>17.2.2的过程中&#xff0c;升级14.0.12–》14.3.6时遇到一个错误&#xff1a; Running handlers: There was an error running gitlab-ctl reconfigure:rails_migration[gitlab-rails] (gitlab::database_migrations line 51) had…...