
做数字孪生这几年我最大的体会是建模环节才是真正的隐形时间黑洞。需求文档写得很漂亮数据接口调得顺顺当当结果卡在谁来把仓库立起来这一步——要么请3D美术外包排期三周要么自己啃Blender快捷键两个月。直到我把 Antigravity 当成调度中心、用 Blender MCP 把 AI 直接接进 Blender 场景整个流程才真正变成说人话出模型。这篇文章是这套工作流的上半部分重点讲清楚从零搭建一条可用的 AI 驱动 3D 建模链路目标场景是智慧仓储数字孪生。1. 项目背景与整体设计思路1.1 智慧仓储数字孪生到底要做什么很多人一听到数字孪生就往大而全的方向想什么粒子特效、光影追踪、城市级LOD全都堆上去。落到智慧仓储这个具体场景其实核心诉求非常朴素在屏幕上把真实仓库的布局、库存、设备状态、作业路径实时映射出来。你看着孪生画面就能知道哪个货架快空了、哪台叉车正在执行任务、哪条通道拥堵了。这块业务本质上是三件事的叠加第一是静态建模把仓库的墙、地、货架、通道线搭出来第二是动态数据绑定把库位ID、托盘条码、设备传感器数值挂到模型对象上第三是交互与展示让前端页面能旋转、缩放、点击查询。以前的做法是三维重建团队用激光点云或者CAD图纸在Blender / 3ds Max里手工翻模一个中大型仓库的场景光考建模就要一到两周。这也是我一开始想绕开传统流程的核心原因。标题里强调智慧仓储数字孪生但在动手之前必须先想清楚我们做的不是影视级场景而是数据可视化级场景。模型精度够用就行重要的是对象之间的拓扑关系和属性数据的组织方式。这个认知决定了后面所有技术选型比如不需要上实时渲染引擎不需要做物理模拟模型数量多但每个多边形面数不多。明确了这一点用 Blender 这种通用DCC工具而不是游戏引擎来建场景反而更顺手。1.2 为什么是 Antigravity Blender MCP先说 MCPModel Context Protocol。我老觉得这个协议就像电脑上的USB口以前AI是独立的你给它喂一段文本它只回一段文本没法真正碰你手上的工具。MCP 把工具比如 Blender、浏览器、数据库封装成标准接口AI 通过协议去调用这些接口就像U盘插进电脑数据能双向流动了。Antigravity 在这里扮演的是那个电脑主机的角色——一个能跑 Agent、能配置 MCP 客户端的 AI 编程环境它负责理解你的需求、拆解步骤、把任务变成工具调用。市面上能做 Agent 调度的工具并不少我主力用 Antigravity 的原因有三点第一它对 MCP 生态的支持比较省心在设置里加一个 MCP Server 就能干活不需要自己写一堆胶水代码第二它的 Agent 模式在长时间多步骤任务上表现稳定建场景这件事恰恰是典型的多步骤任务——建地面、建货架、摆货物、打灯光、导出文件每一步都要基于上一步的结果继续操作短对话模型根本接不住第三它内置的模型对 Blender Python API 的理解程度不错生成出来的脚本很少出现调用一个不存在的算子这种低级错误。至于 Blender 侧Blender MCP 插件本质上是一个运行在 Blender 内部的服务端。它开启一个本地端口接收来自 AI 的 JSON 指令把指令转译成bpyBlender Python 模块调用最终在场景里创建立方体、圆柱体、材质、灯光甚至直接执行导出。到这里你就会发现整个链路的形态是自然语言需求 → Antigravity Agent 拆解任务 → MCP 协议传输指令 → Blender 内执行 Python → 场景文件落地这套链路最爽的地方在于迭代成本趋近于零。以前让建模师改一个货架尺寸要沟通、排队、出图现在你跟 AI 说一句把货架单层高度从1.6米改成1.8米顺便把每层承重面板厚度加到5厘米大约十几秒后 Blender 视口里就更新了。这种即时反馈对方案沟通来说是无价的。1.3 完整技术栈与数据流设计整套方案的技术栈不复杂但每个环节选型都有讲究AntigravityAI 编程环境作为 Agent 调度中心承载对话、任务拆解和 MCP 客户端功能。Blender 4.x开源 3D 软件负责最终场景资产的产出。选择 Blender 而不是其他建模软件重要理由是它有成熟的 Python API能接受外部指令实时操作场景另一个理由是可以借助插件生态批量导出 glTF/GLB 给前端用。Blender MCP社区常见实现连接 Antigravity 和 Blender 的桥梁也是整套方案里技术含量最高的部分。Three.js / glTF前端侧的三维渲染后续可以和 Vue/React 项目整合。数据流这一块我习惯分两层几何数据层和业务数据层。几何数据层指的是模型对象的空间位置、尺寸、朝向由 Blender 场景文件管理业务数据层指的是货架编码、库存数量、设备状态等仓库运营数据后续会从 Web API 或数据库实时读取。这两层通过对象命名约定来绑定。比如一个货架模型在 Blender 里叫SHELF-A-01那么前端拿到业务数据时只要在 JSON 里找到shelfId: SHELF-A-01就能把库存数量渲染到这个 3D 对象上方的浮动标签里。这个约定必须在建模阶段就定下来否则模型建完了再做数据映射会极其痛苦。2. 环境准备把 MCP 链路跑通2.1 Antigravity 这边的准备这一部分没有太多玄学就是三步安装、登录、建项目。Antigravity 的安装包在官网直接下载安装过程和其他桌面应用没区别。让我想特别提醒的是登录环节。如果你所在网络环境对境外服务不太友好登录页可能转圈或者报 403。这种情况下先别急着怀疑账号问题检查系统代理设置的全局开关关掉不必要的代理插件再试一次一般能解决。社区的反馈里Antigravity 更新出错也是高频问题我遇到过一次直接卸载重装新版本是最快的不用耗在修复上。登录之后新建一个项目建议直接用Empty Project而不是从模板仓库开始因为我们要的不是一个网页应用骨架而是对话 文件操作的工作区。项目建好后右侧或底部的 Agent 面板就是接下来主要工作的场所。初次使用时让它扫描一下项目目录然后进入下一步——挂接 MCP。2.2 Blender 安装 MCP 插件Blender MCP 插件的安装流程和装其他 Blender 插件没有区别。先去插件项目的 Releases 页面下载压缩包然后在 Blender 顶部菜单进入编辑 → 偏好设置 → 插件 → 安装选择下载的 zip 文件即可。安装完成后在插件搜索框里输入mcp找到对应插件勾选启用。启用后在 Blender 的 3D 视口右侧 N 面板按 N 键呼出里会多出一个 MCP 标签页。打开它通常能看到一个Start MCP Server按钮和一个地址标识常见实现里默认是ws://127.0.0.1:9876或者类似的本地 WebSocket 地址。点击启动之后插件会进入监听状态蓝绿色状态指示灯亮起表示 Blender 侧已经准备好了。这里有一个细节值得记住Blender MCP 插件和 Blender 主程序是同进退的。也就是说插件运行过程中不要关闭 Blender 窗口否则 MCP 服务端会跟着挂掉AI 那边就会出现连接已断开的错误。我的习惯是需要长时间跑建模任务时单独开一个 Blender 窗口专门跑服务不手动保存文件让它自始至终保持干净状态。2.3 在 Antigravity 里挂上 MCP Server回到 Antigravity找到设置里的 MCP 配置入口通常在 Preferences 或者项目设置里有MCP Servers选项添加一个新的 MCP Server。如果你用的 MCP 实现是 stdio 类型即通过本地命令行启动的服务需要填命令和参数大概长这样{ mcpServers: { blender-mcp: { command: python, args: [-m, mcp_server_blender, --port, 9876] } } }但因为 Blender MCP 是常驻在 Blender 进程里的我们更常用的是WebSocket / SSE 类型连接。对应到 Antigravity 的添加界面就是填一个连接地址比如ws://127.0.0.1:9876然后保存连接。如果你的 MCP 实现要求带鉴权信息在相应的 token/密钥输入框里粘贴即可。连接成功后Antigravity 的 MCP 状态栏会显示这个服务在线。我建议在这里做一个非常简单的连通性测试直接对 Agent 说帮我在 Blender 里创建一个边长为2的立方体放在世界原点。如果一切正常几秒后 Blender 视口里就会出现一个立方体。这一步跑通了说明整条链路是通的后面的建模任务就可以放心交给它了。3. 实操用自然语言搭建仓库场景3.1 把场景拆成一张对象清单在让 AI 动手之前我强烈建议先自己列一个场景对象清单。不是让你画图纸而是把建模任务拆成 AI 能理解的最小单元。以一个小型智慧仓储为例我会拆成这样对象数量关键参数备注地面1长40m x 宽25m建议用平面加细分网格仓库外墙4面高8m厚度0.3m可用立方体拉伸货架立柱若干截面10cm x 10cm阵列复制货架横梁若干长2.5m每层两根托盘货物若干1m x 1m x 1.5m用立方体颜色区分品类巷道标线按需宽3m扁平面片或平面曲线叉车模型1台简化几何体组合低模即可为什么先列清单因为 Agent 在长对话里的记忆力是有限的你一次性说建一个智能化仓库它容易用默认参数乱建导致后续反复返工。你先把对象和参数喂给它它会按部就班地生成对应的 Blender Python 脚本块一个个执行而不是憋一个大脚本一次性跑完——后者一旦出错排查成本极高。3.2 Agent 驱动的 Blender 建模指令连通测试通过后正式开工。我通常的第一步指令是这样的在 Blender 中创建一个 40 米长、25 米宽的地面平面细分 20 段放在 y0 平面。然后沿 x 方向每 5 米摆一排双深货架共 8 排。货架宽度 2.5 米高度 6 米每层间距 1.8 米共 3 层。用立方体和圆柱体组合建模不要材质统一命名为 SHELF-A01 到 SHELF-A08。这段需求里信息密度很高Agent 如果理解到位会生成类似这样的 Python 脚本片段并在 Blender 中执行import bpy # 创建地面 bpy.ops.mesh.primitive_plane_add(size1, location(0, 0, 0)) floor bpy.context.active_object floor.scale (40, 25, 1) floor.name FLOOR_MAIN # 加一个细分修改器让地面看起来有网格细节 bpy.ops.object.modifier_add(typeSUBSURF) floor.modifiers[Subdivision].levels 2 # 循环生成货架 for i in range(8): x i * 5 - 17.5 # 立柱 bpy.ops.mesh.primitive_cube_add(size0.1, location(x, -1.2, 3)) col1 bpy.context.active_object col1.scale (1, 1, 6) col1.name fSHELF-A{str(i1).zfill(2)}_POST_L # 横梁 bpy.ops.mesh.primitive_cube_add(size0.05, location(x, 0, 1.8)) beam bpy.context.active_object beam.scale (1, 2.5, 1) beam.name fSHELF-A{str(i1).zfill(2)}_BEAM_01这里想说的是你不需要自己写这些代码。你需要做的是检查 Agent 生成的逻辑是否符合预期。比如货架间距 5 米、排布方向对不对、命名是否遵照协议。如果发现它把货架摆在了仓库外面直接说把货架整体往 x 方向偏移 3 米就行它会重新计算坐标并生成新的脚本。这种交互方式本质上是一名项目经理在指挥一个懂 Blender 的程序员干活只是这程序员响应速度极快。3.3 细节优化材质、命名与数据绑定几何体建完之后场景还是灰模接下来进入细节优化阶段。这个阶段最容易出效果也最容易暴露问题。第一个要注意的是材质分配。数字孪生场景里颜色是信息的载体货架用灰色、货物按品类分配不同颜色比如电子件蓝色、服饰黄色、消防通道红色、巷道标线白色。给 AI 指令时要说清用途而非颜色名字例如给所有托盘货物添加材质按前缀区分TOK-ELEC 开头的用浅蓝色RGB 0.2, 0.4, 0.8TOK-CLOTH 开头的用米黄色RGB 0.9, 0.8, 0.5。这样生成的材质在数据语义上是准确的远比左边那个货架这种模糊指令可靠。第二个是对象命名。这一条我反复强调都不为过。数字孪生的数据映射全靠命名。在建模阶段就要求 Agent 遵守一个命名规范对象前缀 区域编号 序号。货架是RACK-A01托盘是PLT-A01-001叉车是FORKLIFT-01。后期前端查询时直接按名称前缀筛选对象就能从三维场景里定位到对应的业务实体。第三个细节是空物体锚点。如果你希望某个货架以后能被前端点击并弹窗建议在每个货架中心创建一个空物体Empty命名为ANCHOR_RACK_A01并把货架的所有子对象都挂到该空物体下。这样前端可以通过锚点位置获得业务对象的空间坐标同时在需要整体平移货架时只要移动锚点整个货架组跟着走非常省事。3.4 导出喂给前端数字孪生页面场景建模完成后续要给前端用必须解决的最后一公里问题就是导出。前端如果是 Three.js 场景最好的做法是导出 glTF或 GLB 二进制格式。Blender 自带 glTF 2.0 导出插件可以直接通过 MCP 指令让 AI 执行导出操作。注意导出前要把场景里跟业务无关的辅助对象比如地面细分网格的辅助线、摄像机隐藏起来或者放到单独的 Collection否则会一起打进制式文件徒增文件体积。同时为了让前端拿到业务数据我还会让 Agent 生成一份JSON 摘要文件。遍历 Blender 场景里的所有对象提取名称、类型、坐标、尺寸、自定义属性输出为一个 JSON[ { name: RACK-A01, type: EMPTY, location: [-15.0, 0.0, 0.0], children: [RACK-A01_POST_L, RACK-A01_POST_R, RACK-A01_BEAM_01] }, { name: PLT-A01-001, type: MESH, location: [-15.0, 0.0, 1.8], scale: [1.0, 1.2, 1.5], material: TOK-ELEC } ]这份 JSON 就是几何层和业务层的索引。前端加载 GLB 模型后用这个 JSON 表建立对象查找索引再配合后端推送的库存数据就能在 Three.js 里做遍历、高亮、标签显示。4. 常见问题与排查技巧实录4.1 MCP 链路连接问题这一节可能是大家最关心的因为整套方案能不能跑起来全看 MCP 链路稳不稳。我实测过程中遇到过的频率最高的三个问题如下Antigravity 提示 MCP Server 连接失败先确认 Blender 侧的 MCP 插件是否已经启动状态灯是否亮起然后确认端口号是否一致尤其要留意 Blender 插件面板里显示的端口和 Antigravity 配置里填的端口是不是同一个。局部网络被占用时换个空闲端口重新启动。Antigravity agent execution terminated due to error.这个错误通常在任务执行过程中出现往往是因为 Agent 调用 MCP 工具超时或返回了异常。最常见的原因是 Blender 里弹出了模态窗口比如文件保存对话框、属性检查器导致 Python 操作被阻塞。处理办法是先把 Blender 界面里的所有弹窗关掉再给 Agent 发一条继续指令。Blender 端收到指令但没有响应大部分情况下是 Blender 进入了后台运算状态CPU 打满导致界面卡死。这种情况不要狂点等它算完或者直接在 Blender 的 Python 控制台看有没有报错输出。还有一个小技巧在向 Agent 下达大规模建模指令前先让它确保 Blender 处于 Object Mode 模式很多 MCP 算子无法在 Edit Mode 下正常工作。4.2 建模结果不理想怎么办AI 建模最常见的问题是比例不对或者对象重叠。这主要是因为 Agent 对米和Blender 单位的换算没有直觉。Blender 默认一个单位对应一米但 Agent 在生成代码时容易把货架高 6 米理解成size6而不是scale(1,1,6)。所以在指令里我建议把所有尺寸都写成长×宽×高这样的三维表述并且要求它所有尺寸必须以米为单位、使用缩放属性而不是直接修改尺寸属性。这句话能省掉 80% 的比例返工。如果对象重叠让 Agent按物体名字筛选并检查间距它通常能生成一段调试脚本遍历对象位置并计算最小间隔。我发现让 AI 自己做碰撞检测比人工翻看视口高效得多。4.3 Antigravity 自身的问题前面提到过的账号登录 403、更新失败都是 Antigravity 使用中的高频问题。除此之外我还碰到过一次 Agent 输出到一半突然停住、不继续调用工具的情况。后来发现是我在对话里同时塞了太多历史信息把上下文窗口占满了。解决办法是开一个新会话但把已完成的任务和当前目标用几句话总结进去。新会话里 Agent 只要理解已完成货架建模接下来需要添加叉车模型就会接着干活。另外想提醒一句Blender Python API 在不同小版本之间偶有差异比如 4.0 和 4.2 的节点组接口变了。如果你的 Agent 生成脚本报错第一反应是确认 Blender 版本和插件要求的版本是否匹配而不是急着改代码。5. 写在“上篇”末尾的一些体会这套工作流我持续用了快两个月最大的感受是它没有替代建模师但替代了等建模师的空转时间。项目前期讨论方案、定参数、出概念场景全部由我在对话里完成效率和以前完全不同。当然它也有明显短板复杂曲面、动画绑定这些高难度操作AI 目前还是力不从心真要上生产级资产该找专业的人还是得找。这篇先聊到这里后续我会写下篇如何给场景接入真实仓储数据、用 Three.js 做浏览器端的数字孪生页面以及在 Antigravity 里设计一套可持续维护的建模提示词模板。如果你也在折腾 Antigravity 和 Blender MCP欢迎把踩过的坑留在评论区我看到了会在下篇里补充。