开个见闻分享(+咨询)的帖子。
最近有单子搞 web3d ,有个明确的需求是对"一个由多个模型组成的大模型"进行子模型级别的交互并更改材质颜色。这个需求原本和团队里人聊的很嗨,感觉实现很容易,实际上我(+ai )硬磨了 3 天半后,发现 resium 的 Entiy 、Model 都不行,感觉卡的够久了,就不再试试 Primitive 了,开始回头复盘哪里出了问题——blender 导出的 glb 模型,resium 倒是能拿到 node ,但很多都是不公开的变量,虽然 console 能打印,但我这边调研的定论是"cesium 不能对 glb 模型进行 node 级别的材质颜色修改",赋值能赋值成功,scene 重渲染就是不生效(有实力的 v 友欢迎分享经验,我这块纯小白,靠 ai 硬撑)。
我这边为了防止自己对 ai 诱导型提问,豆包、通义灵码、gpt 三个混着用,第三天才想起来重新提问了大方向,明确了下一个调研方向.b3dm 的 3dtiles 。
让 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 是否合规的,是 https://github.khronos.org/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 批处理改材质颜色了。
还是自己写代码的方式太"原始"了,感觉我这次很多 ai 捣乱的原因是信息滞后,豆包那边好像是因为吃了太多 csdn,gpt 是经常来回横跳和嘴硬,通义灵码那套 mcp 我后面再看看怎么加工具整(deepseek 感觉不能说我就不提了,ps:本文的这部分总结是很主观和片面的),我直接给 ai 喂 d.ts 能少走很多弯路,我逼着通义灵码看声明文件结果看的积极性还没我高。
参与创业陪跑后好久没逛 v 站了,差 2 个月满一年,希望这贴别成为"梦开始的地方"。
![]() |
1
sadyx 22 天前 ![]() 几年前写 cesium 的时候就发现它对 glb/gltf 构件单体化不友好,遂用 threejs 代替 cesium 做单体化。在 gis 层面用 cesium ,在 bim 层面用 threejs
|