首页 > 其他分享 >探索 GLTF 文件格式规范:从零开始解析

探索 GLTF 文件格式规范:从零开始解析

时间:2024-12-31 13:56:56浏览次数:3  
标签:文件 gltfData const -- 从零开始 文件格式 nodes GLTF

GLTF(GL Transmission Format)是一种专为高效传输和渲染 3D 模型设计的文件格式。今天,我们将以一次深入解析 GLTF 文件的过程,带你全面了解它的结构、关联方式以及使用方式。

一、初识 GLTF 文件

在开始我的介绍之前,我先放一张官方的图片,上面使用图形化的方式描述了gltf的格式规范(英文的),各位看官可以在官方网站上找到这张图:

GLTF 文件通常以 .gltf.glb 作为后缀名,其中 .gltf 是 JSON 格式文件,可能会附带二进制文件(.bin)和图片素材;而 .glb 则是将所有数据整合成一个二进制文件。

解析的第一步是加载 JSON 文件,我们以 Node.js 为例:

const fs = require('fs');

const gltfPath = './model.gltf';
const gltfData = JSON.parse(fs.readFileSync(gltfPath, 'utf-8'));
console.log('GLTF 文件内容:', gltfData);

读取后的文件内容是一个包含多个字段的 JSON 结构:asset 描述文件信息,scenes 定义场景结构,nodes 是场景中具体的节点等。

二、核心数据结构与关联
1. scenesnodes

scenes 是 GLTF 的入口,每个场景会引用若干节点(nodes)。

"scenes": [
  {
    "nodes": [0]
  }
],
"nodes": [
  {
    "name": "RootNode",
    "children": [1, 2]
  },
  {
    "mesh": 0
  },
  {
    "mesh": 1
  }
]

关联关系图

Scene (0) --> Node (0: RootNode)
                |--> Node (1: Mesh 0)
                |--> Node (2: Mesh 1)

在代码中,我们可以递归解析场景和节点:

function traverseNodes(nodes, currentNodeIndex) {
  const node = nodes[currentNodeIndex];
  console.log('Node:', node.name);
​
  if (node.children) {
    node.children.forEach(childIndex => traverseNodes(nodes, childIndex));
  }
}
​
const nodes = gltfData.nodes;
gltfData.scenes[0].nodes.forEach(nodeIndex => traverseNodes(nodes, nodeIndex));
2. meshesprimitives

meshes 定义几何数据,它由一个或多个 primitives 构成,而 primitives 包含顶点属性和材质信息。

"meshes": [
  {
    "primitives": [
      {
        "attributes": {
          "POSITION": 0,
          "NORMAL": 1
        },
        "indices": 2,
        "material": 0
      }
    ]
  }
]
  • POSITION: 定义顶点位置。

  • NORMAL: 定义法线方向。

  • indices: 定义三角形索引。

关联关系图

Mesh --> Primitive --> Attributes (POSITION, NORMAL, ...) --> Accessors --> BufferViews --> Buffers
3. buffersbufferViews

顶点、索引等数据存储在二进制文件中,通过 buffers 字段引用。

"buffers": [
  {
    "uri": "model.bin",
    "byteLength": 1024
  }
],
"bufferViews": [
  {
    "buffer": 0,
    "byteOffset": 0,
    "byteLength": 512,
    "target": 34963
  }
]

关联示意图

Buffer (model.bin) --> BufferView (byteOffset, byteLength)

通过 Node.js 加载并解析 buffer 数据:

const bufferData = fs.readFileSync('./model.bin');
const bufferView = gltfData.bufferViews[0];
const extractedData = bufferData.slice(
  bufferView.byteOffset,
  bufferView.byteOffset + bufferView.byteLength
);
console.log('提取的二进制数据:', extractedData);
4. materialstextures

materials 定义了模型的材质属性,包括金属度、粗糙度等,而 textures 则关联了图片数据。

"materials": [
  {
    "pbrMetallicRoughness": {
      "baseColorTexture": {
        "index": 0
      }
    }
  }
],
"textures": [
  {
    "source": 0
  }
],
"images": [
  {
    "uri": "texture.png"
  }
]

关联流程

Material --> Texture --> Image (texture.png)
三、构建图形化示意图

以下是关联关系的总体结构图:

  1. 顶层结构:场景与节点

Scene --> Nodes --> Meshes
  1. 几何数据路径

Mesh --> Primitive --> Attributes --> Accessors --> BufferViews --> Buffers
  1. 材质与纹理路径

Material --> Texture --> Image
四、完整解析示例

将以上模块结合起来,我们可以解析完整的 GLTF 模型。

function parseGLTF(gltfPath, binPath) {
  const gltfData = JSON.parse(fs.readFileSync(gltfPath, 'utf-8'));
  const bufferData = fs.readFileSync(binPath);
​
  gltfData.scenes.forEach(scene => {
    console.log('Scene:', scene);
    scene.nodes.forEach(nodeIndex => {
      traverseNodes(gltfData.nodes, nodeIndex);
    });
  });
​
  gltfData.meshes.forEach(mesh => {
    mesh.primitives.forEach(primitive => {
      const positionAccessor = gltfData.accessors[primitive.attributes.POSITION];
      const positionBufferView = gltfData.bufferViews[positionAccessor.bufferView];
      const positionData = bufferData.slice(
        positionBufferView.byteOffset,
        positionBufferView.byteOffset + positionBufferView.byteLength
      );
      console.log('顶点位置数据:', positionData);
    });
  });
}
​
parseGLTF('./model.gltf', './model.bin');

