如何用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
相关产品推荐
相关产品推荐

