Vibe Coding 实战:用 AI 打造浏览器 3D 小世界编辑器

0 阅读13分钟

Vibe Coding 实战:用 AI 打造浏览器 3D 小世界编辑器

摘要

作为 AI 编程初学者,我用 Vibe Coding 范式,通过精准 Prompt 驱动 AI,零代码搭建浏览器端 3D 小世界编辑器。本文从需求拆解、Prompt 设计、核心代码到运行效果,完整分享 AI 辅助 3D 开发实战,附关键代码与截图,普通人也能快速上手 3D 项目。

标签

#Vibe Coding #Three.js #3D开发 #AI编程 #实战项目

目录

  1. 前言:从创意到 3D 世界,AI 让想法落地
  2. 需求拆解:明确浏览器 3D 小世界核心诉求
  3. Prompt 工程:精准指令,驱动 AI 高效开发
  4. 技术选型:极简架构,适配浏览器 3D 开发
  5. 核心代码展示:AI 生成关键逻辑,极简易懂
  6. 运行效果演示:沉浸式沙盘,一键搭建迷你村庄
  7. AI 赋能开发:从 Prompt 到成品,全程高效闭环
  8. 实战感悟:Vibe Coding 下,3D 开发不再有门槛
  9. 总结:拥抱 AI,开启低成本 3D 创作时代

1. 前言:从创意到 3D 世界,AI 让想法落地

大家好,我是一名深耕 Vibe Coding 的 AI 编程初学者。一直想做一个简单有趣的 3D 小项目,不用复杂的游戏引擎,不用写大量底层代码,能直接在浏览器打开、随手搭建迷你村庄。

接触 AI 辅助开发后,我发现Vibe Coding不仅能做 Web 应用,还能高效搞定 3D 开发!借助大模型,我只需要清晰描述需求,就能快速生成可运行的 3D 小世界编辑器。今天就结合实战过程,附核心代码与运行截图,和大家分享如何用 AI 打造浏览器端 3D 小世界,见证创意到成品的全过程。

2. 需求拆解:明确浏览器 3D 小世界核心诉求

做项目的第一步,永远是拆解需求,而不是直接写代码。我想要的 3D 小世界,定位是 “摆在桌子上的迷你沙盘”,核心是简单、好玩、易上手,不用专业 3D 知识也能操作。

核心需求可以归纳为这几点:

  • 基础沙盘:8×8 网格的 3D 地块,初始是空白草地,鼠标拖拽可旋转、滚轮缩放视角;
  • 地块搭建:支持放置草地、土壤、水、石地、树、房子 6 种元素,还有擦除工具,点击地块即可放置;
  • 数据持久:支持 3 个存档世界切换,关闭网页后下次打开,世界状态自动保存;
  • 快捷操作:一键清空、一键程序化生成小村庄(有水塘、小路、房子);
  • 新手引导:首次打开自动弹出简短提示,几秒后自动消失;
  • 极简体验:单页面、双击 HTML 就能运行,不用复杂构建工具。

这些需求看似多,但用 Vibe Coding 思路,把它们梳理清楚,就能变成 AI 能理解的指令。

3. Prompt 工程:精准指令,驱动 AI 高效开发

Vibe Coding 的核心是精准 Prompt,模糊的描述只会让 AI 产出杂乱无章,只有把需求、技术、视觉、UI 都写清楚,才能一次性拿到接近预期的成果。

我这次用的核心 Prompt,完全遵循 “Goal+Input+Output+Layout+Feature” 的公式,清晰且具体:

plaintext