通过上述代码,我们完成了从场景到几何数据、再到材质与纹理的完整解析。

五、在线预览GLTF 3D文件
  1. NSDT gltfviewer gltf glb文件的在线预览

  2. NSDT 3Dconvert是一个可以进行3D模型格式转换的在线工具,支持多种3D模型格式在线预览和格式转换,支持将模型转换为GLTF、OBJ、GLB、PLY、STL、XYZ、OFF、DAE等格式。 NSDT 3Dconvert支持GLB、GLTF、PLY、STL、OBJ、OFF、DAE、FBX、DXF、IFC、XYZ、PCD、 LAS、LAZ、STP、STEP、3DXML、IGES、IGS、SHP、GEOJSON、XAML、PTS、ASC、 BREP、FCSTD、BIM、USDZ和PDB等源格式。 NSDT 3Dconvert提供Revit、MicroStation等设计软件插件,通过插件将RVT、RFA、DGN等设计文件进行在线预览和格式转换。

结语

GLTF 文件格式通过其模块化设计,提供了一种高效传输和渲染 3D 模型的方式。从场景节点到几何数据、从材质到纹理,每个部分都有清晰的关联路径。这种结构化的格式不仅易于解析,也为高性能渲染提供了保障。如果你还没有尝试过 GLTF 文件,不妨用本文的示例从零开始解析一次!

标签:文件,gltfData,const,--,从零开始,文件格式,nodes,GLTF
From: https://blog.csdn.net/weixin_35760413/article/details/144830815

相关文章

  • Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等
    ❤️如果你也关注AI的发展现状,且对AI应用开发非常感兴趣,我会每日跟你分享最新的AI资讯和开源应用,也会不定期分享自己的想法和开源实例,欢迎关注我哦!......
  • 【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么
    文章目录前言**游戏引擎是什么?****游戏引擎对于我们的意义**1、**降低游戏开发的门槛**2、**提升游戏开发效率****以前做游戏****现在做游戏****主流的游戏引擎有哪些?**Unity相比其他游戏引擎的优势?**为什么选择Unity?**Unity游戏市场占比unity发展前景刚发布不久的Unit......
  • 爱思唯尔上传回复意见文件格式说明
    爱思唯尔上传回复意见文件格式说明以下是对这些文件的含义解释:DetailedResponsetoReviewers这是一份针对审稿人意见的详细回复文件。当向学术期刊、会议等投稿后,审稿人会给出相应的评审意见,作者需要撰写这份文件来逐条回应审稿人的疑问、建议以及意见,说明自己针对每一......
  • 《商业分析方法论与实践指南》---从零开始学习
    前言1.什么是真正的商业分析:答:懂业务、懂数据、懂方法论2.学习完整本书,应该收获什么?答:构成商业分析知识体系+形成商业分析全景图第一章:什么是商业分析1.1商业分析思维1.2如何培养出商业分析的思维注重逻辑:把大问题肢解成若干小问题,形成结构化、框架化、分支化,解决问......
  • 从零开始搭建SpringBoot项目
    一、创建SpringBoot项目二、上一步填写完信息后点击Next,进入选择依赖库界面,在这里大家就可以选择我们开发当中要使用到的如:数据库驱动,技术,框架等等。(下面是大多项目中会使用到的技术,可以根据项目选择会用的插件)三、给IDEA安装插件:需要给IDEA安装的插件一共有两个,一个是用来......
  • 从零开始手把手教你写一个基于nRF54L15的BLE工程
     最近收到了Nordic最新的旗舰级BLE芯片nRF54L15的开发板,大概研究了一下,今天教大家怎么在上面把BLE跑起来。前言:开发板概览 1、打开包装之后里面是用防静电袋包装的开发板和NFC天线,nRF54L15DK的代号是PCA10156,但是nRF54L15的开发板对比nRF52832的开发板来看,nRF54L15的开发板没......
  • GitHub已有本地项目如何建仓库并上传到服务器——从零开始
    1.首先登录github并在自己的首页找到repository>Createanewrepository 2.找到本地项目根目录gitinit3.克隆远程仓库gitclonegit@github.com:yourName/yourProject.git4.添加忽略文件以要忽略一个“test”文件夹为例方法1)需要在项目的根目录下创建或......
  • 循规蹈矩--从零开始建设k8s监控(一)
    前言监控k8s集群,目前主流就是使用prometheus以及其周围的生态,本文开始介绍怎么一步步完成k8s监控的建设环境准备组件版本操作系统Ubuntu22.04.4LTSminikubev1.30.1docker24.0.7prometheusv2.54.1kube-state-metricsv2.13.0node-exporterv1.8.2......
  • ​如何从零开始学习大模型等人工智能算法
    学习人工智能可以分为几个关键步骤。以下是一个从零开始学习人工智能的指南:前排提示,文末有大模型AGI-CSDN独家资料包哦!建立数学和统计基础:学习线性代数,了解矩阵、向量、矩阵运算等基本概念。掌握微积分,包括导数和积分,对于理解机器学习算法中的优化过程很重要。理解......
  • GIS 文件格式 及 常规应用总结
    文章目录GIS中常见的文件格式以及再次打开注意事项资源网站应用地图瓦片数据地形数据倾斜模型QGS应用矢量数据格式栅格数据格式数据库格式更改图层样式更改图层范围导出为不同分辨率图片导出矢量文件直接保存图层通过打印布局导出使用插件导出tiff图片前端处理方......