1. 项目缘起与整体架构拆解
1.1 为什么选“智慧仓储”作为数字孪生落地场景
做数字孪生这几年,我经手过园区、机房、产线、变电站好几个方向,最后发现智慧仓储是最适合拿来练手、也最容易出效果的场景。原因很直接:仓储空间的几何结构规整,货架、堆垛机、AGV、传送带这些对象的运动逻辑清晰,数据维度可控,不像园区那种涉及大量室外建筑和复杂人流,也不像变电站那样对实时性和安全等级要求极高。对于想入门数字孪生的前端或者全栈开发者来说,仓储是一个“麻雀虽小五脏俱全”的载体——它同时包含了静态场景建模、动态对象驱动、实时数据绑定、交互拾取这几大核心能力。
这次的项目标题里出现了Antigravity和Blender MCP两个关键词,我第一反应是:这是一条“AI 辅助建模 + 前端渲染”的链路。Antigravity 是近期在开发者圈子里讨论度比较高的 AI 编程代理工具,它能够通过自然语言指令驱动代码生成、文件操作甚至调用外部工具;而 Blender MCP 则是把 Blender 这个开源三维软件通过 Model Context Protocol 暴露成可被 AI 调用的服务端。两者结合,意味着我们可以用对话的方式让 AI 帮我们在 Blender 里生成仓储场景的几何体、材质、灯光,然后导出成前端能用的格式,最后用 Three.js 在浏览器里渲染出可交互的数字孪生体。
这个思路的价值在于:传统数字孪生项目里,建模环节往往是最耗时的。一个中等规模的仓储场景,美术同学手工建模加贴图,少说也要三到五天。而通过 AI 代理驱动 Blender,我们可以把“描述需求”到“拿到可用模型”的周期压缩到小时级别。当然,这不是说美术就没用了,而是说在原型验证、快速迭代阶段,这套链路能极大提升效率。
1.2 整体技术链路的四个阶段
我把整个项目拆成四个阶段,每个阶段都有明确的输入和输出,方便你按需取用:
| 阶段 | 核心任务 | 主要工具 | 产出物 |
|---|---|---|---|
| 第一阶段 | AI 驱动建模 | Antigravity + Blender MCP | 仓储场景 .glb/.gltf 模型 |
| 第二阶段 | 模型优化与导出 | Blender 手动微调 + 导出插件 | 压缩后的 glTF 资源包 |
| 第三阶段 | 前端场景搭建 | Vue 3 + Three.js + TypeScript | 可交互三维场景 |
| 第四阶段 | 数据绑定与孪生驱动 | WebSocket + 状态管理 | 实时数字孪生体 |
这篇先聚焦第一阶段和第二阶段,也就是从零到拿到一个可用的仓储三维模型。第三、第四阶段的前端实现我会在下一篇里展开讲,因为 Three.js 那边的坑同样不少,尤其是序列化共享、雨雪雾效果、摄像机控制这些热词里反复出现的问题,值得单独开一篇。
1.3 为什么不用 Unity 而选 Three.js
热词里出现了“unity数字孪生”,说明不少同行也在纠结选型。我的判断是:如果交付物是 Web 页面、需要嵌入现有管理系统、对安装包体积敏感,Three.js 是更务实的选择。Unity 的优势在于渲染质量和物理引擎,但 WebGL 导出后的包体、加载速度、与 Vue 生态的融合度都是问题。仓储数字孪生大多数时候不需要电影级画质,它需要的是“打开浏览器就能看、数据能实时刷新、点击货架能弹详情”。这几点 Three.js 配合 Vue 3 的响应式系统做起来非常顺手。
当然,如果你的场景是大型园区、需要复杂光照和粒子效果,Unity 或者 Unreal 仍然值得考虑。选型没有绝对对错,只有匹配不匹配。
2. Antigravity 与 Blender MCP 的协作原理
2.1 Antigravity 到底是什么角色
很多人第一次听到 Antigravity 会以为是某个渲染引擎或者三维工具,其实它是一个AI 代理执行环境。你可以把它理解成一个能听懂人话、能操作文件、能调用外部命令的“编程助手运行时”。它的核心能力包括:解析自然语言指令、规划任务步骤、调用工具接口、处理执行结果、在出错时尝试修复。
在实际使用中,Antigravity 会遇到一些典型问题,比如热词里提到的“antigravity 403”“antigravity agent execution terminated due to error”“antigravity更新出错”。这些大多和网络环境、权限配置、工具版本不匹配有关。我的经验是:先把 Antigravity 本身跑通,确保它能执行最简单的文件读写命令,再去接 Blender MCP。不要一上来就搞复杂链路,否则出错了你根本不知道是哪一层的问题。
2.2 Blender MCP 的通信机制
Blender MCP 的本质是在 Blender 内部跑一个服务端,通过 Model Context Protocol 把 Blender 的操作能力暴露出去。外部客户端(这里是 Antigravity)通过标准协议发送指令,比如“创建一个 10x5x3 的立方体”“给它应用金属材质”“在坐标 (0,0,0) 添加一个点光源”。Blender 端接收到指令后执行对应的 Python 脚本,然后把结果返回。
这里有个关键点:Blender MCP 不是万能的,它暴露的是 Blender Python API 的一个子集。复杂的建模操作,比如布尔运算、曲线放样、UV 展开,可能需要你手动写 Python 脚本通过 MCP 传过去。所以实际工作中,我通常是“AI 生成基础几何 + 手动微调细节”的混合模式,而不是完全放手让 AI 干。
2.3 两者协作的完整数据流
整个协作流程可以拆成下面这几步,我用仓储场景里的“货架”举例:
- 我在 Antigravity 里输入:“在 Blender 场景中创建一个五层货架,每层高 0.5 米,宽 2 米,深 0.8 米,立柱用深灰色金属材质,层板用浅灰色。”
- Antigravity 解析指令,生成对应的 Blender Python 脚本片段。
- 脚本通过 MCP 协议发送到 Blender 服务端。
- Blender 执行脚本,在场景中生成货架几何体并应用材质。
- 执行结果(成功/失败、对象 ID、顶点数)返回给 Antigravity。
- Antigravity 把结果反馈给我,如果失败会尝试修正脚本重试。
这个流程跑通之后,批量生成一排货架、生成传送带、生成 AGV 小车都是同样的套路。效率提升的关键在于“参数化”——你不要让 AI 每次从零生成,而是先定义好一套参数模板,让 AI 填参数。
注意:Blender MCP 的服务端需要保持运行状态,且 Blender 版本要和 MCP 插件兼容。我踩过的坑是 Blender 4.0 和某些 MCP 版本不匹配,导致指令发过去没反应。建议先用 Blender 3.6 LTS 版本,稳定性最好。
3. 仓储场景建模的实操全流程
3.1 环境准备与依赖安装
在开始之前,你需要准备这些东西:
- Blender 3.6 LTS:去官网下载安装包,安装时勾选“Add Blender to System Path”。
- Blender MCP 插件:从项目仓库下载对应版本的插件包,在 Blender 的 Edit > Preferences > Add-ons 里安装并启用。
- Antigravity 客户端:按照官方文档配置好运行环境,确保能执行基础命令。
- Node.js 18+:后续前端阶段会用到,建议提前装好。
- Python 3.10+:Blender 内置了 Python,但 MCP 服务端可能需要独立环境。
安装完成后,先做个连通性测试:在 Antigravity 里发一条“列出当前 Blender 场景中的所有对象”,如果返回了默认的 Cube、Camera、Light,说明链路通了。如果报 403 或者超时,检查防火墙和端口配置。
3.2 用自然语言描述仓储布局
这一步是整个项目里最需要“想清楚”的环节。你不能跟 AI 说“帮我建个仓库”,那它只能给你一个空盒子。你需要把仓储布局拆成可参数化的模块:
- 地面:尺寸 40m x 25m,深灰色环氧地坪材质。
- 货架区:4 排货架,每排 10 组,组间距 0.1m,排间距 3m。
- 主通道:宽度 4m,位于货架区中间。
- 传送带:沿一侧墙壁布置,长度 20m,高度 0.8m。
- AGV 停靠区:靠近入口,5 个停车位。
- 办公区:角落隔出 5m x 5m 区域,放两张桌子和一台电脑。
把这些描述整理成一段结构化的文字发给 Antigravity,它会生成对应的建模脚本。我的经验是:描述里带上具体数值,AI 生成的准确率会高很多。如果你只说“大一点的货架”,它可能给你一个 1m 高的玩具货架。
3.3 货架与传送带的参数化生成
货架是仓储场景里重复度最高的对象,最适合参数化。我定义了一套参数:
shelf_params = { "levels": 5, # 层数 "level_height": 0.5, # 每层高度(米) "width": 2.0, # 宽度 "depth": 0.8, # 深度 "column_radius": 0.04, # 立柱半径 "material_column": "dark_metal", "material_shelf": "light_metal" }把这套参数通过 MCP 传给 Blender,让它循环生成。生成完一组后,用 Blender 的 Array Modifier 或者直接复制对象来排布整排货架。这里有个技巧:先用 AI 生成一组,确认尺寸和材质没问题,再手动用 Blender 的阵列功能批量复制。全让 AI 生成容易在细节上翻车,比如立柱位置偏移、层板厚度不一致。
传送带相对复杂一点,因为它有动态部分(皮带)和静态部分(支架、滚筒)。我的做法是:静态部分用 AI 生成基础几何,动态部分留到 Three.js 里用动画实现。这样模型文件更小,前端控制也更灵活。
3.4 材质与灯光的快速配置
Blender 的材质系统很强大,但通过 MCP 配置材质时,能用的节点类型有限。我通常用 Principled BSDF 节点,设置 Base Color、Metallic、Roughness 三个参数就够了。仓储场景的材质需求不复杂:
- 地面:深灰,Metallic 0.1,Roughness 0.8
- 货架立柱:深灰,Metallic 0.9,Roughness 0.3
- 层板:浅灰,Metallic 0.7,Roughness 0.4
- 传送带皮带:黑色,Metallic 0.0,Roughness 0.9
灯光方面,仓储场景用三点布光就够了:一个主光源从斜上方打下来,一个补光源从另一侧补光,一个背光勾勒轮廓。通过 MCP 添加 Area Light,调整位置和强度。如果你想让前端渲染更轻量,可以在 Blender 里把灯光烘焙成环境贴图,导出时带上。
实操心得:Blender 里材质预览和 Three.js 里的最终效果会有差异,尤其是金属反射。建议在 Blender 里把 Metallic 值调低 0.1-0.2,到 Three.js 里再配合环境贴图补回来。这个补偿量是我试了好几次才摸出来的。
4. 模型导出与前端资源优化
4.1 glTF 导出参数怎么选
Blender 导出 glTF 时,参数选择直接影响前端加载体验。我常用的配置是:
| 参数 | 推荐值 | 原因 |
|---|---|---|
| Format | glTF Binary (.glb) | 单文件,方便传输 |
| Include | Selected Objects | 只导出需要的对象 |
| Transform | +Y Up | Three.js 默认 Y 轴向上 |
| Geometry > Compression | Draco | 压缩率 60%-80% |
| Animation | 按需勾选 | 没有动画就不勾 |
| Material | Export | 保留材质 |
| Texture | 自动 | 贴图打包进 glb |
Draco 压缩是必开的,一个 20MB 的仓储场景压到 4-5MB 很常见。但要注意:Three.js 端需要额外加载 Draco 解码器,这个我会在下一篇里讲。
4.2 模型减面与 LOD 策略
AI 生成的几何体往往面数偏高,尤其是用布尔运算或者细分曲面之后。导出前建议做一次减面:
- 用 Blender 的 Decimate Modifier,Ratio 设 0.5-0.7。
- 对远处的货架可以用更低的 LOD 级别。
- 圆柱形立柱的顶点数从 32 降到 16,视觉上几乎看不出差别。
我的经验是:仓储场景总面数控制在 50 万三角面以内,前端跑起来就比较流畅。超过这个数,低端笔记本上会明显掉帧。
4.3 资源目录组织规范
导出后的资源不要乱放,建议按下面的结构组织:
assets/ models/ warehouse.glb shelf.glb conveyor.glb textures/ floor_diffuse.jpg metal_roughness.jpg hdr/ studio.hdr这样前端加载时路径清晰,也方便后续替换单个模块。如果场景特别大,可以把货架、传送带拆成独立 glb,前端按需加载,首屏只加载地面和主结构。
4.4 导出后的快速验证方法
导出完别急着写前端代码,先用这个在线查看器(搜“glTF Viewer”就能找到)拖进去看一眼。重点检查:
- 材质有没有丢失
- 模型朝向对不对(Y 轴向上)
- 面数是否在预期范围
- 有没有多余的相机和灯光对象
我遇到过好几次导出后材质变黑的情况,最后发现是 Blender 里用了 MCP 不支持的节点类型。换成 Principled BSDF 就正常了。
5. 踩坑记录与常见问题排查
5.1 Antigravity 执行报错的典型原因
热词里“antigravity agent execution terminated due to error”出现频率很高,我整理了几种常见情况和处理方式:
| 报错现象 | 可能原因 | 处理方式 |
|---|---|---|
| 403 错误 | 权限配置或网络策略 | 检查客户端配置,确认服务端可达 |
| 执行中断 | 脚本语法错误 | 让 AI 输出完整脚本,手动检查缩进 |
| 更新出错 | 版本不匹配 | 回退到上一个稳定版本 |
| 无响应 | MCP 服务端未启动 | 重启 Blender 和 MCP 插件 |
我的建议是:每次只让 AI 做一件事,做完验证再继续。一次性让它生成整个仓库,出错概率极高,而且排查起来很痛苦。
5.2 Blender MCP 连接失败的排查顺序
连接问题按这个顺序查:
- Blender 里 MCP 插件是否启用(Edit > Preferences > Add-ons)
- 服务端是否在监听(看 Blender 控制台输出)
- 端口是否被占用(默认端口查文档)
- Antigravity 里的地址配置是否正确
- 防火墙是否拦截
大部分连接问题出在第 1 步和第 4 步。我有一次折腾了半小时,最后发现是插件没启用。
5.3 模型导入 Three.js 后的常见异常
虽然这篇主要讲建模和导出,但提前说一下前端可能遇到的问题,方便你在导出阶段就规避:
- 模型全黑:材质丢失或环境贴图未设置
- 模型太大/太小:导出时缩放比例不对,Blender 单位是米,Three.js 也是米,一般不用改
- 模型位置偏移:导出时原点不在几何中心,建议在 Blender 里把原点设到几何中心
- 贴图不显示:glb 里贴图路径问题,用 Binary 格式可以避免
5.4 提升 AI 建模成功率的实用技巧
最后分享几个我总结的技巧:
- 分步指令:先建地面,再建货架,再建传送带,每步验证。
- 给参考数值:不要说“高一点”,说“高度 3 米”。
- 用模板复用:生成一组货架后,让 AI 复制而不是重新生成。
- 保留手动调整空间:AI 生成基础,手动调细节,别追求全自动。
- 版本锁定:Blender、MCP、Antigravity 都用固定版本,别频繁升级。
这套流程跑顺之后,一个中等规模的仓储场景从描述到导出,大概两到三个小时就能搞定。相比传统建模方式,效率提升是实实在在的。下一篇我会接着讲怎么用 Vue 3 + Three.js 把这个模型变成可交互、可绑定实时数据的数字孪生体,包括摄像机控制、雨雪雾效果、序列化共享这些热词里反复出现的问题。