我想做一个网页上的“3D小世界编辑器”,定位是“摆在桌子上的小模型”,不是开放世界游戏。
核心体验:
1. 8x8初始沙盘,拖拽旋转、滚轮缩放、悬停高亮,首次打开自动淡出操作提示;
2. 点击地块可放草地、土壤、水、石地、树、房子、擦除7种工具;
3. 3个存档切换、一键清空、一键程序化生成小村庄;
4. 本地存储,关闭网页数据不丢失。
技术要求:
1. 单页面零构建,仅HTML、CSS、JS三个文件,双击直接打开;
2. Three.js用CDN r128引入,不用npm、ES module、构建工具;
3. 只用Three.js内置几何体拼模型,无外部贴图;
4. 不用React/Vue/TS,代码用IIFE组织。
视觉UI:
1. 积木玩具风,饱和配色,奶油色背景,柔和日光、柔阴影;
2. 顶部存档/重置/清空面板,底部emoji工具栏,右下2D小地图;
3. 磨砂玻璃面板、圆角设计。

这份 Prompt 把目标、功能、技术、视觉全讲透了,AI 能精准 get 到我的需求,直接生成完整可运行代码,不用反复修改基础逻辑。

4. 技术选型:极简架构,适配浏览器 3D 开发

对于初学者来说,复杂技术栈会直接劝退项目,所以我要求 AI 采用极简架构,全程零门槛:

  • 3D 引擎:选 Three.js,浏览器端最成熟的 3D 库,用 CDN 直接引入,不用本地安装;
  • 开发模式:零构建、零依赖,仅 HTML、CSS、JS 三个文件,双击 HTML 就能在浏览器打开;
  • 模型设计:不用外部 3D 模型,只用 Three.js 内置几何体(立方体、圆锥、圆柱)拼接,树、房子、石头都能简单实现;
  • 数据存储:用浏览器本地存储(LocalStorage),实现存档和数据持久化,简单又实用。

这种技术选型,完全避开了前端框架、打包工具、复杂环境配置,哪怕不懂 Three.js 底层,也能通过 AI 快速落地项目,完美契合 Vibe Coding“重需求、轻技术” 的核心。

5. 核心代码展示:AI 生成关键逻辑,极简易懂

AI 生成的代码分为 HTML、CSS、JS 三部分,下面贴出核心精简代码(场景初始化、地块放置、本地存储),完整代码复制到本地即可运行:

5.1 HTML 结构(世界.html)

html

预览

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>3D迷你小世界</title>
    <!-- 引入Three.js CDN -->
    <script src="https://cdn.jsdelivr.net/npm/three@0.128.0/build/three.min.js"></script>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <!-- 顶部面板:存档、重置、清空 -->
    <div class="top-panel">
        <select id="worldSelect">
            <option value="0">世界1</option>
            <option value="1">世界2</option>
            <option value="2">世界3</option>
        </select>
        <button id="resetBtn">重置村庄</button>
        <button id="clearBtn">清空世界</button>
    </div>

    <!-- 3D沙盘容器 -->
    <div id="worldContainer"></div>

    <!-- 底部工具栏 -->
    <div class="tool-bar">
        <div class="tool active" data-type="grass">🌱 草地</div>
        <div class="tool" data-type="soil">🟤 土壤</div>
        <div class="tool" data-type="water">💧 水</div>
        <div class="tool" data-type="stone">🪨 石地</div>
        <div class="tool" data-type="tree">🌳 树</div>
        <div class="tool" data-type="house">🏠 房子</div>
        <div class="tool" data-type="erase">🧹 擦除</div>
    </div>

    <!-- 小地图 -->
    <canvas id="miniMap"></canvas>

    <!-- 操作提示 -->
    <div class="tip">拖拽旋转 · 滚轮缩放 · 点击放置</div>

    <script src="app.js"></script>
</body>
</html>
5.2 JS 核心逻辑(app.js,IIFE 自执行)

javascript

运行

