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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/142650.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Makefile 学习笔记(一)gcc编译过程

环境准备 .linux 系统(虚拟机) VS code linux 编译过程 预处理: 把.h .c 展开形成一个文件.宏定义直接替换 头文件 库文件 .i 汇编&#xff1a; .i 生成一个汇编代码文件 .S 编译&#xff1a; .S 生成一个 .o .obj 链接: .o 链接 .exe .elf gcc c语言 g c语言 gcc的使用 …

MySQL之表内容的增删改查(含oracel 9i经典测试雇佣表下载)

目录 一:Create 二:Retrieve 1.select列 2.where条件 3.结果排序 4. 筛选分页结果 三:Update 四:Delete 1.删除数据 2. 截断表 五&#xff1a;插入查询结果 六&#xff1a;聚合函数 七:group by子句的使用 表内容的CRUD操作 : Create(创建), Retrieve(读取)…

数据结构之栈(python)

栈&#xff08;顺序栈与链栈&#xff09; 1.栈存储结构1.1栈的基本介绍1.2进栈和出栈1.3栈的具体实现1.4栈的应用例一例二例三 2.顺序栈及基本操作&#xff08;包含入栈和出栈&#xff09;2.1顺序栈的基础介绍2.2顺序栈元素入栈2.3顺序栈元素出栈2.4顺序栈的表示和实现 3.链栈及…

吐血整理资料后,测试面试相关的资料大全

最近假期收集资料的过程真的让我吐血。 在博客上随便搜一点资料&#xff0c;好多只能看一般&#xff0c;或者打着分享资源&#xff0c;但实际上并不是了。而且大部分资料就是网上找的&#xff0c;恰饭不好评价&#xff0c;但体验真的好差啊&#xff01; 我搜集了很多面试资料…

流程图怎么画?3个好用的在线流程图软件推荐,绘图没烦恼!

目录 什么是流程图&#xff1f; 为什么需要使用流程图&#xff1f; 流程图中各种图形的含义 如何制作流程图&#xff1f; 小结&#xff1a;流程图如何制作&#xff1f; 流程图是表达工作流程或者系统操作过程的有效工具&#xff0c;被广泛应用于各个行业和领域。…

Centos7环境下Hive的安装

Centos7环境下Hive的安装 前言一、安装Hive1.1 下载并解压1.2 配置环境变量1.3 修改配置1. hive-env.sh2. hive-site.xml 1.4 拷贝数据库驱动1.5 初始化元数据库报错 1.6 安装MySQL1.7 启动 二、HiveServer2/beeline2.1 修改Hadoop配置2.2 修改Hive配置2.2 启动hiveserver22.3 …

2024/9/16 dataloader、tensorboard、transform

一、pytorch两大法宝元素 假设有一个名为pytorch的包 dir()&#xff1a;用于打开包&#xff0c;看里面的内容 help():用于查看具体的内容的用处 二、python文件&#xff0c;python控制台和jupyter的使用对比 三、pytorch读取数据 pytorch读取数据主要涉及到两个类&#xff1…

基于 PyQt5 和 OpenCV 进行图像处理操作的GUI工具初版

为了实现一个基于 PyQt5 和 OpenCV 的图形用户界面&#xff08;GUI&#xff09;&#xff0c;要求如下&#xff1a; 左边显示加载的图片。 中间提供各种对图片进行处理的操作方法&#xff08;如灰度化、模糊处理等&#xff09;。 右边显示处理后的效果图。 接下来我将详细讲解如…

【C语言零基础入门篇 - 5】:探索C语言中丰富多样的选择和循环结构

文章目录 选择分支结构if选择结构if...else...选择结构if...else if...else 嵌套选择结构switch多分支结构 循环结构for 循环while 循环do … while 循环 跳转语句 选择分支结构 if选择结构 基本格式&#xff1a;if&#xff08;表达式1)语句1; 功能&#xff1a;如果表达式1…

坚持的力量--完成向CSDN迁移500篇技术文章阶段小记-以此自勉

