Skip to Content
进阶指南Astra + Blender

Astra + Blender:一次可复现的建筑工作流实测

这一页上的所有内容都可以自己跑一遍。场景、构建和校验用的两个脚本、确切的命令,以及一次真实运行产出的两张渲染图,全部免费提供下载——你只要有 Blender,就能在自己的机器上复现下面这些图。

主题是一个小型的庭院凉亭,而整个测试只有一个变量:开敞正面上柱子的数量。

这是怎么做出来的。 凉亭是我们自己的测试场景——场景由我们设计,构建和检查用的两个 Python 脚本也是我们写的。Astra 在后台模式的 Blender 里运行这些脚本、读取 JSON 报告、查看渲染图,并用不同的柱子数量重新生成场景。它没有从零开始设计这栋建筑,也没有手工编辑网格。

下面的一切都来自 2026 年 9 月 5 日的一次运行:Codex CLI 0.153.2 里的 Astra(请求的模型为 gpt-6-astra),在 macOS 上驱动 Blender 5.1.0(构建号 adfe2921d5f3),各步骤运行在独立的 --background --factory-startup 进程中。

通过 bpy 运行 Blender 和 MCP 不是一回事

OpenAI 在 2026 年 9 月 4 日发表了一篇关于用 Codex 里的 Astra 做建筑可视化的文章。它描述的路径正是这里测试的这条:agent 针对 Blender 的 bpy API 写 Python,以无界面方式运行 Blender 执行脚本,然后查看产出——报告和渲染图。这条路径里没有 MCP 服务端。原文见 learn.chatgpt.com 。文中的房子、提示词和图片都属于它自己;下面这个凉亭是与之无关的原创作品。

这两种做法解决的是不同的问题:

  • 后台 bpy 执行 —— 一个全新的、无界面的 Blender 进程运行脚本并写出文件。可复现、可脚本化,而且可以在你工作时安全地跑,因为它完全不碰你打开的会话。它的代价是:看不到你正在看的东西。
  • Blender MCP —— 你的 AI 客户端拿到的是一组工具,可以查看和修改 Blender 里已经打开的场景。交互性强、有上下文,代价是需要一个运行中的服务端、一个插件和一个活跃的会话。配置指南讲的就是这条路。

两者互不替代。本文测试的是前者,因为它是那种你可以交给别人、并且期待得到同样结果的做法。

测试场景:一个庭院凉亭

一个抬高的基座、三面实墙、沿长边开敞的柱廊,以及一块平屋顶板。没有贴图、没有外部素材、没有 HDRI——只有方块、三种灰色材质、一盏太阳光和一台相机。选它是因为它一眼就能看懂、渲染也快,而不是因为它是一栋建筑:这里没有任何工程设计,也不构成施工指导。

脚本沿用 Blender 默认的单位系统,所以下面每个数字都是原始的 Blender 单位。把一个单位当作一米来理解尺度即可——这个读法是本文的约定,并不是文件本身声明的。

构件物体尺寸(Blender 单位)说明
基座PAV_Plinth9.00 × 6.00 × 0.30所有东西都立在它上面
后墙PAV_Wall_Back8.00 × 0.20 × 3.02封住长边的背面
侧墙PAV_Wall_Side_LPAV_Wall_Side_R0.20 × 5.10 × 3.02每个短边一面
柱子PAV_Column_01每根 0.24 × 0.24 × 3.02沿开敞正面等距排列
屋顶板PAV_Roof_Slab9.60 × 6.60 × 0.24四边各比基座挑出 0.30 个单位
地面SITE_Ground40 × 40 平面位于基座下方 0.02 个单位处

几个让这个测试场景行为可控的细节:

  • 柱子的排布。 柱心始终从 x = -4.08 排到 x = +4.08,所以间距就是 8.16 除以(柱子数量减一)。改变数量只改变韵律,不改变建筑的宽度。
  • 接缝处刻意的重叠。 墙和柱子的高度范围是 z = 0.29 到 z = 3.31,因此它们会嵌入基座顶面 0.01 个单位、嵌入屋顶底面 0.01 个单位,而不是刚好平齐。
  • 材质与灯光。 三种 Principled 材质(MAT_Concrete_PlinthMAT_Concrete_StructureMAT_Ground)、一盏强度 3.0 的太阳光,以及一个平坦的灰色世界背景。相机 CAM_Hero 使用 36 mm 传感器上的 35 mm 镜头,位于 (12, -11, 4.6),对准 (0, 0, 1.6)。
  • 固定的渲染设置。 Cycles、CPU、96 采样、自适应阈值 0.02、OpenImageDenoise、AgX 视图变换、1280 × 800 PNG。这些都没有暴露成命令行参数,所以每个人跑的都是同一套渲染配置。不同机器、硬件和 Blender 构建之间能否输出像素级一致的结果,并未测试。

自己跑一遍

可下载的文件,免费,无需注册:

.blend 文件是捷径,脚本才是重点:它们能从源头重建这两个场景。

