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. scenes
和 nodes
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. meshes
和 primitives
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. buffers
和 bufferViews
顶点、索引等数据存储在二进制文件中,通过 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. materials
和 textures
materials
定义了模型的材质属性,包括金属度、粗糙度等,而 textures
则关联了图片数据。
-
“materials”: [
-
{
-
“pbrMetallicRoughness”: {
-
“baseColorTexture”: {
-
“index”: 0
-
}
-
}
-
}
-
],
-
“textures”: [
-
{
-
“source”: 0
-
}
-
],
-
“images”: [
-
{
-
“uri”: “texture.png”
-
}
-
]
关联流程:
Material --> Texture --> Image (texture.png)
三、构建图形化示意图
以下是关联关系的总体结构图:
- 顶层结构:场景与节点
Scene --> Nodes --> Meshes
- 几何数据路径
Mesh --> Primitive --> Attributes --> Accessors --> BufferViews --> Buffers
- 材质与纹理路径
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’);
通过上述代码,我们完成了从场景到几何数据、再到材质与纹理的完整解析。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性
GLB下载网(glbxz.com)gltf文件下载-glb格式下载-模型制作 » 探索 GLTF 文件格式规范:从零开始解析
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性
GLB下载网(glbxz.com)gltf文件下载-glb格式下载-模型制作 » 探索 GLTF 文件格式规范:从零开始解析
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载要提取码
- 分享过期和重复下载怎么办
- 模型和平台不兼容怎么办