前言&#xff1a;本文为迁移前的博客中的文章《坚持的力量-写给第1000篇文章笔记》发表于 publish:May 14, 2021 -Friday&#xff0c;作为原个人博客中累计写满1000篇文章的总结和鼓励。因在向CSDN迁移文章的过程中进行了一些文章合并等调整&#xff0c;总文数大量下降&#xf…

【建设方案】固定资产信息系统建设方案(功能清单列表2024word原件)

固定资产管理系统需求要点&#xff1a; 1. 实现公司内部固定资产管理全生命周期管理&#xff0c;包括资产采购、资产入库、资产领用、资产借用、资产归还、资产报废、资产维修、资产调拨等全过程管理。 2. 可实现集团内部固定资产盘点管理&#xff0c;包括盘点计划、盘点查询等…

Python数据分析与可视化的全面指南

目录 引言 一、Python数据分析基础 1. 为什么选择Python进行数据分析&#xff1f; 2. 常用的数据分析库 二、环境配置 1. 安装Python 2. 安装Anaconda&#xff08;可选&#xff09; 3. 创建虚拟环境 4. 安装必要的库 三、数据分析流程 四、数据处理与分析 1. 导入库…

【PHP代码审计】PHP基础知识

&#x1f31d;博客主页&#xff1a;菜鸟小羊 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 php简介 php是什么&#xff1f; php&#xff08;全称&#xff1a;Hypertext Preprocessor&#xff0c;即超文本预处理器&…

圆环加载效果

效果预览 代码实现 from PyQt5.QtCore import QSize, pyqtProperty, QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QColor, QPainter from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QVBoxLayout, QLabel, QGridLayoutclass Cir…

数据与结构算法平衡二叉树详解叉树--基本概念

平衡二叉树&#xff08;Balanced Binary Tree&#xff09;又被称为AVL树&#xff08;有别于AVL算法&#xff09;&#xff0c;且具有以下性质&#xff1a;它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1&#xff0c;并且左右两个子树都是一棵平衡二叉树。这个方案很好…

图解Redis 01 | 初识Redis

什么是 Redis&#xff1f; Redis 是一种基于内存的数据库&#xff0c;所有的数据读写操作都在内存中完成&#xff0c;因此读写速度非常快。它被广泛应用于缓存、消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务需求&#xff0c;如 String、Hash、List、…

环形数组与单向链表的队列实现(Queue)

什么是队列 队列是一种重要的线性数据结构&#xff0c;具有先进先出&#xff08;FIFO&#xff09;的特性。元素的插入操作称为入队&#xff0c;删除操作称为出队。队列在许多计算机科学应用中非常常见&#xff0c;如任务调度和数据缓冲等。 在实现队列时&#xff0c;可…

路由策略PBR

文章目录 策略路由PBR概述本地流量接口策略 策略路由 策略路由和路由策略的区别&#xff1a; 策略路由可以不按照路由表进行转发路由策略主要控制路由信息的引入、发布和接受等&#xff0c;主要靠 RIB和FIB PBR概述 比路由策略耗资源&#xff0c;直接跳过路由表&#xff0c;数…

Pytorch详解-模型模块(RNN,CNN,FNN,LSTM,GRU,TCN,Transformer)

Pytorch详解-模型模块 Module & parameterModule初认识forward函数 ParameterPytorch中的权重、参数和超参数 Module容器-ContainersSequentialModuleListModuleDictParameterList & ParameterDict 常用网络层LSTM输入和输出 GRUConvolutional Layers卷积层的基本概念常…

IP协议及相关特性

IP协议负责地址管理和路由选择。它的组成为&#xff1a; 接下来我们将对其中较重要的部分进行介绍。 4位版本&#xff1a;这里的四位版本只有两个取值 分别为IPv4和IPv6&#xff0c;这两个额分别为不同的IP协议&#xff0c;但是现在主流的还是IPv4但是近年来IPv6在中国的普及率…