场景:工厂数字孪生 / BIM Web 可视化 / 压缩后需保留节点树和命名供交互查询。坑:多数压缩工具的场景图优化(合并实例/剔除节点)会毁掉层级。方案如下。
核心原理
几何压缩(量化/索引重排) → 不碰场景图,安全 场景图优化(合并/剔除/重排) → 工业场景的层级杀手选工具先看有没有「保留命名节点」开关。Zipoly 桌面版 Meshopt 引擎下有此项,配置口诀:
保留命名节点 = 开(工业/BIM 保留层级结构) 合并网格实例 = 关(那是游戏资产的需求,减 Draw Call 用的)两引擎分工
# 1) Draco 打底做几何压缩(强度7,精度敏感件手动上调位置 bit)# 量化参数: 位置/法线/UV 各 4-16bit(高级量化参数面板)# 2) Meshopt 过一遍做结构处理(保留命名开、合并关)几何压缩率参考(公开任务日志口径):10.6MB / 27.8 万顶点 → 596KB(-94.5%)。
交付前三道验证
// 压前:导出节点清单(Three.js)constnames=[];scene.traverse(o=>names.push(o.name));localStorage.setItem('preCompress',JSON.stringify(names));// 压后:diff 比对constpre=JSON.parse(localStorage.getItem('preCompress'));constpost=[];scene.traverse(o=>post.push(o.name));constlost=pre.filter(n=>n&&!post.includes(n));if(lost.length)console.error('层级丢失:',lost);// 第三道:交互抽测(点击查询/构件高亮/属性绑定)三个必踩的坑
坑 1:OBJ 中转丢层级。OBJ 是单网格格式,天生不带层级——流程里经过 OBJ,层级在那一步就没了,与压缩工具无关。工业模型全程 glTF/GLB。
坑 2:IFC 转换器默认合并。IFC 转 glTF 的部分转换器会合并同类构件省体积,构件分离没了。选转换器时确认保持构件分离。
坑 3:超大单文件。整栋楼一个 BIM 文件超 50 MB 免费上限,按楼层/分区拆分再压——顺带方便 Web 端按需加载。
什么情况别硬压
工程测量场景:量化误差(毫米级)不可接受,位置 16bit 拉满后收益已薄,保原始精度只压贴图。十几层深且层层交互的设备树:只做几何量化、跳过全部场景图选项,必要时保原始文件——交互正确性 > 加载速度。
结论
保留命名开、合并实例关、前后 diff、避开 OBJ 中转。压缩率和结构完整可以兼得,参数为工业场景配。
BIM 压缩的具体问题评论区丢。