我是 www.v2ex.com/t/1151549 的作者,在csdn这边补全一些更多的信息
相关工具
主项目插件版本: "cesium": "^1.131.0",、"resium": "^1.19.0-beta.1"、"three": "^0.178.0"、"react": "^19.1.0"、"3d-tiles-renderer": "^0.4.13"
用ai写的给glb的顶点属性增加_BATCHID的脚本的插件依赖: "@gltf-transform/core": "^4.2.1","@gltf-transform/extensions": "^4.2.1"
npm版的非官方的那个3d-tiles-tools的版本: 1.0.0
官方3d-tiles-tools源码的版本"name": "3d-tiles-tools","version": "0.5.0",
失败的glb模型路线
最近有单子搞 web3d ,有个明确的需求是对"一个由多个模型组成的大模型"进行子模型级别的交互并更改材质颜色。这个需求原本和团队里人聊的很嗨,感觉实现很容易,实际上我(+ai )硬磨了 3 天半后,发现 resium 的 Entiy 、Model 都不行,感觉卡的够久了,就不再试试 Primitive 了,开始回头复盘哪里出了问题——blender 导出的 glb 模型,resium 倒是能拿到 node ,但很多都是不公开的变量,虽然 console 能打印,但我这边调研的定论是"cesium 不能对 glb 模型进行 node 级别的材质颜色修改",赋值能赋值成功,scene 重渲染就是不生效。
我这边为了防止自己对 ai 诱导型提问,豆包、通义灵码、gpt 三个混着用,第三天才想起来重新提问了大方向,明确了下一个调研方向.b3dm 的 3dtiles 。
3dtiles和.b3dm
让 gpt 写 @gltf-transform/core 的脚本失败率好高,总之基于 @gltf-transform/core 整了个脚本(这个是成功的),给 glb 的每个顶点属性加上"_BATCHID"。 用 3d-tiles-tools analyze (不是 cesium 官方的那个 3d-tiles-tools, 这里的是个 npm 包)验证了一下这个修改后的 glb 确实有了_BATCHID,下一步是把这个有 batchid 的 glb 做成有 batchTable 和 featureTable 的的.b3dm 。我尝试了一天一夜最终放弃了“让 ai 基于 @gltf-transform 去写上述要求的 glb 转.b3dm 方法”。下载了 cesium 官方的 3d-tiles-tools 源码, 用 src/tilesets/tileFormats/TileFormats 的 createB3dmTileDataFromGlb 方法搞了个脚本,成功做出了符合要求的.b3dm 。这个.b3dm 我 analyze 出来后的 xxx.batchTable.json 、xxx.featureTable.json 都是有正确的值的。对了,有个在线分析 glb 是否合规的,是 glTF Validator ,再加上官方的 3d-tiles-tools 能确保 ai 不会捣乱出非法的 glb 、.b3dm (走了很多弯路,我真信了 ai 给我搓了个验证脚本,迭代了半天然后放弃了)。tileset.json 的话,我这波调研是能跑就行,用 3d-tiles-tools 随便生成了一个,坐标什么的我自己在 resium 里用代码矫正。最终,我用 resium 的 Cesium3DTileset 接入这个 3dtiles 后,成功 pick 到了一个 Cesium3DTileFeature 对象,pickedObject.getProperty('name')也有值了,可以通过 tile 的 Cesium3DTileStyle 批处理改材质颜色了。