
最近在尝试用 AI 生成一些 3D 内容时我遇到了一个挺有意思的现象很多朋友一听到“AI 生成 3D”第一反应是去搜那些专门的 3D 生成模型比如一些需要复杂本地部署、对显存要求极高的方案。但折腾了半天要么卡在环境配置要么生成的结果离“能用”还差得远。这让我开始思考对于绝大多数只是想快速验证一个 3D 创意、做个原型或者丰富一下前端展示的开发者来说我们是不是把问题想复杂了真正的门槛可能不在于找到一个能“无中生有”出完美 3D 网格的 AI而在于如何用最低的成本、最熟悉的工具链把 AI 的“想法”快速转成屏幕上可交互的 3D 对象。恰好Google 的 Gemini API 提供了一个有趣的视角。它本身是一个多模态大模型并不直接输出.obj或.glb文件。但如果你让它生成一段 Three.js 代码来描述一个 3D 手表它可能做得相当不错。成本呢根据一些公开测算生成一段中等复杂度的代码可能只需要几分钱。这个思路的价值不在于替代专业的 3D 建模软件而在于它极大地降低了从“概念”到“可运行原型”的启动成本。你不需要成为 Blender 专家也不需要理解复杂的网格拓扑你只需要会用 JavaScript 和 Three.js 的基础知识就能让一个 AI 构思的 3D 场景在浏览器里转起来。这背后真正的变化是创意验证和前端原型开发流程的加速。所以这篇文章我想聊的不是又一个“AI 生成 3D 模型”的噱头而是一个更务实的问题如何利用像 Gemini 这类通用大语言模型LLM结合成熟的 Web 3D 库如 Three.js构建一个低成本、高效率的 3D 内容原型生产流水线。我们会从一次具体的“生成一块 3D 手表”的实践出发但重点会放在拆解整个工作流的构建逻辑、避坑指南以及如何将这种“一句话生成”的能力稳定地集成到你的开发或内容生产流程中。1. 重新理解“生成”从 3D 文件到可执行代码的范式转换当我们在说“AI 生成 3D”时通常隐含的期望是得到一个.glb或.fbx格式的模型文件可以导入到 Unity、Blender 或直接用于 WebGL 渲染。这是“结果导向”的思维。但 Gemini 这类 LLM 的强项是生成文本包括结构化的代码文本。Three.js 作为一个使用 JavaScript 来创建 3D 场景的库其场景描述本身就是一段 JSON 可序列化的对象和函数调用。这带来了一个关键的范式转换我们不再追求 AI 直接输出一个复杂的、二进制的 3D 模型文件而是让它输出一段能创建这个 3D 模型的程序代码。这个转换有几点核心优势成本与速度生成几百行 JSON 和 JavaScript 代码所需的计算量和 API 调用成本远低于训练或运行一个能直接输出高质量网格的扩散模型。一次调用可能只需几美分响应时间在秒级。可调试与可迭代生成的代码是透明的。如果手表表盘颜色不对或者指针位置奇怪你可以直接阅读代码找到对应的材质Material或网格Mesh参数进行修改或者直接让 AI 重新生成调整后的代码。这是一个可交互、可理解的过程。无缝集成生成的 Three.js 代码可以直接嵌入到现有的 Web 项目中。你不需要额外的模型加载器GLTFLoader或复杂的格式转换步骤代码本身就是场景的一部分。灵活性你可以要求 AI 生成不同风格简约、机械、卡通、不同复杂度仅表盘、带表带、带复杂刻度的代码。你还可以要求它添加交互性比如让秒针转动这只需要在生成指令中补充动画逻辑的描述。当然这个范式也有其明确的边界。它不适合生成需要极高精度和真实感、用于影视或工业设计的复杂有机体模型如人物、生物。生成拥有数万乃至数百万个多边形、需要法线贴图、位移贴图等 PBR基于物理的渲染材质的超精细模型。脱离 Three.js 生态直接用于其他引擎如 Unity、Unreal的资产生产。虽然理论上可以转换但会引入额外步骤。它的核心定位是“快速原型”和“中低复杂度程序化对象的 Web 集成”。对于网页产品展示、数据可视化装饰、教育模拟、小游戏内的道具、创意艺术装置的前端部分这是一个性价比极高的方案。2. 构建你的第一条流水线从提示词到旋转的手表让我们抛开概念直接动手构建一个最小可行的工作流。我们的目标是通过调用 Gemini API生成一个描述经典手表的 Three.js 场景代码并在本地浏览器中运行它。2.1 环境准备与 API 配置首先你需要一个可用的 Gemini API 密钥。目前Gemini API 提供免费的额度足够进行大量的实验。访问 Google AI Studio 即可获取。关键步骤与避坑点创建项目与启用 API在 Google Cloud Console 创建一个新项目或使用现有项目在“API和服务”中搜索并启用 “Gemini API”。获取 API 密钥在 Google AI Studio 中通常可以在设置或相关菜单中找到创建 API 密钥的选项。保管好这个密钥它将是所有请求的凭证。注意服务可用性如网络热词所示部分用户可能遇到 “Gemini isn’t currently supported in your country” 的提示。这通常指的是 Gemini 的某些前端交互产品如 Bard或特定区域的数据中心支持问题。对于 API 调用绝大多数情况下只要你能成功创建并启用 API就可以通过标准的 HTTP 请求从全球任何地方调用需遵守当地法律法规。如果遇到客户端问题确保你使用的是官方提供的 SDK如google/generative-ai的最新版本。本地开发环境你需要一个 Node.js 环境用于运行简单的服务或脚本和一个代码编辑器。我们将创建一个简单的 HTML 文件来承载 Three.js 场景。2.2 设计有效的生成提示词Prompt这是整个流程中最具“艺术性”也最关键的环节。你的提示词直接决定了生成代码的质量和可用性。不要只是说“生成一个手表的 Three.js 代码”。一个结构化的、高效的提示词应该包含以下几个层次你是一个资深的 Three.js 开发者。请生成一个完整的、可独立运行的 HTML 文件代码该文件使用 Three.js 库在网页中渲染一个经典风格的男士手表 3D 模型。 具体要求 1. **场景设置**包含必要的 script 标签引入 Three.js使用最新稳定版 CDN设置透视相机PerspectiveCamera、渲染器WebGLRenderer和基础光照至少一个环境光 AmbientLight 和一个平行光 DirectionalLight。 2. **手表模型** - 表盘Watch Face一个扁平的圆柱体银色金属材质上有简单的刻度小时和分钟刻度和品牌 Logo 文字。 - 表针Hands创建时针、分针、秒针。秒针细长且颜色醒目如红色。 - 表带Strap生成两条简单的长方体作为皮革材质的表带连接在表盘两侧。 3. **动画**让秒针每秒匀速旋转一圈分针和时针根据秒针位置按正确比例缓慢移动。 4. **交互**实现简单的轨道控制器OrbitControls允许用户用鼠标拖拽旋转和缩放查看手表。 5. **代码质量**代码结构清晰有必要的注释避免使用已弃用的 Three.js API。将整个代码包裹在一个立即执行函数或合理的初始化函数中防止全局变量污染。 6. **输出格式**只输出完整的 HTML 文件代码不要有任何额外的解释或 Markdown 格式。为什么这样设计提示词角色设定让 AI 进入“资深开发者”角色倾向于生成更规范、更健壮的代码。明确输出格式要求“完整的 HTML 文件”避免了它只生成片段导致我们还需要手动拼接 HTML 骨架、引入 CDN 等。技术栈指定明确要求使用 CDN 引入 Three.js并指定了控制器OrbitControls这确保了生成代码的运行时环境是明确的。细节约束对表盘、表针、表带的描述将 AI 的创造力约束在一个合理的范围内避免它生成过于抽象或无法实现的奇怪结构。功能要求动画和交互是提升原型观感的关键直接提出要求。工程化提示“结构清晰”、“避免弃用 API”、“防止变量污染”这些要求能显著提升生成代码的直接可用性。2.3 调用 API 并获取代码你可以使用 Node.js 写一个简单的脚本或者使用curl、Postman 等工具调用 Gemini API。这里以 Node.js 脚本为例// generate_watch.js const { GoogleGenerativeAI } require(google/generative-ai); // 替换为你的实际 API 密钥 const API_KEY YOUR_API_KEY; const genAI new GoogleGenerativeAI(API_KEY); async function generateWatchCode() { const model genAI.getGenerativeModel({ model: gemini-1.5-pro }); // 或 gemini-1.5-flash 成本更低 const prompt 你是一个资深的 Three.js 开发者...; // 此处填入上面设计好的完整提示词 try { const result await model.generateContent(prompt); const response await result.response; const generatedCode response.text(); console.log(generatedCode); // 可以将 generatedCode 直接写入一个 .html 文件 const fs require(fs); fs.writeFileSync(generated_watch.html, generatedCode); console.log(代码已保存至 generated_watch.html); } catch (error) { console.error(生成失败:, error); } } generateWatchCode();运行这个脚本node generate_watch.js。如果一切顺利你会在当前目录得到一个generated_watch.html文件。成本估算以gemini-1.5-flash模型为例生成一段约 1500 token约合上述代码长度的响应其成本远低于 $0.01。标题中提到的 $0.038 对于单次生成来说是绰绰有余的甚至可以进行数十次迭代。2.4 运行与调试生成的代码双击打开generated_watch.html或者在本地启一个 HTTP 服务器如npx http-server来查看。大概率你会看到一个基本的手表轮廓在浏览器中旋转。然而第一次运行就完美的概率不高。常见问题包括Three.js CDN 链接失效或版本问题AI 可能使用了旧的或错误的 CDN 地址。检查控制台F12是否有 “Three is not defined” 之类的错误。手动替换为正确的 CDN如https://cdnjs.cloudflare.com/ajax/libs/three.js/r164/three.min.js和 OrbitControls CDN。语法错误或逻辑错误AI 生成的代码偶尔会有拼写错误、未定义的变量或错误的函数调用。根据浏览器控制台的报错信息逐行排查。模型结构或位置不佳表盘、表针、表带可能大小比例失调或位置错乱。这时不需要手动重写整个代码。微调策略直接修改生成的 HTML 文件中的相关参数。例如找到表针Mesh的position、scale或者材质的color属性进行调整。迭代生成策略将第一次生成的结果或你修改后的结果作为“上下文”反馈给 AI。新的提示词可以是“这是之前生成的代码但表针太粗了请调整秒针的几何体CylinderGeometry半径使其更细并保持其他部分不变。” 然后将旧代码和新要求一起发送。这种“迭代式提示”能高效地逼近你想要的效果。这个过程的核心思想是将 AI 视为一个强大的初级编码助手它负责产出大体可用的草稿而你作为资深开发者负责审查、调试和提出精准的修改意见。你不是在从头开始写而是在高效地“指导”和“修正”。3. 从单次生成到稳定流水线工程化实践让单次演示跑通只是第一步。要让这个能力真正为项目服务我们需要考虑工程化使其可靠、可重复、可集成。3.1 建立提示词模板库不要每次都重新构思提示词。为不同类型的 3D 对象建立模板基础场景模板包含相机、渲染器、光照、控制器的基础设置。机械部件模板用于生成齿轮、螺丝、外壳等强调几何精度和金属材质。家具/建筑模板用于生成桌子、椅子、简单房屋强调比例和基础纹理。数据可视化装饰模板用于生成围绕图表的抽象几何元素。每个模板都是一个.txt或.json文件里面是精心打磨过的提示词骨架留出{object_name},{color},{style}等占位符。在调用 API 前用实际参数填充这些占位符。3.2 实现自动化生成与测试脚本将之前的 Node.js 脚本升级使其能够读取提示词模板文件。替换变量。调用 Gemini API。将生成的 HTML 保存到指定目录如./generated/[timestamp]_[object_name].html。自动在无头浏览器如 Puppeteer中打开该文件截取一张预览图并检查控制台是否有致命错误。这可以作为一个简单的自动化测试确保生成的代码至少能运行而不报错。3.3 处理生成结果的多样性与非确定性LLM 的生成具有非确定性同一提示词可能产生略有差异的代码。这对于创意是好事但对于需要一致性的生产环节可能是问题。设定随机种子如果 Gemini API 支持使用seed参数可以使生成结果在给定提示词下尽可能一致。后处理标准化编写后处理脚本对生成的代码进行格式化如使用 Prettier、统一 CDN 版本、替换已知的问题代码模式等。人工审核环节在关键流程中设置一个必要的人工审核步骤。开发者快速浏览生成的预览图和代码结构决定是“通过”、“微调”还是“重新生成”。这个环节的成本远低于从头建模。3.4 集成到现有工作流生成的 Three.js 代码如何用到你的主项目中作为独立组件将生成的、调试好的 Three.js 代码封装成一个独立的 JavaScript 模块或 Vue/React 组件。主项目通过模块导入的方式使用它。作为数据源如果你需要的是更结构化的数据而非代码可以调整提示词让 AI 生成描述手表各部分尺寸、位置、颜色的 JSON 配置。然后你的项目中使用一个通用的、预先写好的 Three.js 渲染器来读取这个 JSON 配置并构建场景。这样AI 生成的是“数据”渲染逻辑由你完全控制更稳定。作为灵感来源有时生成的模型结构很有创意但代码质量不高。你可以直接参考其几何构造思路例如它用一组BoxGeometry和CylinderGeometry拼出了一个复杂的表冠然后用自己更优雅、更高效的代码重新实现一遍。4. 边界、局限与未来展望在热情地投入这个工作流之前我们必须清醒地认识它的局限。复杂度天花板对于极其复杂、曲面众多的有机模型如人脸、动物通过代码“拼凑”的方式效率极低且效果远不如专业的 3D 生成 AI 或手工建模。这是当前范式的硬边界。材质与纹理的局限生成复杂的 PBR 材质贴图粗糙度、金属度、法线贴图或精细的 UV 映射仅通过代码描述非常困难且不直观。当前更适合纯色材质、基础贴图或程序化纹理。性能考量AI 生成的代码可能不会做性能优化。例如它可能为每个刻度线都创建一个独立的Mesh而不是使用实例化InstancedMesh。在生成复杂场景时需要人工介入进行性能优化。并非“真3D模型”生成的是 Three.js 场景代码而不是一个通用的 3D 模型文件。虽然 Three.js 场景可以导出为glTF等格式但这个过程可能丢失一些动态特性或需要额外处理。那么这个工作流的未来在哪里我认为它会朝着“AI 辅助的程序化建模”和“实时内容生成”两个方向演进辅助程序化建模在游戏开发、工业设计等领域程序化生成内容Procedural Content Generation一直是重要方向。LLM 可以成为高级的“程序化生成脚本”编写助手。设计师用自然语言描述规则“生成一个随机但结构合理的城堡主塔楼高四周有矮墙材质是石头的”LLM 生成对应的生成算法代码再由引擎执行。这比直接生成静态模型灵活得多。实时内容生成在元宇宙、虚拟社交、在线教育等需要大量个性化 3D 内容的场景中结合后端缓存策略可以为每个用户实时生成独一无二的虚拟物品如徽章、家具、工具成本极低。用户说“我想要一个星空主题的沙发”几秒后一个由代码生成的、可交互的沙发就出现在他的虚拟空间里。回过头看用 Gemini 一句话生成 3D 手表其价值绝不仅仅是省下那一点建模时间。它更像是一个“杠杆”撬动的是我们对 3D 内容生产方式的重新思考。当创意的验证成本从“小时”级降到“分钟”级甚至“秒”级时更多的交互想法、更多的可视化方案得以被快速尝试和淘汰。这对于前端开发者、创意程序员、产品原型设计师来说是一个实实在在的效率革命。所以下次当你有一个 3D 展示的小需求时不妨先别急着打开复杂的建模软件或寻找庞大的模型库。问问自己“如果我用代码来构建它最核心的几何结构是什么我能不能用一段提示词让 AI 帮我写出这段 Three.js 代码的初稿”从这个最小的问题出发你开启的可能是一整个新的高效工作流。