先说明一句:我把这套“Antigravity + Blender MCP”的组合拿来搭仓储数字孪生,不是为了炫技,而是想解决一个特别现实的问题——仓库规划和3D可视化的重复劳动太多了。传统流程里,无论是画草图、定尺寸、摆货架,还是后面导数据给前端做展示,每一步都要手工操作,非常消耗时间。而MCP协议把AI的能力接到Blender上之后,我用自然语言就能在三维场景里批量建货架、铺地面、标巷道,整个流程从“画图”变成了“对话”。这篇“上篇”就先把工具链、环境配置、场景参数和导出链路讲透,为后面接动态数据、做交互孪生打底。
这篇文章适合三类人看:一是做智慧仓储、物流园区数字孪生的实施人员,想找一条更快的建模验证路径;二是对MCP协议感兴趣,想看看它除了写代码、操作浏览器之外,还能不能控制3D软件的设计师和工程师;三是刚接触Blender、想用AI降低学习门槛的入门者。我会尽量把原理、配置、参数和坑都讲清楚,你照着操作能落地。
1. 项目概述与链路拆解
1.1 三个关键词拆开看
先说Antigravity。它本质上一个AI优先的集成开发环境,类似Cursor、Trae这类工具,但它比“IDE里挂个聊天窗口”更进一步,把模型管理、MCP客户端、协同工作区都做到了界面里。对我这种要频繁切换建模、写导出脚本、调前端接口的人来说,它最大的价值是让我在一个入口里同时管理“对话—工具—代码”三段式流程:AI理解我的需求,调用MCP工具去操作Blender,再把生成的JSON数据传递给下游渲染程序。
然后是Blender MCP。MCP的全称是Model Context Protocol,它是一个开放协议,解决的是AI应用如何安全调用外部工具和数据源的问题。你可以把MCP理解为给AI配了一排USB接口,Blender就是其中一个外设。社区里有现成的开源实现,原理并不复杂:Blender内部运行一个插件当作MCP服务器,负责监听AI侧发来的请求;AI编辑器中配置对应客户端,双方通过本地网络端口通信。AI收到你的自然语言指令后,会转换成具体的Blender API调用,例如创建立方体、复制对象、设置材质、导出数据,然后由插件在Blender进程内执行。整个过程里,Blender不再只是“被操作的文件”,而是一个可以被AI实时控制的活体场景。
最后说数字孪生。仓储数字孪生绝不是“用3D做一张好看的截图”,它要求几何模型上的每个元素都能映射到物理世界的真实对象和实时数据。比如货架对应库存库位,AGV对应当前坐标与速度,入库口对应订单事件流。这就决定了你在建模阶段不能随便摆,要考虑对象的命名规范、坐标基准、层级关系和数据锚点。很多团队走到后期才发现模型没法绑定数据,就是因为早期只关注“好看”,没有把数据映射的坑提前填掉。
1.2 为什么需要“上篇”
数字孪生的完整链路至少包含三块:静态几何模型、动态数据接入、前端交互呈现。静态几何模型解决的是“场景长什么样”,动态数据解决的是“世界当下发生了什么”,前端交互呈现解决的是“人怎么用起来”。
我见过太多项目在第一步就翻车。要么手工建模耗掉两三周时间,客户改了三次货架间距你就得重摆一遍;要么模型建好了但坐标单位和数据不一致,导出到前端后尺寸差得离谱。这篇“上篇”聚焦静态几何模型和导出链路:用Antigravity加Blender MCP把仓储的货架、托盘、AGV、巷道标识快速搭出来,再把场景导出成带语义的JSON。底层的数据对接和交互交互留在“下篇”做。
2. 环境搭建:Antigravity、Blender与MCP的联动配置
2.1 Blender版本选择与插件安装
Blender版本建议选4.2 LTS或更新的稳定版,因为Blender MCP插件对4.x版本的API兼容性最好。我自己用4.2 LTS,理由很简单:LTS版有长期维护,插件生态跟进也相对快,不会出现昨天能用、今天更新插件就崩的情况。
插件安装有两种方式。一种是在Blender偏好设置的“插件”页签里,点击“从磁盘安装”,选择下载好的zip包,适用于插件作者打包成zip的情况。另一种是把插件源码解压后复制到Blender的extensions目录,适用于你在GitHub上直接clone开发的场景。Windows下扩展目录一般在%APPDATA%\Blender Foundation\Blender\4.2\extensions\,macOS在~/Library/Application Support/Blender/4.2/extensions/,Linux在~/.config/blender/4.2/extensions/。推荐用“从磁盘安装”,因为Blender会用自带机制管理插件列表,出问题时更容易排查。
安装完成后,在偏好设置里找到相关MCP插件并勾选启用,然后在Blender内置脚本面板或插件面板里启动MCP服务器。启动后插件默认会监听本机某个端口,常见的是3001,部分实现也支持自定义端口。你需要记下这个端口,下一步在Antigravity里配置MCP连接地址时要用。
提示:只要插件面板没有明确报错,启动后右下角状态栏一般会出现服务监听提示,或者在系统进程里能看到对应端口的LISTEN状态。这一步是后面所有联动的基础,没起服务就继续配置会导致连接超时。
2.2 在Antigravity侧挂接MCP服务器
Antigravity的MCP配置入口通常在设置面板的模型或工具区域。新版Antigravity支持远程URL方式和本地命令行方式两种。对于Blender MCP,推荐在Antigravity的MCP配置里添加一条新的服务器记录,填入类型、名称、地址。
远程URL方式的配置格式大概是:
{ "mcpServers": { "blender": { "url": "http://127.0.0.1:3001" } } }如果Antigravity的界面支持直接填服务器地址,你可以只填127.0.0.1:3001。配置完成后,在Antigravity的对话窗口里如果能看到一个“工具”列表,里面包含了Blender相关的工具名称(比如创建物体、移动物体、添加材质、导出场景等),就代表连接成功了。
需要特别提一下,Antigravity账号登录验证是使用前的必要条件,如果碰到“please verify your account”之类的提示,说明当前会话的登录状态失效了,退出后重新登录验证即可。这不是网络或者代理的问题,纯粹是会话过期。之前有朋友卡在这一步,以为是配置错误,折腾了半天,实际上只要重新走一遍登录流程就好。
2.3 联动验证:用一句自然语言测试链路
配置完成后的第一件事,不是直接生成整个仓库,而是跑一次极简验证。在Antigravity对话框里输入类似这样一句话:“请在原点创建一个边长为2米的正方体,材质设为浅灰色,命名为Test_Block”。
如果一切正常,你会看到Blender视口中真的出现了一个立方体。注意观察AI返回的消息,它会说明调用了哪个工具、传入了什么参数、执行结果如何。这个验证过程能确认三件事:MCP客户端和服务端没断,Antigravity分配权限允许调取这些工具,Blender脚本按预期执行了API调用。
有个小细节:不同版本的MCP实现,工具命名可能略有差异。比如有的叫create_cube,有的叫add_mesh_cube,有的还支持参数拼接方式。你不需要背下来,但需要了解AI会根据MCP提供的工具描述自动匹配参数。所以插件安装后,建议先打开MCP工具列表看一眼,确认实际可用的工具名和参数签名,心里有数后面能少踩坑。
3. 仓储场景建模参数设计与MCP工作流设计
3.1 真实仓库参数到3D坐标的换算
数字孪生建模最忌讳“凭感觉摆”。真实仓储场景里的尺寸、间距、通道宽度都有行业规范,建议先花半小时把需求参数列清楚,再开始建模。
以我做的这个演示场景为例:一个长24米、宽16米、高6米的标准仓储区,地面用立方体压扁拉伸实现,墙体用薄立方体围边。货架采用常见的双排背靠背布局,货架主体长12米、宽1.2米、高3米,层板间距按0.6米设计。这里要注意巷道宽度的设计:单向人工叉车巷道净宽不宜低于2.4米,AGV通行巷道可以压缩到1.5米到2米,但需要考虑AGV的转弯半径。我在这个场景里把主巷道设为3米,局部通道2米,模拟一个AGV和叉车混行的状态。
计算坐标时,建议让场景原点放在仓库中央或者某一角,统一采用Z轴向上的右手坐标系。Blender默认就是Z轴向上,和Three.js一致,导出给Web前端时不需要额外旋转换算。如果你下游用的是Unity,就要注意了,Unity是Y轴向上,导出后需要整体旋转X轴-90度,这个可以放在导出脚本里统一处理,不建议手动去改每一组坐标。
3.2 从自然语言到MCP工具调用的落地方法
MCP工具是“自然语言到三维操作”的中间层。你给AI下达的指令越结构化,AI调工具时就越不容易出错。我把建模指令拆成四步,你可以直接参考:
第一步是尺寸定义。给AI明确的长宽高数值和单位,例如“创建长12米、宽1.2米、高3米的货架底座”,而不是模糊的“创建一个大货架”。原因是MCP工具的参数,比如location和scale,都是数值型的,模糊描述会让AI推断出错误参数。
第二步是命名规范。每个物体都要有固定前缀和含义明确的名称,例如货架用Rack_01、Rack_02,托盘用Pallet_Row1_01,AGV用AGV_001。后续接库存数据时,你靠名字就能定位对象,省得在几千个Mesh里翻来翻去。
第三步是层级分组。在Blender里建议充分利用Collection(集合)来管理场景,例如建Racks、AGVs、Path、Ground四个集合。这样导出JSON时,可以按照集合遍历对象,生成有语义层次的数据结构,前端渲染时也好按组控制显隐。
第四步是锚点设置。在AGV未来会经过的关键位置,比如入库口、出库口、充电桩、货架前端,放置空对象(Empty),命名为Anchor_01之类的。这些空对象在静态建模阶段没有任何几何意义,但到了“下篇”接动态数据时,它们是数据绑定和路径追踪的锚点。
以上每一步,在Antigravity里都用一句自然语言就能触发。例如“把所有货架对象移动到Racks集合,并重命名为Rack_编号格式”,AI会通过MCP工具遍历对象、修改集合、重命名。如果你手工在Blender里做,可能要花好几分钟,而用MCP基本是秒级完成。
3.3 导出JSON:数字孪生前端的数据接口关键点
Blender原生导出格式常见的是glTF、FBX、OBJ。但对于智慧仓储数字孪生,前端往往还需要语义化数据,而不仅仅是三角形面片。MCP插件可以把场景里的对象列表、坐标、包围盒、材质名称、集合结构导成一个JSON,你可以理解为“带目录的3D场景说明书”。
典型的导出结构如下:
{ "scene": "demo_warehouse_v1", "units": "meters", "metadata": { "floor_area": 384, "rack_count": 16, "anchor_count": 12 }, "collections": [ { "name": "Ground", "objects": [ { "name": "Floor", "type": "MESH", "location": [0, 0, 0], "dimensions": [24, 16, 0.2], "material": "Concrete_Gray" } ] }, { "name": "Racks", "objects": [] } ] }这里有两个坑要提前避开。第一,JSON不支持中文键名和特殊字符,Blender里如果你用了中文对象名,导出前最好在命名规范处就先规避了。第二,导出时要注意坐标系零点。如果你把仓库地面放在原点,Web前端加载模型时,只有原点对齐才能保证后续的数据标签、路径线等2D图层与3D模型精准贴合。
4. 实操记录:16组货架的仓储模型生成全过程
4.1 第一步:生成地面与墙体
我新建了空白场景后,在Antigravity里给AI下达了第一段完整指令:
“在原点生成一个长24米、宽16米、高0.2米的地面,命名为Floor,材质选混凝土浅灰。然后围绕地面边缘生成四堵高3米、厚0.3米的墙体,分别命名为Wall_N、Wall_S、Wall_E、Wall_W,材质选金属深灰。”
这条指令看起来简单,实际执行时涉及多次MCP工具调用,AI至少需要完成创建地面、创建墙体、设置位置、设置尺寸、设置材质这几个动作。注意,我没有让AI合并物体或用布尔运算去挖门洞,因为第一版演示场景里,门洞可以用空对象代替标识,等交互设计出来再做精细洞口也不迟。
执行完成后,我在Blender里检查了Outliner面板,确认对象命名和材质都符合预期。墙面有个细节:四堵墙的高度如果超过货架高度很多,视觉上会显得空。我后来把墙体高度调成3.5米,和货架最高层形成层次对比。这个属于设计微调,不需要改指令,直接在Blender里拖拽也行,但用MCP再发一句“把墙体高度全部改为3.5米”更省事。
4.2 第二步:生成货架并阵列
货架是整个场景的核心。我的指令是这样的:
“在坐标(2, 2, 0)处生成一个货架,货架由底座、四根立柱和四层层板组成。底座长12米、宽1.2米,层板间距0.6米,整体高度3米。材质建议立柱用深灰色金属,底座和层板用浅蓝色。生成完成后,把该货架复制19份,沿X轴每4米分布一组共5组,沿Y轴每2米分布一组共4排。”
AI执行时逻辑是:先生成一个基础货架并建组,然后按阵列参数循环复制。这里核心参数就是“4米”和“2米”的间距。为什么这样定?因为我留了1米左右的货架间净距,方便AGV在局部通道穿行,同时货架底座1.2米宽,两组间距2米时形成约0.8米窄通道,供盘点人员侧身通过。
阵列完成后,场景里出现了20组货架,但你会发现整体占地有点拥挤。我实际调整为:X方向保留4组,每组间隔3.5米,Y方向保留4排,间距保持不变。这样场地中央自然留出了一条3米宽的主通道。调整指令同样用自然语言即可:“删除超出边界区域的货架”,AI会根据坐标值筛选并清理对象。
提示:批量创建和阵列操作比较考验MCP工具的执行效率。如果一次生成的物体数量超过50个,建议分成两批执行,避免Blender主线程卡顿导致超时。
4.3 第三步:加入托盘、物料与AGV
基础货架搞定后,我开始向场景填充业务要素。托盘尺寸按标准1200×1000毫米,高150毫米,在每组货架的两侧各放一个,模拟待入库和待拣选状态。指令是:
“在每个货架底座两端分别生成一个托盘,托盘尺寸为长1.2米、宽1米、高0.15米,材质选木质棕色。托盘水平居中,紧贴底座短边。”
这一段指令涉及循环嵌套和坐标偏移计算,AI如果要逐个解析会显得繁琐。我更推荐的做法是:先让AI在一端生成一个基准托盘并验证坐标正确,再让它按货架坐标执行偏移循环。这样出错了排查范围小。
AGV小车我用了简化模型:底盘加顶升盘加两个圆柱探测头。底盘尺寸控制在1米×0.8米×0.3米,顶升盘直径0.5米。先创建一辆作为模板,复制4辆,分别停在主通道的既定位置上。AGV的朝向很关键,数字孪生后续要展示路径和实时位置,朝向代表车头方向,建议直接在Blender里微调旋转角度到与主通道平行。
这些元素加完后,场景开始有“仓库”的意思了。值得一提的是,物料堆叠不用做得太精细,在静态阶段用简单立方体拼出“货物”的体量感就够,等接入真实库存数据后,会有更精细的模型替换方案。
4.4 第四步:材质、灯光与导出检查
材质优化和灯光布设在数字孪生里经常被忽略,但确实影响最终展示效果和下游渲染性能。我给地面、货架、托盘、AGV分别上了不同颜色和粗糙度参数;灯光采用三点布光方式:主光、辅光、轮廓光。比默认灯光多两盏,场景阴影层次会好很多。
在做导出检查的时候有个实用技巧:打开Blender的视图叠加层,把“统计信息”开起来,可以看到当前场景的顶点数和面数。我导出的演示场景控制在几十万面左右,Web端加载压力不大。如果超过200万面,就要考虑减面或使用实例化模型,否则前端浏览器会卡。
导出JSON前,我让AI生成了一个检查清单:所有对象是否有有效名称、所有材质是否在材质列表内、地面是否在原点、货架是否有重叠。AI通过MCP工具遍历场景后返回了报告,指出有两组货架和墙体边距不足,我顺手调整了坐标,再重新导出。
5. 常见问题与排查技巧实录
5.1 连接与验证问题
Antigravity里最常遇到的是MCP连接超时。如果你配置完工具列表后,对话框提示“connection refused”,先别急着改配置,按这个顺序排查:先看Blender插件面板,MCP服务器是否处于运行状态;然后用浏览器或命令行工具访问对应的localhost端口,确认端口有响应;最后检查Antigravity里填的端口号是否和插件配置一致。端口不一致是我见过最多的情况。
还有个问题是账号验证引起来的。新安装的Antigravity偶尔会出现“please verify your account to continue using antigravity”的提示,说明当前登录态失效了。我的解决方法是退出账号重新登录,再打开工具列表确认MCP连接是否还存活。登录失效后Antigravity往往会把远端配置缓存清除,需要重新加载一次MCP配置。
5.2 建模参数与坐标系问题
很多人会忽略Blender的单位设置。默认情况下Blender的场景单位可以是米也可以是厘米,但你在MCP里传入的数字默认按“米”解释。如果你的Blender场景单位不对,就会出现AI说生成2米高的货架,实际在视口里却是20米或0.2米的情况。建议在场景属性里把单位明确设为“米”,并把单位缩放设为1。
坐标系方面,我前面提过Blender和Three.js都是Z轴向上,能直接对接WebGL前端。如果对接Unity、Unreal或者游戏引擎,需要注意轴向差异。我的习惯是在导出脚本里加一个nodetree或旋转父级,一次性转换,避免污染原始模型数据。
5.3 导出与下游对接问题
导出JSON常见的问题是特殊字符编码。如果对象名里出现中文或空格,多数JSON解析器能处理,但下游C++或Java服务端解析时就容易出幺蛾子。推荐命名规范全部用英文、下划线和数字,这样全链路兼容性最好。
另一个问题是空集合。如果你建了集合但没放任何对象,导出时要不要带着空集合?我建议保留,因为前端往往根据集合名称渲染图层控制面板,空集合可以预留给后续动态数据填充。这个习惯在后端对接过程中非常实用。
再来一个性能层面的经验:导出的JSON文件如果是几十MB甚至上百MB,前端解析会卡,建议按“轻量Json+外部模型”的方式拆分:几何数据走glTF或GLB,语义数据走Json。这样场景加载快,数据绑定也不受影响。
6. 下一步做什么,以及我的一点心得
“上篇”到这儿把静态场景和导出链路讲完了。我自己在实操中最深的一个体会是,用AI加MCP做3D建模,核心价值不在于“一句话生成模型”,而在于把重复性操作从手动变成可复用的指令流。你今天让AI生成4排货架,明天换成8排、16排,只需要修改参数,不用重新建模。
后面如果要继续做,我建议重点放在三个方向:一是把导出的JSON接到实时库存和AGV状态数据上,做动态数字孪生;二是用Blender的几何节点做“参数化仓储模板”,让AI可以通过调整参数快速生成库区方案;三是把MCP工具的权限边界设计好,比如哪些对象AI可以增删、哪些需要人工确认,这对多人协作场景尤其重要。下一篇我会重点写动态数据接入和前端交互这块,到时见。