🚀 Vibe Coding 实战:我用一条 Prompt 指挥 AI “盲盒式”生成 3D 积木物理世界)

一、 引言:欢迎来到 Vibe Coding 时代

1.1 什么是 Vibe Coding?从“一行行敲代码”到“用直觉与语义编程”的范式转变

过去我们谈论写代码,脑海里浮现的画面通常是:双手疯狂敲击键盘、死盯着满屏的语法报错、在 Stack Overflow 里苦苦搜寻 Three.js 的 API 参数、或者被某个复杂的内存管理和闭包逻辑折磨到深夜。那是属于“硬核手艺人”的传统时代。

而现在,Vibe Coding(氛围感编程 / 纯 AI 驱动编程正在彻底颠覆这一现状。

所谓 Vibe Coding,简而言之,就是程序员将具体的编码细节全权托管给 AI,自己则退居幕后,依靠直觉、审美、语义以及宏观的架构思维去指导开发。在这种模式下,你不再需要纠结一个特定函数怎么写,你唯一需要做的,是输出一段精准、清晰、带有强烈设计意图的 Prompt(提示词),然后像看着魔术一样,见证一个复杂的应用在几秒钟内拔地而起。

这不仅仅是效率的提升,更是一场编程范式的降维打击:我们终于可以从枯燥的“搬砖语法”中解放出来,把全部的精力投入到产品的创意、视觉美学与核心逻辑的架构设计中。编程的门槛被无限拉低,而创意的上限被无限抬高。


1.2 为什么选择 3D 物理世界作为试验场?视觉精细度与复杂数据结构的“双重极限挑战”

为了测试 Vibe Coding 的极限,我没有选择那些简单的 Todolist 页面或增删改查表单,而是直接把标杆拉满——我要挑战一个纯原生 JS 驱动、自带 2D 实战小地图、具备持久化存档功能的“积木玩具风” 3D 物理世界

玩过 3D 游戏或写过 3D 前端的同学都知道,这个领域是出了名的“翻车高发区”:

  • 视觉上的失之毫厘,差之千里: 3D 场景里的光照稍有不慎,草地就会被照得煞白一片,毫无美感;硬切的阴影会瞬间毁掉精致的画面。
  • 数据结构与交互的泥潭: 玩家点击屏幕,程序需要通过复杂的射线检测(Raycaster)精确计算出鼠标点中了 3D 空间中的哪一个网格,并实时联动更新后台的二维空间数据。

这既需要极高的视觉触觉(审美调教),又需要极其严密的底层逻辑(数据治理)。对于传统的 AI 生成来说,这无异于一次高难度的“盲盒式”考验。

如果全靠 AI 自由发挥,代码极有可能在几轮迭代后迅速退化成无法维护的“屎山”。因此,在这篇文章中,我将毫无保留地分享我如何通过一条精心设计的 Prompt 锁死底层架构,并像一个经验丰富的产品经理一样,指挥 AI 无痛落地这个治愈系 3D 项目的全过程。

二、 角色对调:把 AI 当成高级打工人,我是产品经理兼架构师

2.1 拆解我的核心 Prompt:如何将模糊的“氛围感”量化为 AI 能听懂的硬指标?

很多人在尝试 Vibe Coding 时,最常犯的错误就是给 AI 扔下一句极其宽泛的指令,比如:“帮我写一个精致的 3D 游戏,要好看、好玩。”

这种没有边界的“Vibe”,在 AI 眼里等同于无效废话。AI 只能用它的逻辑惯性去盲猜,最后给你的往往是一个烂大街的官方 Demo 缝合版。

在这次实战中,我转换了思路:我不再是写代码的码农,而是项目的产品经理兼技术架构师。 我给 AI 的核心 Prompt 就像一份严格的“产品需求文档(PRD)”加“架构设计书”。

我没有写任何一行逻辑伪代码,但我做对了两件事:用具体的意象去量化视觉,用严厉的规矩去锁死架构。

  • 量化视觉: 用“积木玩具风、高饱和度、颜色对比明确”来定义风格基调;用“日光感、不要演播室白炽灯、草地不能发白”来圈定光照调性。
  • 锁死架构: 明确限定代码的组织形式(必须是原生 HTML/CSS/JS + IIFE 闭包),硬性规定底层数据模型(必须用二维数组 world[x][z] 存储)。

这样一来,AI 就被牢牢限制在了一条设计好的轨道上。它可以在轨道里疯狂飙车、发挥它的编码手速,但绝不可能脱轨变成屎山。


2.2 设定视觉边界:为什么不直接用现成天空盒,而是逼 AI 用 CSS 混合渲染奶油色背景?

在 3D 开发中,传统的 AI 习惯于“路径依赖”:一看到 3D 场景,就会默认去创建一个 Three.js 的天空盒(Skybox),或者弄一个无限延伸的地平线。

但在积木玩具的设计语言里,冗余的空间细节会破坏物品的“手办感”和“精致感”。我要的是一种干净、悬浮的微缩模型质感。

因此,我在 Prompt 中加了一条看似不近人情的硬性限制:“背景是奶油色或米色(CSS 处理,不是 Three.js 的天空),不要做天空、不要地平线。”

这就逼着 AI 必须跳出 WebGL 的单一思维框架,进行跨界联动。

  • 在 HTML/CSS 层: AI 必须在网页底层或者容器层用 CSS 写死一个温暖治愈的 background-color,甚至是带有微弱渐变的奶油色背景。
  • 在 Three.js 层: AI 必须将渲染器(Renderer)的 Alpha 通道打开(alpha: true),同时把场景的背景设为透明(或不设置背景色)。

这样,3D 积木世界就像是一个悬浮在温馨奶油色网页纸张上的立体沙盒。没有了浩瀚的天空干扰,读者的视觉焦点会被瞬间吸附到核心的积木模型上,这种反常规的操作,反而一枪击中了那种独特的治愈系氛围。


2.3 拒绝让 AI “放飞自我”:在 Prompt 中锁死全局数据流与文件组织的防线

Vibe Coding 的爽感,来源于你不用关心细节;但它的痛点,也来源于你不知道细节。如果不对 AI 的代码习惯做出约束,它往往怎么省事怎么来:变量满天飞、全局变量污染、一个 2000 行的 JS 文件从头写到尾毫无章法。

为了防止被 AI 反噬,我在代码组织层给它焊死了两道铁门:

第一道铁门:HTML 只放结构,CSS 控制外观,JS 负责逻辑。
绝不允许 AI 为了图省事,把 CSS 样式通过 JS 行内写入,也不允许在 HTML 里塞满杂乱的 style 标签。页面所有的半透明磨砂玻璃感、浮动圆角,必须在独立的 CSS 中通过类名控制,保持代码的绝对纯洁。

第二道铁门:JS 全局闭包 + IIFE(立即执行函数表达式)划分模块。
我明确要求 JS 代码必须包裹在一个 IIFE 中,且内部逻辑必须使用标准的注释块进行段落分隔(例如:// [场景初始化], // [光照系统], // [数据存储])。

这就意味着,AI 写出来的不是一坨散沙,而是一个个封装良好的、逻辑清晰的“乐高组件”。哪怕后面我想新增一个“天气系统”或者“重力下落”的 Vibe 需求,我也可以直接指引 AI 找到对应的注释段落进行精准增量扩写,而不需要推倒重来。

三、 视觉与 UI 的“氛围感”降维打击:让 AI 搞定审美

3.1 调教 AI 的光影触觉:告别白炽灯,如何用语义让 AI 调出不让草地发白的柔和“日光感”

在 3D 前端开发中,调光往往是最折磨人的环节。传统的开发流程需要你不断去微调环境光和平行光的强度、颜色以及投影位置。如果直接丢给 AI 去写,它大概率会甩给你一组冷冰冰的、毫无美感的标准白色光源,结果就是整个 3D 场景像被演播室的白炽灯暴晒过一样,绿色的草地直接被照成刺眼的惨白。

在 Vibe Coding 模式下,我没有去查任何 Three.js 的光照参数,而是直接通过语义描述来强行纠偏 AI 的审美:“光照要‘日光’感而不是‘演播室白炽灯’——草地不要被照成发白;阴影要柔,不要硬切。”

AI 接收到这段充满“视觉情绪”的指令后,非常聪明地完成了底层参数的像素级转化。它放弃了死白的冷光,自动将主光源调成了带有微微暖意的淡黄色,并引入了带有一丝天蓝色调的环境光来模拟大气散射,两者的强弱比例被死死卡在了一个舒适的区间。为了实现“不要硬切”的柔和阴影,AI 还自动开启了软阴影映射,并为主光源的阴影贴图增加了模糊度和偏移量微调。

最终呈现出来的效果惊艳了所有人:阳光带有治愈的午后质感,草地色彩饱和且温润,积木玩具投射下来的阴影边缘带着一丝微微的朦胧感。这种高级的氛围感,我只动了动嘴就拿到了。


3.2 磨砂玻璃(Glassmorphism)与 2D 小地图的完美嵌入:纯 CSS 表象与 Canvas 2D 剪影的轻量级落地

一个优秀的 3D 沙盒应用,绝对不能让简陋的 UI 毁了整体的质感。在这款项目中,UI 的核心关键词是:现代感、轻量、不抢戏

在 UI 风格的 Prompt 中,我提出所有的面板必须使用**“浅色磨砂玻璃风格(半透明 + 模糊背景),圆角”**。AI 在 CSS 层面利落地使用了现代前端的视觉大招,利用背景色半透明、圆角边框以及背景模糊滤镜,配合底部浮动的、带有 Emoji 图标和中文标签的工具卡片栏,让整个界面的视觉高级感瞬间拉满。

而最让我惊喜的是右下角**小地图(Minimap)**的实现。如果再用一个 Three.js 的正交相机去渲染小地图,不仅大材小用,还会在新老设备交替时疯狂压榨显卡性能,导致掉帧。

AI 严格执行了我的要求——使用 Canvas 2D 进行降维实现。每当 3D 世界发生变动,Canvas 就会重新异步绘制一遍。地形直接用高饱和度的色彩方块平铺,树木和房子则通过简单的 Canvas 图形路径勾勒出精致的扁平化“剪影”。一个成本极低、性能极佳、颜值极高的小地图,就在 AI 的自我压榨下流畅地跑了起来。


3.3 拒绝臃肿:顺从 AI 的直觉,让它用最少的 HTML 框架撑起整个 3D 界面

很多时候,我们总觉得 3D 应用在前端的层级结构会非常复杂。但在 Vibe Coding 的体系下,只要你的框架指引足够明确,AI 就能用极其性冷淡、干净的 HTML 结构撑起所有的野心。

在这次项目中,HTML 文件的本体干净得令人发指:除了引入 Three.js 库,真正的 Body 内部只有几个孤零零的容器。一个用来挂载 Three.js 渲染画布的容器,一个顶部浮动的标题与存档控制面板,一个底部居中的 Emoji 快捷工具卡片栏,以及一个右下角用来绘制小地图的 Canvas 标签。

页面所有的半透明磨砂玻璃感、浮动圆角,完全交给独立的 CSS 样式表去控制,保持代码的绝对纯洁。这种极简的 HTML 框架给 AI 留出了巨大的发挥空间,它不需要在复杂的 DOM 树里捉迷藏,从而把全部的精力都用来搞定 3D 空间计算。这也再次验证了 Vibe Coding 的核心心法:给 AI 最少的框架束缚,给 AI 最明确的逻辑规则,它就能给你最大的惊喜。

四、 核心架构的“铁律”:Vibe Coding 最容易翻车的数据治理

4.1 为什么必须在 Prompt 里死守 world[x][z] 二维网格?防止 AI 在大规模生成时数据跑偏

在 Vibe Coding 的语境下,最让人头疼的不是 AI 不会写代码,而是它太会写“一次性代码”了。如果你只告诉它“点击屏幕可以放个方块”,AI 极有可能会直接通过 JS 在 3D 场景里原地生成一个网格模型(Mesh),并顺手赋予它一个随机的绝对坐标。这种做法在简单 Demo 里看似跑得很流畅,但一旦项目规模扩大,或者当你想要加入小地图渲染和存档功能时,灾难就降临了——因为整个世界只有前端的“视觉皮囊”,根本没有底层的“数据灵魂”。

为了把失控的苗头掐死在摇篮里,我在 Prompt 中强制给 AI 画了一条红线:数据用 world[x][z] = { terrain, kind }

这条指令看起来微不足道,但它是让 AI 从“视觉直觉编程”走向“严谨数据驱动”的核心钥匙。通过定义这个以 X 和 Z 为轴的二维网格,整个 3D 物理沙盒实际上变成了一个隐形的棋盘。无论玩家在 3D 空间里看到的多么花哨,在底层的代码逻辑里,都必须老老实实地退化为这个二维数组里的一个个状态节点。AI 在写射线检测、建筑放置以及地形生成时,每一次指针的移动,都必须向这个底层网格对齐。这种“数据与表现分离”的硬性规矩,直接避免了 AI 在长文本生成时逻辑跑偏、代码越写越碎的经典翻车现场。


4.2 “单一口径写入”的威力:强制 AI 实现 setCell 入口,为后续的 AI 自动持久化埋下伏笔

在复杂的联调中,AI 常常会展现出它的“惰性”:在 A 模块里直接修改 world[x][z].kind = 'tree',在 B 模块里又直接 delete world[x][z]。这种多头写入的行为,会让代码在几次微调迭代后,变成谁也理不清的乱麻。

于是,我在 Prompt 里下达了第二道死命令:所有写入走唯一入口(比如 setCell)。

这个限定在软件工程里被称为“单向数据流”或“单一口径写入”。不管你要种植一棵树、建造一栋房子,还是推平一片荒地,你绝对不能绕过 setCell(x, z, data) 这个核心函数。

让 AI 强制遵循这一模式的好处在接下来的自动持久化(LocalStorage 自动存档与清空)中展现得淋漓尽致。当我想给游戏加入“刷新不掉档”的功能时,我根本不需要让 AI 去翻遍几百行代码逐个去加保存逻辑。我只需要在 setCell 这个唯一的“咽喉要道”上贴一张便签,让 AI 在这里加一句本地缓存的写入指令。这样一来,所有的数据变动都会被自动拦截并持久化。甚至连右下角 2D 小地图的重绘逻辑,也可以完美挂载在这个入口内部。这种架构上的降维打击,正是 Vibe Coding 能够保持高效的精髓所在。


4.3 IIFE(立即执行函数)的割裂艺术:不借助任何打包工具,让 AI 乖乖把逻辑分段并打满注释

现代前端开发习惯了依赖 Webpack、Vite 或者各类复杂的 NPM 包管理工具来进行模块化分割。但这在 Vibe Coding 的极速体验中显得太重了。我们玩的就是“单文件盲盒”,追求的是写完即走、直接双击就能在浏览器里跑起来的爽感。

然而,单文件极易导致 AI 把几百行 JS 代码混成一锅黏稠的“面条”。为了解决这个矛盾,我指挥 AI 使用了传统的 IIFE(立即执行函数表达式) 割裂艺术。

我在 Prompt 里明确指出了模块划分的蓝图:JS 包成 IIFE,逻辑分段(场景/光照/数据/工厂/交互/持久化/小地图/启动),用注释分隔。

这就像是在一个巨大的公共白板上,给 AI 强行画出了九个独立的格子。AI 在疯狂输出代码时,由于受到了闭包和语义注释的物理隔绝,它不得不把整个系统的膨胀野心拆散:场景初始化就在它的格子里安分守己;工厂模块只负责生产 3D 预制件;交互模块只管捕获鼠标。每一个代码块都干净利落,并且带着极为显眼的模块注释。这种清晰的割裂感,不仅让 AI 自己不会在长文本中迷失,更为我后续进行增量调教、定向修改 bug 提供了教科书级别的定位导航。

五、 人机拉锯战:当 Vibe 遇到 3D 物理、数据联动时的调优记录

5.1 射线检测(Raycaster)的碰撞对齐:AI 一次性写对点击放置与销毁了吗?

在 3D 沙盒世界里,玩家最核心的交互就是“指哪打哪”——鼠标点到草地上的某个格子,积木就得精准地落在这个格子里。在 Three.js 中,这需要依赖射线检测技术。射线从相机的视点出发,穿过屏幕上的鼠标坐标,一路射向 3D 空间,并返回所有相交的物体。

如果全靠 AI 盲盒式输出,这里往往是第一个大翻车点。AI 很容易一次性写出射线检测的代码,但它经常会算错“网格对齐”。比如,点击了坐标为 (1.2, 0.5, -2.4) 的位置,积木应该落在网格的 [1][-2] 还是 [2][-3]?如果算法不够严密,积木就会出现诡异的重叠、悬空,甚至直接陷进地表以下。

但我不需要去修改那些复杂的数学向下取整逻辑。因为我们在上一章给 AI 焊死了 world[x][z] 的铁律,当发现方块错位时,我只需要像产品经理一样对 AI 抛出一句直觉式的反馈:“方块放置没有对齐网格,销毁时经常点不中,请检查射线交点到全局网格坐标的转换逻辑。”

收到反馈后,AI 立刻在它划分好的 // [交互] 模块内进行定向重构。它不再使用模糊的绝对碰撞点,而是利用碰撞面的法线方向,精确反推出当前点击的是方块的哪一个面,从而计算出下一个积木该往哪个 X 和 Z 轴格子里塞。这种基于宏观规则的拉锯,让复杂的 3D 坐标对齐在两轮对话内就达到了像素级的丝滑。


5.2 视角的降维打击:3D 场景数据向 2D 俯视小地图实时同步的“无痛”调试

当 3D 世界的核心堆叠功能跑通后,接下来的难点在于“多端联动”——右下角那个 Canvas 2D 小地图如何跟主场景保持绝对同步?

传统的做法是,在放置积木的函数里调用小地图的刷新,在销毁积木的函数里再调用一次。可是一旦漏掉某个交互入口,小地图就会出现“数据脏读”,导致 3D 世界里房子都拆了,小地图上还留着一个死掉的红点。

这时候,我们在架构中锁死的 setCell 唯一入口就成了救命稻草。由于所有的世界变动——无论是初始化生成、鼠标点击放置,还是点击清空按钮——都必须流经 setCell,调优过程直接变成了“无痛”模式。

我对 AI 说:“确保 2D 小地图的重绘完全由 setCell 的数据变更触发,不要在交互模块里手动调用绘制。”

AI 心领神会,直接在 // [小地图] 模块中实现了一个高效的局部擦除与重绘机制,并将它注册成了 setCell 内部的影子联动。每当底层数据发生 0 到 1 的越变, Canvas 就会自动根据最新的网格数据,用剪影风格抹去旧图标并画上新图标。3D 空间里的波澜壮阔,在 2D 画布上被降维得井井有条,而且没有产生任何额外的性能开销。


5.3 当我想加新功能时:如何基于已有的模块化注释,让 AI 进行“无污染”的增量代码扩写

Vibe Coding 最怕的就是“按下葫芦起了瓢”:原本项目跑得好好的,你突然想加个新功能,结果 AI 脑子一热,把之前写好的核心逻辑顺手给改残了。

但得益于我们在 Prompt 中让 AI 严格执行的 IIFE 块状结构与清晰的注释分隔,这个项目具备了极强的“抗污染性”。当整个世界成型后,我想加入一个“重置当前世界并自动生成随机树林”的彩蛋功能。

我的增量 Prompt 极其简单且具有指向性:“请在 // [工厂] 模块中加入一个随机生成树林的模型函数,并在 // [数据] 模块的重置按钮事件中调用它。记住,只修改这两个注释段落内的代码,不要触动其他地方。”

这种精确到模块的指挥方式,让 AI 开启了“微创手术”模式。它精准地找到了工业工厂的格子,塞入了一个基于柏林噪声或简单随机数的生成逻辑,然后又去控制面板的盒子里把重置按钮的点击回调关联了上去。代码输出完毕,双击刷新网页,功能完美上线,其余的射线检测、磨砂玻璃 UI、小地图联动没有受到任何一丝波及。这就是懂一点架构思维后,在 Vibe Coding 时代能体会到的终极爽感。

六、 最终效果呈现

6.1 完整prompt展示

  • 单页面,零构建:直接双击 HTML 就能打开

  • 文件不超过 3 个:一个 HTML、一个 CSS、一个 JS

  • Three.js 用 CDN 引入(r128 版本),不要 ES module,不要 import map,不要 npm

  • 不要 React / Vue / TypeScript / Webpack / Vite / OrbitControls

  • 所有 3D 物体用 Three.js 内置几何体(Box、Cone、Cylinder、Icosahedron 等)拼,不要外部模型或贴图

  • 视觉方向

  • "积木玩具"风:颜色饱和、对比明确

  • 背景是奶油色或米色(CSS 处理,不是 Three.js 的天空),不要做天空、不要地平线- 光照要"日光"感而不是"演播室白炽灯"——草地不要被照成发白

  • 阴影要柔,不要硬切

  • UI 风格

  • 顶部一个标题面板 + 一个存档面板(下拉选 + 重置 + 清空按钮)

  • 底部居中浮一个工具卡片栏,每个工具卡片有 emoji 图标 + 中文标签

  • 右下一个小地图(canvas 2D),俯视显示当前世界,地形用色块、树和房子用剪影

  • 全部面板用浅色磨砂玻璃风格(半透明 + 模糊背景),圆角

  • 代码组织

  • HTML 只放结构和引用

  • CSS 写所有外观

  • JS 包成 IIFE,逻辑分段(场景/光照/数据/工厂/交互/持久化/小地图/启动),用注释分隔

  • 数据用 world[x][z] = { terrain, kind },所有写入走唯一入口(比如 setCell)


6.2效果展示

在这里插入图片描述
我将这段精心设计的 Prompt 投喂给 Gemini,在它的全自动“盲盒输出”下,完美孵化出了上面所有的惊艳效果。为了让这份属于 Vibe Coding 时代的成果落地,我顺手将 AI 吐出的纯原生源码打包上传到了 Vercel。如今,这个治愈系的 3D 积木沙盒已经脱离了本地的开发环境,变成了一个可以随时双击、在网页端丝滑运行的独立线上世界。
链接:积木小镇

从一行提示词,到一个在 Vercel 上完美运转的 3D 积木世界,Vibe Coding 带来的绝不仅仅是开发速度的飙升,更是一场解放创意的技术浪漫。我们不再是代码语法下的苦力,而是手握架构与审美的造物主。

以上就是本次 3D 沙盒项目的全盲盒通关记录。如果你也被这种“动嘴不动手”的全新编程范式爽到了,不妨也去调教一下你的 AI,把那些脑海中天马行空的创意变成现实。

感谢读到这里的每一位朋友,我们下一个 Vibe 项目见!👋

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