命令里调用的是 blender。请用你自己安装的那个——在 macOS 上,可执行文件位于应用包内的 /Applications/Blender.app/Contents/MacOS/Blender。这次运行只在 macOS 上的 Blender 5.1.0 完成,其他版本和平台的行为不做同等保证。

构建六柱版凉亭

在你保存脚本的目录下运行。裸 -- 之后的所有内容都会传给脚本,而不是传给 Blender。

blender --background --factory-startup \ --python build_pavilion.py -- \ --columns 6 --out ~/pavilion-runs/columns-06 --render --save-blend

它会在那个新建目录里写出 pavilion.blendrender.pngscene_report.json

校验它产出的结果

第二个 Blender 进程在禁用自动执行的情况下打开已保存的文件,并从文件本身重新推导出每一项测量值。

blender --background --factory-startup --disable-autoexec \ --python check_pavilion.py -- \ --blend ~/pavilion-runs/columns-06/pavilion.blend \ --expect-columns 6 \ --expect-render ~/pavilion-runs/columns-06/render.png \ --report ~/pavilion-runs/columns-06/validation.json

重新生成变体

同一个脚本,一个参数不同,写进一个新的目录。六柱那次运行原封不动。

blender --background --factory-startup \ --python build_pavilion.py -- \ --columns 11 --out ~/pavilion-runs/columns-11 --render --save-blend

校验这个变体

blender --background --factory-startup --disable-autoexec \ --python check_pavilion.py -- \ --blend ~/pavilion-runs/columns-11/pavilion.blend \ --expect-columns 11 \ --expect-render ~/pavilion-runs/columns-11/render.png \ --report ~/pavilion-runs/columns-11/validation.json

脚本会做什么、不会做什么:

  • 参数。 构建脚本接受 --columns(3 到 16)、--out--render--save-blend;校验脚本接受 --blend--expect-columns--expect-render--report。质量设置是刻意固定的,所以柱子数量是唯一的变量。
  • 退出码。 0 成功,1 校验失败,2 输出或报告路径已存在,3 参数有误。用相同路径重复运行会以 2 失败,而不是覆盖任何东西。
  • 绝不清理。 两个脚本都不会删除或覆盖文件;构建脚本还会拒绝在非后台模式下运行,也拒绝在非全新 factory-startup 场景上运行——因此它不可能干扰你正开着的项目。
  • 没有依赖。 不需要联网、不需要 MCP 服务端、不需要凭据,除了 Blender 自带的解释器之外也不需要任何 Python 包。

对比:先六根柱子,再十一根

凉亭的灰色无贴图渲染图:低矮的矩形基座,后侧与右侧为实墙,开敞正面上有六根等距排列的方柱,平屋顶板四边都挑出基座之外。一道长长的阴影投向左侧,落在素灰色的地面上。

六根柱子,柱心间距 1.632 个单位。134 个三角面。

同一个灰色凉亭,同样的相机角度,开敞正面上的方柱由六根变成十一根,间距大约密了一倍。基座、墙体、屋顶板、灯光和阴影都没有变化。

十一根柱子,柱心间距 0.816 个单位。194 个三角面。

两张图之间,只有一个参数变了。柱心间距从 1.632 减半到 0.816 个单位;由于柱子仍是 0.24 个单位见方,相邻柱子之间的净空从 1.392 收窄到 0.576 个单位——立面于是读起来像一道屏,而不是一排开口。基座、墙体、屋顶、材质、太阳光、相机和渲染设置完全一致。

有两点值得说准确。第二个场景是用同一个脚本重新生成到它自己的目录里的,而不是就地修改——之后第一次运行的文件哈希值仍与原先完全相同,所以没有任何东西被悄悄改动过。另外,更密的柱廊并不是”更好的设计”,它只是另一种韵律。这个测试说明的是这次改动可复现、可检验,而不是 agent 改进了这栋建筑。

校验结果

校验脚本从不信任构建脚本。它在一个独立的 Blender 进程中打开保存好的 .blend,并从文件重新测量一切:

  • 场景与集合的结构,以及每个集合里有多少物体
  • 每个物体的世界空间包围盒、尺寸、旋转和缩放
  • 柱子的名称、顺序,以及在预期数量下的精确柱心间距
  • 柱子和墙体与基座、屋顶相接的接触面
  • 材质槽仅限于凉亭的三种材质,且从场景出发无法到达任何图像或环境贴图节点
  • 任何位置都没有修改器,以及一个精确的三角面总数
  • 相机的镜头、传感器、位置和朝向;有且只有一盏太阳光
  • 全新的 startup 场景仍然存在且未被改动
  • 渲染出的 PNG 的尺寸及其亮度方差,这样空白画面无法蒙混过关

两个变体都通过了这项独立校验,零失败项。被测试的这套文件的确切内容记录在可下载的 manifest.json 里,所以证据是随文件一起流通的,而不是随着这段文字一起变旧。这是一台机器上的一次运行,不是基准测试。

这些检查确认的,只是它们所测量的那些属性——本测试场景所规定的结构、几何、材质、相机和渲染输出。它们不是对文件里其他一切的认证,不是对结果好不好看的评判,也不是关于任何模型总体表现的结论。

