GLTF: 如何直观地看到文件中的数据内容

前言

GLTF 把几何数据都存到了 bin 文件里面,数据量是变少了,但是可读性也变差了。有什么办法,可以查看里面的具体数据呢?有时候从某软件把数据导出成 GLTF 格式,发现少了一些几何图形或者是纹理不对,如何找到具体问题呢?

解决方案

用官方的 GLTF-Viewer 来查看:https://github.com/KhronosGroup/glTF-Sample-Viewer
下面用简单的贴图立方体做例子,看看它的数据是如何从 gltf 文件中读取的。
在这里插入图片描述
找到它对应的文件位置:
https://github.com/KhronosGroup/glTF-Sample-Models/blob/master/2.0/BoxTextured/glTF/BoxTextured.gltf
截取 meshesaccessors

    "meshes": [
        {
            "primitives": [
                {
                    "attributes": {
                        "NORMAL": 1,
                        "POSITION": 2,
                        "TEXCOORD_0": 3
                    },
                    "indices": 0,
                    "mode": 4,
                    "material": 0
                }
            ],
            "name": "Mesh"
        }
    ],
    "accessors": [
        {
            "bufferView": 0,
            "byteOffset": 0,
            "componentType": 5123,
            "count": 36,
            "max": [
                23
            ],
            "min": [
                0
            ],
            "type": "SCALAR"
        },
        {
            "bufferView": 1,
            "byteOffset": 0,
            "componentType": 5126,
            "count": 24,
            "max": [
                1.0,
                1.0,
                1.0
            ],
            "min": [
                -1.0,
                -1.0,
                -1.0
            ],
            "type": "VEC3"
        },
        {
            "bufferView": 1,
            "byteOffset": 288,
            "componentType": 5126,
            "count": 24,
            "max": [
                0.5,
                0.5,
                0.5
            ],
            "min": [
                -0.5,
                -0.5,
                -0.5
            ],
            "type": "VEC3"
        },
        {
            "bufferView": 2,
            "byteOffset": 0,
            "componentType": 5126,
            "count": 24,
            "max": [
                6.0,
                1.0
            ],
            "min": [
                0.0,
                0.0
            ],
            "type": "VEC2"
        }
    ],

对于一个立方体,它的表示包括:

  1. 索引 indices
  2. 法向量 NORMAL
  3. 位置 POSITION
  4. 纹理坐标 TEXCOORD_0

这些步骤都在:https://github.khronos.org/source/Renderer/webgl.js
用浏览器打开:https://github.khronos.org/glTF-Sample-Viewer-Release/
按 F12 进入调试模式。

获取索引号:
在这里插入图片描述
对应上文中的 accessors 第0号元素。

获取法向量:
在这里插入图片描述
对应上文中的 accessors 第1号元素。

获取位置:
在这里插入图片描述
对应上文中的 accessors 第2号元素。

或者纹理坐标:
在这里插入图片描述
对应上文中的 accessors 第3号元素。

从中可以看出获取法向量、位置和纹理坐标用的是同一种方法,从文件中也可以看出他们都是 primitivesattributes

结论

GLTF 作为一种开放格式,提供的 viewer 是一个很棒的工具。要好好利用起来解决日常工作中遇到的问题。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 C++ ,可以使用第三方库来加载 glTF 文件及其相关的二进制数据文件(.bin 文件),其比较常用的有: - Assimp:一个开源的 3D 模型导入库,支持导入多种格式的 3D 模型文件,包括 glTF 和其相关的二进制数据文件。可以使用 Assimp 加载 glTF 文件并访问其包含的二进制数据文件。 - tinygltf:一个轻量级的 glTF 2.0 加载/导出库,支持加载 glTF 文件及其相关的二进制数据文件,并提供对 glTF 数据的访问接口。 下面以 Assimp 为例,介绍如何加载 glTF 文件及其相关的二进制数据文件。 首先需要安装 Assimp 库,可以从其官网 https://www.assimp.org/downloads.html 下载并安装。安装完成后,可以在代码引入以下头文件: ```cpp #include <assimp/Importer.hpp> #include <assimp/scene.h> #include <assimp/postprocess.h> ``` 然后使用以下代码可以加载 glTF 文件及其相关的二进制数据文件: ```cpp Assimp::Importer importer; const aiScene* scene = importer.ReadFile("model.gltf", aiProcess_GenNormals | aiProcess_Triangulate); ``` 其,第一个参数是 glTF 文件的路径,第二个参数是一些 Assimp 的导入选项。加载完成后,可以通过以下代码访问二进制数据: ```cpp const aiNode* rootNode = scene->mRootNode; for (unsigned int i = 0; i < rootNode->mNumChildren; i++) { const aiNode* childNode = rootNode->mChildren[i]; for (unsigned int j = 0; j < childNode->mNumMeshes; j++) { const aiMesh* mesh = scene->mMeshes[childNode->mMeshes[j]]; const aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex]; for (unsigned int k = 0; k < mesh->mNumVertices; k++) { aiVector3D vertex = mesh->mVertices[k]; // 访问顶点坐标 } for (unsigned int k = 0; k < mesh->mNumFaces; k++) { const aiFace& face = mesh->mFaces[k]; for (unsigned int l = 0; l < face.mNumIndices; l++) { unsigned int index = face.mIndices[l]; // 访问顶点索引 } } aiString texturePath; if (material->GetTexture(aiTextureType_DIFFUSE, 0, &texturePath) == AI_SUCCESS) { // 访问纹理路径 } // 访问其他二进制数据 } } ``` 这里只是简单地列举了一些访问二进制数据的代码,具体的访问方式还需要根据 glTF 文件的具体结构和需要访问的数据类型来确定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客BIM工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值