ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Antigravity+Blender MCP:自然语言一键生成仓储数字孪生场景

Antigravity+Blender MCP:自然语言一键生成仓储数字孪生场景 我最近一直在折腾一个很有意思的组合Antigravity 加 Blender MCP目标是用自然语言直接生成一个智慧仓储的 3D 数字孪生场景。先说清楚这个选题的背景仓库类项目的数字孪生很多时候并不需要精确还原一砖一瓦而是要快速把空间布局、货架数量、货物摆放、动线关系可视化出来给运营看、给汇报用、给系统集成做底座。传统做法要么找建模师手搓模型要么自己啃 Unity 或 Three.js周期一拖就是几周。这次我想完全换一条路让 Agent 去操作 Blender把“需求到 3D 场景”的中间环节尽量压缩。这篇是系列的上篇主要解决“从零打通环境到能用一句话生成基础仓储场景”的闭环。适读人群我归纳为三类想给业务系统快速做 3D 可视化的人想尝试 Agent 编程和 MCP 工具链的人以及已经在用 Blender 但想引入 AI 辅助建模的人。基础要求不高能装软件、会跑命令行就行。文章里我会把选型理由、完整步骤、踩坑过程都摊开讲尽量让没接触过 MCP 的读者也能照着复现。1. 为什么仓库数字孪生要选“自然语言建模”这条路1.1 先泼一盆冷水传统数字孪生为什么这么慢以前我做过一个仓库可视化项目需求从“把库房平面图转成三维”开始到最终上线拆成了好几拨人建模工作室出模型前端工程师接 Three.js后端同学写接口UI 同学调风格项目经理专门排期对接。光是“货架从 10 组改成 15 组”这种改动就要回到建模环节重新导一次模型前端再改一遍配置两天时间就没了。再赶上客户在周会上说“这个箱子颜色不对”那真的只能沉默。问题不在于某个环节的人不专业而在于链路太长。数字孪生在业务端听着很性感在开发端几乎所有时间都耗在沟通和迁就工具上。这种模式做单次交付还行一旦需求变成持续迭代整个流程立刻僵硬。1.2 这次项目的目标边界要“够用场景”不要“物理级仿真”我给自己定的目标非常克制不做高保真物理仿真不做分子级贴图就做一个能表达空间布局、货架数量、货物位置、大致动线关系的三维沙盘。静态层面有结构和物件动态层面能接受数据驱动变化比如库存数字变化时货物数量跟着变AGV 小车坐标变化时路径跟着更新。把目标定义到这个尺度之后工作量一下就下来了。模型不需要五万面用方盒子、圆柱、平面就能表达大部分仓储要素。真正麻烦的反而是“怎么把需求变成模型”这件事而这一块恰好是自然语言建模的强项。1.3 为什么敢让 AI 直接建模闭环里的三个能力让 AI 直接生成 3D 场景很多人第一反应是不靠谱。我的理解是这事能做成的关键在于闭环Agent 通过 MCP 拿到 Blender 的实时操作能力之后不再是一次性生成一堆代码碰运气而是“理解需求、调用工具、执行操作、观察结果、发现问题、再修正”这样循环推进。自然语言只是入口真正的王牌是大模型加工具执行加结果反馈的闭环。当然AI 也不是不犯错。它可能在第三组货架上漏了两层也可能把颜色参数写错。应对办法很简单一条指令给出去先看结果再发一条修正指令。这个循环的速度非常快比改模型改代码快得多这也是我敢把核心生产链路押在这套组合上的原因。2. 技术栈拆解Agent 负责思考Blender 负责渲染MCP 负责翻译2.1 MCP 到底是什么和普通 API 有什么区别MCP 的全称是 Model Context Protocol模型上下文协议。它的定位不是某个公司私有的 SDK而是给 Agent 提供标准化的工具访问通道。你可以把它类比成 USB-CUSB-C 本身不生产电但它统一了充电口、数据口、视频口的对接方式什么设备插上都能用。MCP 做的事类似Agent 这个“主机”不知道 Blender 内部长什么样但只要 Blender 侧跑了一个 MCP ServerAgent 就能自动发现服务器上挂了哪些工具、每个工具接受什么参数、调用之后返回什么结构。这跟传统 API 有本质区别。传统 API 是“你有个固定功能我给你开个口子”MCP 是“给 Agent 一套能力说明书加远程遥控器”。模型不需要提前把每个函数硬编码进训练数据只要 MCP Server 在线它就能现场“看懂”这些工具的用途然后按需调用。2.2 Antigravity 在链路中扮演的角色Antigravity 在我这套链路里是大脑和调度中心。它负责承载 Agent 的运行环境管理工具调用的上下文也通过 MCP Client 连接外部各种工具服务。配合浏览器扩展Agent 还能观察网页和应用界面相当于多了双眼睛。对 Blender 来说Antigravity 是“指挥官”对 MCP 来说Antigravity 是“客户端”。它把自然语言转成可执行的工具调用序列再把返回结果解析回人类能看懂的语言。整个流程里你不需要手写一行 Blender 脚本只需要在控制台里把 MCP Server 地址配好。2.3 三个组件各解决什么问题组件角色解决的问题AntigravityAgent 运行与调度把自然语言指令拆解成工具调用序列并维护上下文Blender MCP翻译层把 MCP 协议指令翻译成 Blender Python API 调用Blender场景执行端实际创建网格、材质、灯光、相机完成最终渲染数据流大概是这样自然语言进入 AntigravityAntigravity 通过 MCP 协议把指令发给 Blender MCPBlender MCP 直接调用 bpy API 操作场景执行结果再原路返回。这个链路最重要的特点是每一层都解耦替换任何一层都不影响其他部分。2.4 我为什么不用 Three.js 直接写我也考虑过直接用 Three.js 写仓储场景。Three.js 灵活性确实高但有个实际痛点所有模型都要自己准备要么通过代码生成几何体要么导入 glTF折腾一圈下来建模的活还是没省掉。Blender 在这里更像一个 DCC 中转站建模、布局、材质、相机都在里面做通过 MCP 导出 JSON 之后前端再用 Three.js 加载。所以我的选择是“Blender 建模先行Three.js 后面接手”。Blender 负责视觉和空间结构Three.js 负责 Web 展示。中间用 JSON 作为交换格式配合坐标轴转换两边各干各擅长的事。3. 打通 MCP 链路从安装 Blender MCP 到 Antigravity 里跑第一个指令3.1 装 Blender版本选择有讲究第一步是装 Blender。这里强烈建议选 LTS 长期支持版本别用太新的 beta。原因很简单Blender MCP 这类插件往往针对稳定版做适配beta 版一改内部 API插件可能直接报错。我最初用的是一个小版本号比较新的测试版插件装上之后界面都打不开换成 LTS 马上就好了。装的时候注意 Blender 内置了自己的 Python 环境这个后面会用到千万不要去系统里单独装一个 bpy 再来连版本很容易对不上。保持默认安装即可。3.2 把 Blender MCP 插件装进去并启动监听服务Blender MCP 是以插件形式运行的。操作路径是打开 Blender进入“偏好设置”里的“插件”面板点击“安装”选择下载好的插件压缩包启用后在侧边栏找到对应面板点击启动服务。启动成功之后控制台会打印出监听地址一般是http://127.0.0.1:8000或者类似的本地端口。这里有几个容易踩的细节第一启动之后那个 Blender 窗口不能关一关服务就没了第二端口不要被其他进程占用我之前有一次本机有个调试服务占了同端口插件一直起不来最后换到 8001 才正常第三如果后续要从另一台机器发起连接监听地址就不能只写 127.0.0.1要改成 0.0.0.0但要注意网络安全别暴露到公网。3.3 在 Antigravity 中配置 MCP 连接打开 Antigravity 控制台找到 MCP 连接管理新增一个服务器。名称可以随意写比如blender-local服务类型根据实际协议选择支持 HTTP 或 WebSocket 形式地址填刚才 Blender MCP 打印出来的本地地址。如果服务要求鉴权就把 token 填到对应的认证参数里不要在对话里告诉 Agent。配置完先点“测试连接”看到通过再继续。第一次配置容易忽略的点是浏览器扩展里的 MCP 连接开关没有打开。Antigravity 很多时候是通过浏览器扩展去发起 MCP 连接的扩展设置里如果没启用控制台显示配置正常但实际连接会失败。这个开关藏得比较深建议配置完直接去扩展设置里检查一遍。3.4 第一句指令建一个 20×12×8 米的空间环境通了之后就该跑第一个实际指令了。我给的原文是创建一个长20米、宽12米、高8米的仓库空间地面用浅灰色四面墙用半透明材质再放一个摄像机视角从东北角看向西南方向。跑完我有点惊讶Blender 里真的出现了一个完整的房间地面、墙面、相机位置都正确。虽然风格简陋但作为场景底座完全够用。这一步的关键意义不是模型多好看而是整条链路真正通了自然语言被解析成工具调用Blender 收到了指令并执行结果返回到了对话里。注意一个小技巧指令里尽量写清尺寸、颜色、视角等具体参数不要只写“建一个仓库”。模型对模糊指令的想象力会发散给足参数执行结果的可控性会高很多。4. 用一句话搭出仓储场景货架阵列、托盘堆叠与导出 JSON4.1 从空仓库开始结构化命名很重要场景底座建好之后下一步是往里面填仓储要素。我建议所有要素都带上结构化命名比如货架叫Shelf_组号_层号_位号小车叫AGV_序号。这样做的原因是后续数据绑定和前端导出都必须依赖名字来定位对象名字一乱整个自动化就乱了。给子对象命名有两种方式一种是让 Agent 按规则自动命名另一种是在 prompt 里明确写规则。我更推荐后者因为 AI 自动命名偶尔会发挥出奇怪的花样比如把中文混进去或者出现重复编号这些在 JSON 导出阶段都会变成麻烦。4.2 生成货架与货物用批量逻辑而不是一个个摆仓库场景最核心的要素是货架和货物。我可以直接给你一段实测可用的 prompt在坐标(0,0,0)到(3,20,0)的区域生成两排货架每排5组每组5层每层4个仓位共200个仓位。货架用深灰色金属框架货物用橙色立方体命名规则Shelf_组号_层号_位号。请用循环批量生成不要创建多余的独立对象。这里有个关键点一定要在 prompt 里强调“用循环或批量生成减少对象数量”。如果不加有些 Agent 会真的生成 200 个完全独立的立方体每个都是独立网格对象Blender 文件立刻膨胀视图卡顿后续导出 JSON 也会带出大量冗余数据。4.3 加入动线辅助设施动线、AGV、传送带仓储数字孪生不能只有货架还要有动线关系。我接着让 Agent 添加了几条传送带、两辆 AGV 小车和几个托盘区。这类设施用简单几何体加颜色标记就够了传送带用扁长方体加几条滚轴圆柱AGV 用一个小方块加一个方向箭头托盘区用带边框的浅色平面。这一步的体验很直观改需求不用再回建模软件直接说“把传送带从仓库北侧移到南侧”“AGV 再加一辆”Agent 就会去执行。这种高频小改动的效率提升比一次性生成大场景更有价值。4.4 导出 JSON打通 Web 端的数据格式仓储场景在 Blender 里建好只是第一步最终要能在 Web 端展示。Blender MCP 提供了场景导出能力能把当前场景序列化成结构化数据。以一个简化后的字段为例大致长这样{ scene: warehouse_v1, objects: [ { name: Shelf_01_02_03, type: mesh, geometry: cube, position: [2.5, 1.8, 0.4], rotation: [0, 0, 0], scale: [1.0, 0.5, 0.6], material: { color: #ff8c00, roughness: 0.7 } } ], camera: { position: [15.0, 8.0, 5.0], target: [0, 0, 2] } }拿到这个 JSON 之后前端写一段很薄的加载逻辑就行遍历 objects按 geometry 创建几何体按 position、rotation、scale 摆好位置再按 material.color 上色一个基础的可视化仓库就出来了。名字字段极其重要前端要响应点击、显示详情全靠它去对应业务数据。4.5 让场景“活起来”的数据绑定思路数字孪生只有 3D 模型还不能叫孪生得有数据。我准备做一个最简单的数据绑定库存表里某个货位数量从 0 变成 12就通过接口告诉 Agent“把 Shelf_01_02_03 的箱子数量改成 12”Agent 再通过 MCP 在 Blender 里替换或者新增网格。AGV 小车同理只要传入实时坐标Agent 就能更新它的位置属性。这个方案的好处是业务系统不需要直接操作 Three.js 或 Blender所有变更都走自然语言业务侧只需要把变化发出来就行。做成全自动之前可以先跑半自动人看一眼变化发一句指令确认场景更新。跑顺了再尝试把数据接到 Agent 的上下文里自动触发。5. 实际踩坑记录端口、权限、版本与 JSON 导出的完整排查链路5.1 MCP Server 显示连接成功但指令没进 Blender现象Antigravity 侧测试连接显示正常但发指令后 Blender 场景毫无变化。这是我第一次跑通环境时遇到最诡异的情况。我的排查链路是这样的先打开 Blender 控制台看启动服务的窗口有没有打印请求日志结果发现什么都没有再用命令行直接访问服务地址敲了下面这条命令curl http://127.0.0.1:8000/如果服务正常返回里能看到服务信息和可用工具列表。我当时发现命令行能返回服务信息说明 Blender MCP 本身没问题问题出在 Antigravity 到 Blender 之间的连接配置上。最后检查到浏览器扩展的 MCP 连接开关没有打开Agent 发起的请求在更上层就被拦截了。打开开关之后指令顺利到达 Blender。5.2 Antigravity 报 403 或资格检查失败这两个报错会在不同阶段出现。403 一般发生在建立连接或鉴权阶段最常见原因是 token 过期或者填写错误。看一眼配置里的认证信息重新生成一个 token 再粘贴进去基本能解决。如果是浏览器扩展模式还要确认扩展本身处于启用状态有些环境默认未启用会导致 Agent 发起连接时被浏览器策略拦截。“资格检查失败”这个报错我遇到的情况多和账号状态、服务开通权限有关少数时候是网络环境导致服务端校验不通过。处理顺序建议是先刷新账号信息再检查服务订阅状态最后看控制台错误日志确认具体是哪一步校验失败。不要看到 403 就去折腾代理或者反代先查日志大多数时候都是配置层面问题。5.3 Agent 执行到一半提示 terminated due to error这个报错信息其实很泛我第一次看到以为整个方案不可用。排查之后发现常见触发点有三个指令一次给得太复杂导致执行超时Blender MCP 返回了非标准结果导致 Agent 解析失败或者插件内部执行到某个操作时崩了。处理方式也很朴素把复杂指令拆成几条小指令每条指令只做一件事检查 Blender 控制台有没有具体报错把插件重启一次再试。我后来养成的习惯是每发一个大指令前先保存 Blender 文件执行出错就立刻“撤销”加“重来”不用重新配环境。5.4 JSON 导出后方位错乱、颜色丢失前端加载 JSON 之后发现模型方向不对这是 Blender 和 Three.js 坐标轴习惯不同导致的。Blender 是 Z 轴向上Three.js 常见习惯是 Y 轴向上所以导出阶段需要对坐标做轴交换。简单的做法是导出时把 Z 值放到 Y 位置但旋转和欧拉角也得跟着换轴序不能只换位移。颜色丢失的问题也常见原因是很多 MCP 导出只支持基础颜色和粗糙度PBR 贴图路径不会自动带进 JSON。所以我现在的习惯是前期场景里尽量用纯色材质把视觉表现控制在一个合理的粗糙度范围这样才能保证导出的 JSON 在前端复现时颜色基本一致。等需要高质量贴图时再用 glTF 等其他格式。5.5 对象命名里的中文和特殊字符陷阱我曾经让 Agent 生成“左侧货架”“右侧货架”这种中文名Blender 里看着没问题导出 JSON 之后前端解析就出了状况。部分工具链对非 ASCII 字符支持不完善名字里的空格、中文、斜杠都可能变成潜在的解析错误来源。现在的规矩是所有对象名一律使用英文、下划线和数字例如Shelf_01_02_03、AGV_001。这个习惯在前期就定好后面数据对接会非常省事不然等场景大了再统一改名又是一轮体力活。5.6 “求完美”陷阱一次生成太多对象导致卡顿刚开始玩自然语言建模很容易在 prompt 里写“生成 500 个箱子”“铺满整个地面”。结果就是 Blender 卡成幻灯片Blender MCP 执行超时Agent 报错。原因在于每一个独立对象都是一个网格对象对象数量上去之后场景数据量和视图刷新压力都会成倍增加。解决办法是能用阵列修改器就用阵列修改器能合并网格就把同一区域的箱子合并成一个整体能实例化就绝不复制独立对象。生成的规模控制在一个体感流畅的范围通常是几十个对象以内不够再分批扩展。6. 个人心得与下一步计划6.1 这个组合的边界在哪里这套方案并不是“AI 帮我做 3D”本质是“AI 借 Blender 的工具能力执行了一套预设好的建模操作”。它能做的是基于几何体和基础材质快速搭出场景框架但遇到复杂曲面建模、高级材质、骨骼动画这些还是力不从心。所以定位要摆正它擅长的是空间布局设计和批量物件生成不是取代资深建模师。6.2 我的几条实测体会第一不要一上来就让 Agent 生成一个完美仓库应该先生成局部验证链路没问题再扩大规模。第二错误不可怕可怕的是没有保存习惯。每次执行大指令前保存一下 Blender 文件后续排错会轻松很多。第三保持“Blender 窗口、Antigravity 控制台、日志终端”三屏同开哪里出错一眼就能定位。整体跑下来这套链路最大的收益不是省掉建模师而是把“改需求”的成本压到最低这对数字孪生类项目尤其友好。6.3 下篇预告上篇先把环境打通和基础场景生成写完了下篇计划折腾三件事第一用自然语言生成多个相机机位和关键路径动画第二把实时库存表和 AGV 坐标接进 Agent让场景里的货物数量和小车位置能跟着业务数据一起动第三把 Blender 导出的 JSON 接入 Three.js搭一个浏览器里直接打开就可以看的 Web 仓储页面。等这三件事跑完整套“需求到视觉再到数据驱动”的链路就算完整了到时候再来更新下篇。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进