You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python将b3dm文件转换为gltf?py3dtiles导入报错求解决

用Python将b3dm转换为gltf/glb的可行方案

一、解决py3dtiles的导入错误

你使用的py3dtiles 1.0.2版本已移除TileContentReader类,新版本API做了调整。正确读取b3dm文件的方式是直接使用B3dm类:

import py3dtiles

# 读取b3dm文件
with open('/the/input.b3dm', 'rb') as f:
    b3dm_data = f.read()

b3dm = py3dtiles.B3dm.from_bytes(b3dm_data)

二、提取b3dm中的glb数据并转换为gltf

b3dm本质是3D Tiles的容器格式,内部封装了二进制gltf(glb)数据,只需提取这部分内容即可完成转换:

方法1:结合py3dtiles与pygltflib处理

import py3dtiles
from pygltflib import GLTF2

# 读取b3dm文件
with open('/the/input.b3dm', 'rb') as f:
    b3dm = py3dtiles.B3dm.from_bytes(f.read())

# 提取内部的glb二进制数据
glb_data = b3dm.body.glb_data

# 保存为glb文件
glb_path = '/the/result.glb'
with open(glb_path, 'wb') as f:
    f.write(glb_data)

# 加载glb并转为JSON格式的gltf(可选)
gltf = GLTF2.load(glb_path)
gltf.save('/the/result.gltf')

方法2:手动解析b3dm头部(无需依赖py3dtiles)

b3dm头部长度固定为28字节,可直接跳过头部读取后续的glb数据:

from pygltflib import GLTF2

b3dm_path = '/the/input.b3dm'
glb_path = '/the/result.glb'
HEADER_LENGTH = 28  # b3dm头部固定长度

with open(b3dm_path, 'rb') as f:
    f.seek(HEADER_LENGTH)  # 跳过头部
    glb_data = f.read()

# 保存glb文件
with open(glb_path, 'wb') as f:
    f.write(glb_data)

# 加载并处理gltf
gltf = GLTF2.load(glb_path)

三、验证转换结果

转换完成后,可使用gltf-validator工具检查生成的glb/gltf文件是否合法,避免数据损坏。


内容的提问来源于stack exchange,提问作者Daniel van der Maas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:13:22