与任务相称的提示词

给 Astra 的实际指令更长,而且充满本机路径。下面是同样这三个请求的精简、可复用版本——注意每一条要求的都是执行和核对,而不是设计。

Using Blender 5.1 in background mode with factory startup, run build_pavilion.py with --columns 6 into a new output directory, rendering and saving the .blend. Then run check_pavilion.py against that .blend with --expect-columns 6 and a new report path. Report the exit codes. Do not edit the scripts, retry silently, or reuse an existing directory.
Read scene_report.json and validation.json from that directory, and view render.png if you have an image tool. Report only what you actually observed: column count, centre spacing, triangle count, how many checks ran, and any failures.
Run build_pavilion.py again with --columns 11 into a second new directory, then validate it with --expect-columns 11. Leave the first directory untouched, and tell me what differs between the two.

我们测到了什么,以及哪里出了问题

  • 在受限沙箱下 Blender 起不来。 在 Codex 的只读沙箱和 workspace-write 沙箱下,Blender 在 macOS Metal 启动阶段就崩溃了——一行 Python 都还没跑到。完成这次运行的,是标准的完全访问权限本地 CLI 模式。这是这台机器上发生的事,与模型无关,你的环境也可能表现不同。也不要把它读成”把防护都关掉”:只批准你确实信任的、具体的本地脚本和文件操作,并且是在你自己掌控的环境里。
  • stderr 上会出现弃用警告。 Blender 5.1 会记录 'Material.use_nodes' is expected to be removed in Blender 6.0,以及 World 的对应警告。它们没有导致这次已验证的运行失败。这里没有测试 5.1.0 以外的 Blender 版本,所以在那些版本上的行为应视为未知。
  • 拒绝执行是一项特性。 两个脚本在输出或报告路径已存在时都会以 2 退出,而不是覆盖,所以重复的命令会一直失败,直到你换一个新路径。正是这一点保证了跑变体时不会毁掉原来的结果。
  • 脚本离线,agent 在线。 Blender 这一侧不需要网络、MCP 服务端、凭据或额外的包。agent 会话本身是联网的,而它被允许运行什么,完全取决于你客户端的审批设置。
  • 一次运行,一台机器。 模型和工具的可用性只对应那一次会话。这里的任何内容都不构成对其他模型、套餐、平台或 Blender 版本的承诺。

授权与复用

两个脚本采用 MIT 许可证。两个 .blend 文件和本页两张渲染图以 CC0-1.0 发布——可用于商业用途、教程,或作为你自己的起点,无需署名。完整条款见 LICENSE.md

所有内容均为原创:这套文件不包含任何第三方模型、贴图或 HDRI。这里也不对其他任何东西重新授权——Blender 有自己的许可证,由 Siddharth Ahuja 和贡献者维护的上游 blender-mcp 项目 也有它自己的许可证。

需要声明:维护本站的团队同时也在做 3D-Agent,一款付费的 Blender AI 应用。上面的一切都不依赖它——脚本、两个场景和两张渲染图都可以免费下载,只用 Blender 就能重新跑一遍。如果你不愿意在一个个项目之间自己搭建和维护一套 AI 环境,它的 Blender 建筑与 archviz 工作流程 就是那条路的起点。它是另一个产品,做的是另一件事,而不是本页这次测试的托管版本。

常见问题

这套流程需要 Blender MCP 吗?

不需要。脚本运行在一个无界面的后台 Blender 进程里,不会连接任何活跃的会话。Blender MCP 是另一条路:它给 AI 客户端提供工具,去查看和修改你已经打开的场景。两者适用于不同的工作。

脚本需要联网、API Key 或额外的 Python 包吗?

都不需要。它们只用 Blender 自带的 Python 解释器,也不发起任何网络请求。当然,驱动它们的 AI 会话是联网的,而它被允许运行什么,取决于你客户端的审批设置。

可以只做十一柱的变体,而不重做第一个吗?

可以,只要给每次构建一个新的输出目录。构建脚本在输出目录已存在时会以退出码 2 退出而不写入,校验脚本在报告文件已存在时同样如此。把两次运行放在不同目录里,正是保住第一次结果的办法。构建脚本完全不接受 .blend 输入,所以它只会写;校验脚本读取的是你指定的 .blend 和渲染图。你也可以直接下载其中任意一个已保存的 .blend 文件。

这个凉亭是真实的建筑设计吗?

不是。它是一个演示用的测试场景,选它是因为容易看懂、在 CPU 上渲染也快。它没有做过结构工程设计,也不构成施工指导。

下一步

  • 用 Blender MCP 做建筑可视化 —— 同一个主题,走 MCP 那条路,附体块、室内和灯光的提示词
  • 配置指南 —— 把 Claude、Cursor、VS Code、ChatGPT、Gemini 或本地的 Ollama 模型连接到 Blender
  • 服务端架构 —— MCP 服务端逐个工具地暴露了什么
  • 示例集 —— 更多示例场景,以及它们背后的提示词
最后更新于