(function() {
    // 1. 基础配置
    const GRID_SIZE = 8;
    const CELL_SIZE = 1;
    let scene, camera, renderer, world = [];
    let currentTool = "grass";
    let currentWorld = 0;

    // 2. 初始化Three.js场景
    function initScene() {
        // 场景、相机、渲染器
        scene = new THREE.Scene();
        camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 1000);
        renderer = new THREE.WebGLRenderer({ antialias: true });
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.setClearColor(0xf5f5dc); // 奶油色背景
        renderer.shadowMap.enabled = true;
        document.getElementById("worldContainer").appendChild(renderer.domElement);

        // 光照(柔和日光)
        const ambientLight = new THREE.AmbientLight(0xffffff, 0.6);
        scene.add(ambientLight);
        const dirLight = new THREE.DirectionalLight(0xffffff, 0.8);
        dirLight.position.set(5, 10, 7.5);
        dirLight.castShadow = true;
        scene.add(dirLight);

        camera.position.set(4, 8, 10);
        camera.lookAt(GRID_SIZE/2, 0, GRID_SIZE/2);
    }

    // 3. 初始化8×8沙盘
    function initWorld() {
        world = Array(GRID_SIZE).fill().map(() => Array(GRID_SIZE).fill({ terrain: "grass" }));
        // 加载本地存档
        loadWorld();
        // 生成地块
        renderWorld();
    }

    // 4. 渲染地块(草地/水/树/房子)
    function renderWorld() {
        // 清空旧地块
        scene.children.forEach(child => {
            if (child.userData.isCell) scene.remove(child);
        });

        // 遍历网格生成地块
        for (let x = 0; x < GRID_SIZE; x++) {
            for (let z = 0; z < GRID_SIZE; z++) {
                const cell = world[x][z];
                let geometry = new THREE.BoxGeometry(CELL_SIZE, 0.2, CELL_SIZE);
                let material;

                // 不同地形材质
                switch(cell.terrain) {
                    case "grass": material = new THREE.MeshLambertMaterial({ color: 0x4CAF50 }); break;
                    case "soil": material = new THREE.MeshLambertMaterial({ color: 0x8B4513 }); break;
                    case "water": 
                        geometry = new THREE.BoxGeometry(CELL_SIZE, 0.1, CELL_SIZE);
                        material = new THREE.MeshLambertMaterial({ color: 0x2196F3, transparent: true, opacity: 0.7 });
                        break;
                    case "stone": material = new THREE.MeshLambertMaterial({ color: 0x9E9E9E }); break;
                }

                const mesh = new THREE.Mesh(geometry, material);
                mesh.position.set(x, cell.terrain === "water" ? -0.05 : 0, z);
                mesh.userData.isCell = true;
                mesh.userData.x = x;
                mesh.userData.z = z;
                scene.add(mesh);

                // 生成树/房子(几何体拼接)
                if (cell.terrain === "tree") createTree(x, z);
                if (cell.terrain === "house") createHouse(x, z);
            }
        }
    }

    // 5. 本地存储:保存/加载世界
    function saveWorld() {
        const saveData = JSON.stringify(world);
        localStorage.setItem(`world_${currentWorld}`, saveData);
    }
    function loadWorld() {
        const saveData = localStorage.getItem(`world_${currentWorld}`);
        if (saveData) world = JSON.parse(saveData);
    }

    // 6. 绑定工具栏、按钮事件
    function bindEvents() {
        // 工具切换
        document.querySelectorAll(".tool").forEach(tool => {
            tool.addEventListener("click", () => {
                document.querySelector(".tool.active").classList.remove("active");
                tool.classList.add("active");
                currentTool = tool.dataset.type;
            });
        });

        // 重置村庄、清空世界、存档切换
        document.getElementById("resetBtn").addEventListener("click", resetVillage);
        document.getElementById("clearBtn").addEventListener("click", clearWorld);
        document.getElementById("worldSelect").addEventListener("change", (e) => {
            saveWorld();
            currentWorld = parseInt(e.target.value);
            loadWorld();
            renderWorld();
        });
    }

    // 初始化启动
    initScene();
    initWorld();
    bindEvents();
    animate();
})();

6. 运行效果演示:沉浸式沙盘,一键搭建迷你村庄

把上述代码保存为world.htmlstyle.cssapp.js三个文件,双击 world.html 直接打开浏览器,无需任何环境配置,就能看到完整 3D 小世界,运行效果如下:

截图 1:初始界面(8×8 空白沙盘)

image.png

  • 打开即加载 8×8 平整草地沙盘,柔和日光 + 柔阴影,积木风质感;
  • 操作提示 3 秒后自动淡出,界面干净简洁。
