下午,我把一块小小的北京东软放在左手里。
绿的是地面,橙的是道路,浅蓝色的建筑从地面上冒出来,中心那幢红色的小楼像一颗过分认真的图钉。它还没有大到可以拿去参加城市规划展,也不是什么精密测绘产品。它只是一块 100 毫米见方的塑料,但路真的在上面,楼也真的在上面。
不过,这件东西的故事不是从打印机开始的。它最初只是 BlenderGIS 里的一个三维场景:地形有起伏,道路和建筑都进了软件,绕着它转一圈,已经很像一座可以俯视的小城。
但“很像”这两个字,通常最会骗人。
屏幕上的模型不等于可以打印的模型。它可能没有一个真正的底,可能没有明确的尺寸,也可能把道路和建筑当成只能在屏幕里好看的颜色。若我当时只说一句“导出 3D 打印”,大概也会得到一个文件。文件这东西很会装无辜,打开了不代表它能做出来。
于是,我没有先去研究一堆按钮,而是用 Codex 推进了整个项目:从读懂 BlenderGIS 已经获得的地形、道路和建筑信息,到组织模型、打开生成物核对,再到把结果带进实际打印。既然地图已经在屏幕里,Codex 能不能把这些信息重新组织成一件可以被制造、被检查、最后被拿在手里的东西?
这就是我理解的 vibe coding。不是对 Codex 说“你随便做一个”,然后在一片漂亮信息里假装自己满意;而是我负责描述我真正想留下的东西,Codex 负责把它拆成能被验证的交付,哪里错了就回到哪里去。
一切先从一张“还不能打印”的图开始
最初的 BlenderGIS 场景非常有用。它让我第一次看清,北京东软研发中心附近并不是一块平整的绿色桌布:道路怎么穿过去,建筑怎么散在其中,地形怎么悄悄起伏,地图都已经告诉我了。
但它的职责也到此为止。BlenderGIS 擅长把一个地点带到我眼前,却不会替我决定它在现实里该有多大、道路应该用什么颜色、建筑要不要从地面里长出来,更不会替我承担打印失败的塑料味。
我后来才明白,第一步不是“把地图变成立体”,它早就立体了。第一步是承认:我已经有了一张三维地图,但还没有一件实体。
AI 在中间做的,不是魔法,是翻译
我给 AI 的目标很朴素:这块地图最后要做成 100 × 100 × 5 毫米的桌面小手办,地点不能换,地形、道路和建筑不能只剩下一张贴图,结果也不能停在一句“应该可以打印”。
于是,这条路线被拆成了几个肉眼能理解的阶段:先保留 BlenderGIS 场景提供的地理信息,再赋予它真实的毫米尺寸和底座;把不同信息整理成能被制造的部件;把这些部件作为一个整体带进切片与打印;最后,才轮到手掌里的这张照片。
- BlenderGIS 三维场景 · 地形、道路、建筑信息
- 人提出产品目标 · 地点、尺寸、要保留的信息
- AI 生成制造候选 · 有底座、毫米尺寸、可检查
- 语义分件 · 地形/底座、道路、主建筑、周边建筑
- 同一对象的多个部件 · 导入切片软件分别选择耗材
- 多色实物打印样品 · 本次照片的事实证据
这张图看起来有点像把一句愿望排成了流水线。其实它更像我和 AI 的分工表:我不用假装知道每个技术细节,但我要一直盯住那件事——它有没有越来越像我说的那块手办,而不是越来越像一份漂亮的报告。
最关键的设计:让颜色在模型里有位置
生成一整块完整模型,其实没有那么难:让所有地形、道路和建筑长在一起,导出,结束。真正开始麻烦的是后半段——我想让道路是橙色,建筑是蓝色,重点建筑再亮一点,同时又不希望它们彼此打架、脱离地面,或者在打印时变成一地塑料碎屑。
我一开始也想过,干脆把所有东西合成一整块,打印时随便选个颜色。这个办法省事,和把一座城市压成饼干差不多。能吃,不能说没用,但道路会重新沉进地面,建筑也会变得像一层没睡醒的纹理。
后来我们换了一个更笨、但更接近结果的想法:底座、道路、主建筑和周边建筑不再只是屏幕上的四种颜色,而是四个独立的部件。
- 底座和地形留给绿色耗材,承接整块地图;
- 道路独立出来,用橙色耗材,路网才不会藏回地里;
- 建筑独立出来,用浅蓝色;中心建筑再用红色,地标自然有了重点。
它们仍然是同一个模型:共享同一个原点、尺寸和外廓关系。所谓“整合”,不是把所有颜色焊成一块看不出来的单色塑料,而是让切片软件把它们当成一个对象的多个部件。这样在打印前,我可以为每一类信息选不同的耗材;打印后,眼睛不用费劲,也能先看见道路,再看见建筑,最后才去看地形。
这就是分件设计真正解决的问题:做出“一整块灰色模型”很简单;让同一块模型在多色打印后,路还是路、楼还是楼、地还是地,才是后期最需要认真安排的部分。对不懂建模的人来说,可以把它想成一张叠在一起的透明地图:建筑在最上面,道路在中间,底座在最下面。打印时它们重新合在一起,但每一层都允许换一种颜色。
这件事听起来像打印技巧,其实更像表达选择。不同颜色不是装饰,它决定一张地图在变小以后,还能不能把自己说清楚。
可直接复制的提示词:少走一点弯路,也少花一点 Token
vibe coding 最怕的不是 AI 不会做,而是你每一轮都要重新解释:我有一个什么模型、想保留什么、哪里不能偷懒。下面这段提示词,是我希望一开始就交给 AI 的那种话。把方括号里的内容替换成你的地点、尺寸和现有素材即可。
我已经用 BlenderGIS 获得了 [地点] 的三维 GIS 场景,场景中已有地形、道路和建筑信息。
它目前只是可视化模型,不要把它直接称为可打印成品。
请把它转化为一个可继续验证的 3D 打印地理手办候选:
1. 成品外廓为 [宽] × [高] × [总高] mm,单位必须是 mm,并有封闭、可放置的底座;
2. 保留地形、道路、主建筑和周边建筑的识别关系;
3. 将底座/地形、道路、主建筑、周边建筑做成相互不重叠、共享同一原点的独立部件;
4. 这些部件必须能作为同一个对象的多个部件一起导入切片软件,使我能为道路和建筑分别选择不同耗材;
5. 同时提供一个单体组合版,供单色打印或兼容性检查使用;
6. 不要把它改造成拼图,也不要把渲染、文件生成或静态检查写成已经完成切片或实物打印。
在开始生成前,先只输出一张简洁确认表:已有输入、将生成的部件、尺寸、待确认风险、尚未验证的事项。
遇到地点、尺寸、数据许可或已有输出冲突时停止并询问我;不要擅自覆盖文件。
我还会在模型出来后再补一段。这一段有点像对 AI 说:别急着庆功,先把你做了什么、没做什么放在桌面上。
确认按上一轮方案继续。完成后请只用以下格式汇报:
- 交付:底座/地形、道路、主建筑、周边建筑、单体组合版是否齐全;
- 装配:各部件是否共享原点,是否可作为同一个对象的多个部件导入;
- 分色:底座、道路、建筑分别适合什么样的视觉对比,不假定具体耗材已经可用;
- 检查:尺寸、封闭性、流形、部件是否重叠、文件完整性分别是通过、失败还是未检查;
- 未验证:切片、换料、支撑、首层、实物打印必须逐项列出,不得以文件或预览替代;
- 风险与下一步:只列最影响打印成功的三项。
不要解释实现代码;不要创建拼图;不要覆盖已有输出。
提示词不能替你判断结果。它只是替你把最容易忘掉的事情提前写好:颜色要怎么留下、部件要怎么相处、什么才算证据、什么还只是希望。这样 AI 不需要消耗一大段上下文猜“你说的模型究竟是什么”,人也能更早发现它是不是正在悄悄跑偏。
AI 收到提示词以后,究竟怎样把它做出来
提示词不是被塞进一个黑箱,然后隔天掉出来一块塑料。至少在我们的项目里,AI 做的更像一个不嫌麻烦的项目经理:它把一句“做成地理手办”,交给几种擅长不同事情的工具,再把每一步的结果拎回来让我看。
我想强调的并不只是“Codex 会调用很多工具”。更重要的是,当我看懂它怎样做事时,约束不再是一句模糊的“做好一点”,而会变成可以落在某一步的选择:道路太细,就在分件前规定最小可读宽度;地形太平,就在定义实体时要求适度夸张;我忽然觉得某栋楼值得被看见,就在角色分配时让它成为重点建筑。
- 看见 Codex 的执行步骤
- 把感觉说成约束 · 尺寸、颜色、宽度、重点
- Codex 调度工具 · GIS、CAD、几何检查、预览、切片
- 得到中间模型与检查结果
- 人回看、怀疑、提出新判断
- 发现新的创造点 · 地标、地形、颜色、边框
↻ 反馈进入下一轮
这才是我愿意把执行过程摊开写的原因。理解流程并不会把创作变成流水账,反而会把想象力从“AI 到底会不会做”里解放出来。你知道某个效果发生在何处,就能在那里加一道约束;你看见某个中间结果,就可能想到原先根本没有打算做的事。人不是在流程外面等答案,而是在流程里不断给答案换方向。
左右滑动查看完整表格
| 阶段 | AI 要工具完成的事 | 人还可以追加的约束与效果 |
|---|---|---|
| 读取现场 | 读取 BlenderGIS 场景和已归档的地图、高程、道路、建筑信息,确认地点、范围、来源与许可,而不是凭截图猜一座城市。 | 指定中心点、模型覆盖范围;要求保留某条路、某个水体或一座地标;数据来源不清楚就停止。 |
| 定义实体 | 让 CAD 建模工具按毫米重建底座与地形,而不是直接把屏幕网格塞给打印机。 | 指定成品长宽高、底座厚度、边框形状、地形夸张程度;也可以明确“这是纪念摆件,不是测绘沙盘”。 |
| 分配角色 | 将地形/底座、道路、主建筑、周边建筑做成共享坐标的语义部件,同时生成单体组合版。 | 指定道路、建筑和底座的颜色;把地标单独设为重点色;要求道路始终比某个最小宽度更清楚。 |
| 检查模型 | 用几何检查工具查看尺寸、封闭性、流形、部件重叠和零体积问题;用装配预览工具实际查看模型。 | 指定喷嘴、层高、材料或最小细节门槛;要求细小建筑宁可合并或省略,也不要变成打印时会掉的碎屑。 |
| 准备交付 | 输出分件模型、单体组合版、清单与校验值,让下一次打开时能知道哪一件是什么。 | 指定只要单色版、只要多色版,或两版都保留;要求已有输出不得被静默覆盖。 |
| 切片与实物 | 在切片软件中作为同一对象的多个部件导入,分别配置耗材;随后由人完成实际打印和验收。 | 指定换料次数上限、首层颜色、打印方向、支撑策略、试件优先级;没有切片和实物证据时,继续写“未验证”。 |
这里面真正的关键不是“AI 会用多少工具”,而是每一个工具都只替人回答一个小问题。GIS 工具回答“这里原本有什么”;CAD 工具回答“它能变成什么形状”;检查工具回答“这件东西有没有明显坏掉”;切片软件和打印机最后才回答“它究竟能不能长到现实里”。
这也解释了为什么一段好提示词可以省下很多 Token。它不是让 AI 少做事,而是让它一开始就知道该找谁、先检查什么、哪些地方不许自作聪明。你不用每次等它生成完再说“对了,我还想要道路是橙色的”,更不用在一块已经合并好的单色模型前面发愁:我是不是刚刚把最重要的信息弄丢了。
如果想让自己的地图长得更有个性,可以在第一段提示词之后加上下面这一小段。它不是必须全部勾选,但每一条都会直接影响 AI 接下来分派给工具的任务:
在上述规则之外,请按我的选择追加约束:
- 视觉层级:底座 [颜色/材料],道路 [颜色/材料],普通建筑 [颜色/材料],重点建筑 [颜色/材料];
- 地形表达:地形起伏 [保持真实/适度夸张],最高与最低处的视觉差要清楚,但不要牺牲模型稳定性;
- 路网表达:保留 [道路或区域],道路最小可读宽度为 [数值] mm,过细的路径 [省略/合并/加宽];
- 建筑表达:重点建筑为 [名称或位置],需要 [更高/不同颜色/独立部件];过小建筑 [省略/合并为体块];
- 成品取向:[桌面摆件/教学模型/礼物],边缘 [直角/圆角],底座上 [保留/不保留] 名称或日期;
- 制造约束:打印机 [型号],喷嘴 [直径],材料 [材料],最多允许 [次数] 次换料;
- 交付边界:本轮不制作拼图;所有不能验证的判断都必须明确标记为未验证。
这些约束能带来一些很具体的特殊效果:把一座楼设成红色重点,眼睛会先找到地标;把道路从地面里抽出来,城市的骨架会更清楚;适度夸张地形,手指摸上去才会觉得它不是一块平板;把过小的建筑合并成体块,反而会让最终样品少一点脆弱,多一点像样。
当然,AI 也不能替我决定哪一种“像样”更好。它可以把地标做得更高,把道路做得更宽,把地图压得更平,但这些都是选择,不是自动的正确答案。我的工作始终没有被省掉:看一眼,怀疑一下,再告诉它哪里还不对。
最后,回到手掌里
这次照片里的样品已经告诉我,至少有一件事不是只发生在屏幕里:道路、底座和建筑真的用不同颜色站在了一起。它不完美,甚至从掌心这个视角看,有些地方还带着 3D 打印特有的层纹和笨拙。但我反而喜欢它的笨拙。它提醒我,地理信息不是一堆冷冰冰的坐标;它可以被压缩、被挑选、被重新上色,最后变成一件能被手指摸到的小东西。
至于这套模型如何继续变成拼图,那是下一篇要讲的事。拼图会带来新的结构、缝隙和取舍,不能在这里假装已经解决。
而今天这块小小的北京东软,仍然躺在手心里。橙色的路从指缝旁边穿过去,浅蓝色的小楼站在绿色地面上。它当然不是城市本身,但它已经不是那张只能在屏幕里旋转的地图了。
地图与底图:© OpenStreetMap contributors,ODbL 1.0;地形数据:GMRT。本文中的 BlenderGIS 截图、模型截图和实物照片均来自本项目过程。实物照片证明已存在打印样品;其他打印参数与质量结论须以对应切片记录和实物检验为准。