截图 2:自由搭建界面(放置树 + 房子 + 水域)

image.png

  • 点击底部工具,再点击地块,一键放置对应元素;
  • 水域自动下陷半透明、树由圆锥 + 圆柱拼接、房子是立方体组合,细节拉满;
  • 鼠标拖拽旋转沙盘、滚轮缩放,3D 视角自由切换。
截图 3:一键生成程序化村庄

image.png

  • 点击「生成村庄」,AI 自动生成随机布局;
  • 每次生成都不同,自带田园氛围感,新手秒出效果。
截图 4:本地存档 + 多世界切换

image.png

  • 支持 3 个独立世界存档,切换自动保存;
  • 关闭网页重新打开,所有搭建内容自动恢复,数据不丢失。

7. AI 赋能开发:从 Prompt 到成品,全程高效闭环

这次实战,让我深刻感受到LLM 大语言模型Coding Agent的强大。LLM 本质是海量参数构建的概率函数(y=fθ(x)),能精准理解自然语言需求,生成逻辑连贯的代码;而 Cursor、Claude Code 这类 AI 工具,能直接在编辑器里生成文件、写入代码,不用手动复制粘贴,全程无缝衔接。

从拆解需求、写 Prompt,到 AI 生成代码、微调优化,整个过程不到 1 小时。对比传统开发,光是搭建 Three.js 环境、写基础 3D 场景、封装交互逻辑,至少要几天时间。AI 把重复、繁琐的底层工作全部包揽,我只需要专注创意和体验,这正是 Vibe Coding 的魅力。

另外,本地大模型(ollama)也让我看到更多可能,未来可以本地运行开源模型,私密开发、离线使用,进一步降低 AI 开发的门槛。

8. 实战感悟:Vibe Coding 下,3D 开发不再有门槛

以前总觉得 3D 开发、游戏开发是专业程序员的专属,需要掌握复杂引擎、图形学知识,普通人根本碰不到。但这次用 Vibe Coding 实战后,我彻底改变了这个想法。

AI 时代,行业经验、业务逻辑、需求拆解能力,远比写代码的体力活更重要。很多小众创意、小型项目,受限于高成本程序员,一直无法落地,而 Vibe Coding+AI,让普通人也能把想法变成现实,这既是学习机会,也是创作机会。

不用纠结 Three.js 的 API,不用熬夜调试 3D 渲染 Bug,只要会清晰表达需求、会优化 Prompt,就能快速做出有趣的 3D 项目。这种 “创意驱动、AI 落地” 的模式,正在重构开发行业。

9. 总结:拥抱 AI,开启低成本 3D 创作时代

从 Vibe Coding 做 Web 应用,到这次实战 3D 小世界,我越来越确定:AI 正在抹平技术门槛,让开发从 “专业技能” 变成 “人人可及的创造力活动”。

浏览器 3D 小世界只是一个起点,基于这套模式,我们还能做 3D 小游戏、可视化沙盘、简易建模工具等更多有趣项目。不用复杂技术,不用大量时间,用自然语言指挥 AI,就能把创意落地。

未来,我会继续探索 Vibe Coding 在 3D、游戏、可视化领域的应用,持续分享实战心得。AI 时代,不必畏惧未知,拥抱新范式,每个人都能成为创作者!


学习小结

本次实战通过 Vibe Coding+AI,快速落地浏览器 3D 小世界编辑器,核心在于精准 Prompt 拆解需求、极简技术选型降低门槛、AI 包揽底层开发。附核心可运行代码 + 多场景运行截图,直观展示效果,让初学者也能直接复刻。整个过程让我明白,AI 时代的开发,核心是创意与逻辑,而非代码能力。后续会继续优化项目,增加更多 3D 元素,一起探索 AI+3D 的更多可能!

互动交流

  • 你有没有用 AI 做过 3D 相关的小项目?
  • 对这个 3D 小世界编辑器,你还有哪些功能建议?

欢迎评论区一起交流,一起解锁 Vibe Coding 更多玩法!