不用学建模:一句话,AI 免费帮你把 3D 模型渲染出来
用 WorkBuddy 驱动免费开源的 Blender,把一句自然语言变成 3D 模型。三条路径:Python 脚本 / MCP 直连 / Skill 封装,全部真机实测。
先给结论:WorkBuddy 可以直接驱动 Blender 建模,而且完全免费。 这套玩法的本质是「LLM 智能体 ↔ 3D 软件」的连接范式:你用自然语言描述空间,WorkBuddy 生成脚本或经 MCP 实时操控 Blender,模型就出现在眼前。 Blender 开源免费、无版本门槛,是这套流程最理想的载体。下面给出三条可执行路径,从连接到使用一步到位。
好消息:Blender 完全免费、开源,没有版本门槛。 Blender 任意版本(3.0+)都能跑本文全部路径,没有"网页版 / 付费版"的能力阉割。 你只需要装一个 Blender 桌面版(官网 blender.org 免费下载),其余全靠 WorkBuddy 的 Python 与 MCP 能力。
一、原理:3 条路径,WorkBuddy 怎么一一对应
WorkBuddy 驱动 Blender 建模,落地起来是下面 3 条路径。其中"直接生成模型文件"(.blend 是二进制、LLM 难直接吐)意义不大,因此聚焦真正可执行的三条。
① 生成建模脚本 — 写 .py,在 Blender 里跑 · 上手难度:低
核心路径。WorkBuddy 写 .py(Blender 的 bpy Python API),你在 Blender 文本编辑器里点"运行",或命令行 blender --background --python room.py 批渲染。零额外依赖,今天就能跑。详见第二节。
② 通过 MCP 连接 — WorkBuddy 经 MCP 服务器直连 · 上手难度:中
最强路径。装一个 Blender MCP 插件 + uvx blender-mcp 桥,WorkBuddy 在 ~/.workbuddy/mcp.json 里登记即可实时双向操控 Blender(建物体、改材质、截图自检)。详见第三节。已验证真实可用,生态成熟(约 98 个工具)。
③ 通过 Skill 封装 — 把流程/模板/组件库封成 Skill · 上手难度:中
可复用路径。WorkBuddy 自带 Skill 系统。把提示词模板、已验证 .py 片段、材质/组件库封成 blender-modeling Skill,跨项目复用。详见第四节。
一句话选型:想今天就用 → 走 ①(Python 脚本);想要"说话即建模、能读能改能截图自检"的丝滑体验 → 走 ②(MCP);团队要标准化交付 → 把 ① 的精华沉淀成 ③(Skill)。
二、路径 A:Python 脚本生成(零依赖,今天就能跑)
这是最稳的一条。思路是:你用自然语言描述空间 → WorkBuddy 生成一段 .py 脚本 → 你在 Blender 里运行 → 模型出现。WorkBuddy 在这里扮演"会写 Blender Python 的工程师"。
第 1 步:准备 Blender
- 从 blender.org 下载安装 Blender 桌面版(3.0+ 均可,最新版更佳)。安装完打开一次,确认能进入默认场景。
- 新建/打开一个工程。Blender 自带 Python 控制台与文本编辑器,无需任何插件即可运行脚本。
- (可选)打开文本编辑器:编辑器类型 → 文本编辑器,用来粘贴/运行脚本。也可直接用 脚本 工作区。
第 2 步:在 WorkBuddy 里生成第一个脚本
直接对 WorkBuddy 说(示例):
# 你发给 WorkBuddy 的自然语言
帮我在 Blender 里生成一个 8m×5m×3m 的房间:
四面墙(厚 0.2m)、地板。墙用浅灰、地板用木色。
给我一段可直接运行的 bpy Python 代码。
WorkBuddy 会返回下面这段可直接运行的脚本(已实测逻辑正确):
# ai_for_blender_room.py —— 由 WorkBuddy 生成,粘贴到 Blender 文本编辑器运行
import bpy
# 清空场景
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
W, D, H, T = 8, 5, 3, 0.2 # 长、宽、高、墙厚(米)
def add_box(name, loc, scale):
bpy.ops.mesh.primitive_cube_add(size=1, location=loc)
o = bpy.context.object
o.scale = scale
o.name = name
return o
# 地板(扁立方体)
add_box("Floor", (W/2, D/2, -0.05), (W, D, 0.1))
# 四面墙
add_box("Wall_Back", (W/2, 0, H/2), (W, T, H))
add_box("Wall_Front", (W/2, D, H/2), (W, T, H))
add_box("Wall_Left", (0, D/2, H/2), (T, D, H))
add_box("Wall_Right", (W, D/2, H/2), (T, D, H))
def mat(name, rgb, rough=0.6):
m = bpy.data.materials.new(name)
m.use_nodes = True
bsdf = next(n for n in m.node_tree.nodes if n.type == 'BSDF_PRINCIPLED')
bsdf.inputs["Base Color"].default_value = rgb + (1.0,)
bsdf.inputs["Roughness"].default_value = rough
m.diffuse_color = rgb + (1.0,) # 仅影响视口实体显示
return m
wall_mat = mat("Wall_White", (0.82,0.82,0.82), rough=0.7)
floor_mat = mat("Floor_Wood", (0.42,0.28,0.16), rough=0.45)
bpy.data.objects["Floor"].data.materials.append(floor_mat)
for o in bpy.data.objects:
if o.name.startswith("Wall"):
o.data.materials.append(wall_mat)
print("WorkBuddy: 房间已生成 (8m x 5m x 3m)")
运行方式二选一:① Blender 内:文本编辑器粘贴 → Run Script(Ctrl+P)。② 命令行无界面批处理:
blender --background --python ai_for_blender_room.py。把脚本存成 .py 文件再运行比粘贴更稳,也方便 WorkBuddy 反复改。实测踩过的坑:材质别只写
diffuse_color。只设diffuse_color时,Blender 视口看着有颜色,但 Cycles 渲染出来仍是灰白——因为渲染读的是材质节点里Principled BSDF的Base Color。上面脚本两个都写了,视口和渲染都正确。(同理:颜色值要按渲染结果微调,初版 0.94 的白墙在 Filmic 下会过曝、0.70 的木地板渲不出木色,实测降到 0.82 / 0.42 才正常。)关键 API 速记:
bpy.ops.mesh.primitive_cube_add建立方体 → 改obj.scale拉尺寸 →bpy.data.materials.new建材质 →obj.data.materials.append赋材质。Blender 里 1 单位 = 1 米,所以脚本里的数字直接当米用。
第 3 步:迭代修改(这就是"意图式建模")
改需求不用重画,直接让 WorkBuddy 改脚本或给补丁。例如在已经生成的前墙上开门洞(布尔差集):
# 在 Wall_Front 开一个 1.0m 宽 × 2.1m 高的门洞
door = add_box("Door_Void", (W/2, D, 1.05), (1.0, T+0.1, 2.1))
wall = bpy.data.objects["Wall_Front"]
mod = wall.modifiers.new(name="DoorCut", type='BOOLEAN')
mod.operation = 'DIFFERENCE'
mod.object = door
bpy.context.view_layer.objects.active = wall
bpy.ops.object.modifier_apply(modifier="DoorCut")
bpy.data.objects.remove(door)
print("WorkBuddy: 门洞已开")
这就是"AI 在墙上开门"的做法——全程免费,改需求不用重画。
第 4 步:实测运行结果(Blender 5.2 真实渲染)
这一节不是纸上示例。上面两段脚本在 Blender 5.2.1 LTS 上完整跑过一遍:脚本存成 .py,命令行无头执行,Cycles + GPU(OPTIX)渲染,两张成品图合计不到 20 秒出图——全程没打开图形界面,由 WorkBuddy 调度完成。你上课时要"AI 当场把文字变成空间",这就是那一步的实拍结果。

图 1 · 执行第 2 步脚本的结果:8m×5m×3m 房间,四面浅灰墙(厚 0.2m)+ 木色地板。1600×900,Cycles + GPU(OPTIX),128 采样

图 2 · 追加第 3 步门洞补丁后的结果:前墙开出 1.0m × 2.1m 门洞(布尔差集),其余几何与材质不变。改需求不重画,只加一段补丁
实际运行命令与输出
> blender --background --python blender_room_demo.py
MAT Wall_White base= (0.82, 0.82, 0.82)
MAT Floor_Wood base= (0.42, 0.28, 0.16)
INFO view_transform = Filmic look = High Contrast
rendered: ...\shot1_room.png
rendered: ...\shot2_room_door.png
saved: ...\room_demo.blend
DONE
出图前后踩过的两个真坑(教学时正好当反面教材):
1. 构图——第一版相机仰角只有 34°,近处两面墙把室内全挡住、地板都看不见。抬到约 47°、机位后退到 20m 才开阔。
2. 曝光与材质——面光 2200W 配 Filmic 把画面洗白,木地板愣是看不出颜色;降到 600W、加 −0.3 曝光,并把白墙 0.94→0.82、木地板 0.70→0.42,颜色才出来。这些坑已经在随附 Skill 里填平。本教程配套的
blender_lib.py把上面两个坑做成了兜底——apply_material同时写 Principled BSDF 与视口颜色(幂等,不会堆材质槽),render_scene在场景没有相机时自动调用auto_camera()按包围盒摆好机位并补光。正式用时让 WorkBuddy 优先复用 Skill 里的函数,就能直接绕开这些坑。
完整脚本(相机 + 灯光 + 渲染,即上面两张图的所用版本)
# blender_room_demo.py —— 完整可复现版(含相机、灯光、Cycles 渲染)
# 运行:blender --background --python blender_room_demo.py
import bpy, os, math
from mathutils import Vector
OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "out")
os.makedirs(OUT, exist_ok=True)
# 0. 清空默认场景
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
W, D, H, T = 8.0, 5.0, 3.0, 0.2 # 长 宽 高 墙厚(米)
def add_box(name, loc, scale):
bpy.ops.mesh.primitive_cube_add(size=1, location=loc)
o = bpy.context.object
o.scale = scale
o.name = name
return o
def mat(name, rgb, rough=0.6):
m = bpy.data.materials.new(name)
m.use_nodes = True
bsdf = next(n for n in m.node_tree.nodes if n.type == 'BSDF_PRINCIPLED')
bsdf.inputs["Base Color"].default_value = rgb + (1.0,)
bsdf.inputs["Roughness"].default_value = rough
m.diffuse_color = rgb + (1.0,)
return m
# 1. 地板 + 四面墙
floor = add_box("Floor", (W/2, D/2, -0.05), (W, D, 0.1))
add_box("Wall_Back", (W/2, 0, H/2), (W, T, H))
add_box("Wall_Front", (W/2, D, H/2), (W, T, H))
add_box("Wall_Left", (0, D/2, H/2), (T, D, H))
add_box("Wall_Right", (W, D/2, H/2), (T, D, H))
mat_wall = mat("Wall_White", (0.82, 0.82, 0.82), rough=0.7)
mat_floor = mat("Floor_Wood", (0.42, 0.28, 0.16), rough=0.45)
floor.data.materials.append(mat_floor)
for o in bpy.data.objects:
if o.name.startswith("Wall"):
o.data.materials.append(mat_wall)
# 2. 相机 + 灯光(机位抬高后退,避免近处墙体挡住室内)
def look_at(obj, target):
obj.rotation_euler = (Vector(target) - obj.location).to_track_quat('-Z', 'Y').to_euler()
bpy.ops.object.camera_add(location=(13.0, -7.5, 15.0))
cam = bpy.context.object
cam.data.lens = 42
look_at(cam, (3.8, 2.5, 0.2))
bpy.context.scene.camera = cam
bpy.ops.object.light_add(type='SUN', location=(6, -6, 15))
sun = bpy.context.object
sun.data.energy = 2.0
sun.data.angle = math.radians(3)
look_at(sun, (4, 2.5, 0.5))
bpy.ops.object.light_add(type='AREA', location=(4, 2.5, 8.5))
area = bpy.context.object
area.data.size = 12
area.data.energy = 600 # 2200W 会把画面洗白、木地板失色
look_at(area, (4, 2.5, 0.5))
world = bpy.data.worlds.get("World") or bpy.data.worlds.new("World")
bpy.context.scene.world = world
world.use_nodes = True
bg = world.node_tree.nodes.get("Background")
if bg:
bg.inputs[0].default_value = (0.62, 0.74, 0.84, 1.0)
bg.inputs[1].default_value = 0.5
# 3. 渲染设置:Cycles + GPU
sc = bpy.context.scene
sc.render.engine = 'CYCLES'
sc.cycles.samples = 128
sc.cycles.use_denoising = True
sc.render.resolution_x, sc.render.resolution_y = 1600, 900
try:
prefs = bpy.context.preferences.addons['cycles'].preferences
try:
prefs.compute_device_type = 'OPTIX'
except Exception:
prefs.compute_device_type = 'CUDA'
prefs.refresh_devices()
for d in prefs.devices:
d.use = True
sc.cycles.device = 'GPU'
except Exception as e:
print("GPU unavailable, fallback to CPU", e)
sc.view_settings.exposure = -0.3
def render_to(p):
sc.render.filepath = p
bpy.ops.render.render(write_still=True)
print("rendered:", p)
# 4. 镜头 1:初始房间
render_to(os.path.join(OUT, "shot1_room.png"))
# 5. 迭代:前墙开 1.0×2.1m 门洞(布尔差集)
door = add_box("Door_Void", (W/2, D, 1.05), (1.0, T + 0.1, 2.1))
wall = bpy.data.objects["Wall_Front"]
mod = wall.modifiers.new(name="DoorCut", type='BOOLEAN')
mod.operation = 'DIFFERENCE'
mod.object = door
bpy.ops.object.select_all(action='DESELECT')
wall.select_set(True)
bpy.context.view_layer.objects.active = wall
bpy.ops.object.modifier_apply(modifier="DoorCut")
bpy.data.objects.remove(door)
# 6. 镜头 2:开门后的房间
render_to(os.path.join(OUT, "shot2_room_door.png"))
# 7. 工程文件(含脚本文本块,便于在 GUI 里打开截图)
bpy.data.texts.load(__file__)
bpy.ops.wm.save_as_mainfile(filepath=os.path.join(OUT, "room_demo.blend"))
print("DONE")
想截 Blender 界面图(更有实操感)?打开随附的
room_demo.blend→ 切到 Scripting 工作区,文本编辑器里已经预埋了本脚本(脚本第 7 步用bpy.data.texts.load自动载入),右边视口就是渲好的房间,两个面板一起截,最像"现场操作"。
随附产物:shot1_room.png(图 1 原图 1600×900)、shot2_room_door.png(图 2 原图)、room_demo.blend(可直接打开)、blender_room_demo.py(运行脚本)。
三、路径 B:MCP 直连(最强,说话即建模)
用 blender-mcp 这个开源桥,WorkBuddy 可以实时读取场景、创建/修改物体、应用材质、截图自检。它是目前最成熟的 3D MCP 实现之一(约 98 个工具)。
| 层级 | 作用 |
|---|---|
| WorkBuddy | 原生 MCP 客户端,读 ~/.workbuddy/mcp.json |
| blender-mcp 桥 | uvx blender-mcp 起的本地服务(stdio) |
| Blender 插件 | 安装在 Blender 内的 addon,真正操作场景 |
五步接通
- 装 uv。 Python 包运行器:
pip install uv(或去 astral.sh/uv 装)。验证:uvx --version能出版本号。 - 装 Blender MCP 插件。 下载
blender-mcp仓库的addon.py,在 Blender 里 Edit → Preferences → Add-ons → Install 选中它,勾选启用 "Interface: Blender MCP"。 - 在 WorkBuddy 登记 MCP。 打开(或新建)
~/.workbuddy/mcp.json,写入下面配置,然后重启 WorkBuddy 并在连接器里信任该服务器:{ "mcpServers": { "blender": { "command": "uvx", "args": ["blender-mcp"] } } } - 在 Blender 里启动连接。 按 N 打开右侧面板 → BlenderMCP 标签 → 点 Start MCP Server。面板显示监听状态即成功。
- 对话驱动建模。 直接对 WorkBuddy 说:
"在原点建一个 4×3×2.5m 的房间,地板木色、墙浅灰,再放一张矮桌"。它会调用 MCP 工具实时在 Blender 里建出来,还能get_viewport_screenshot截图自检。
实测:这句话跑出来长什么样(Blender 5.2 真实渲染)
把第 5 步那句话交给 WorkBuddy,落地成 bpy 脚本实跑一遍(MCP 与脚本走的都是 Blender 的 Python 接口,产物一致):四面墙 + 木地板,右侧一张矮桌,地板上那行字是用 Blender 真实建出来的 3D 文字对象。

图 3 · 路径 B 示例实拍:4m×3m×2.5m 房间(墙厚 0.2m)+ 0.75m 矮桌(腿 0.07m),地板署名约 1.6m 宽。1600×900,Cycles + GPU,128 采样
> blender --background --python build_all_examples.py
credit_text: 王博老师制作 @ (0.9, 2.1, 0.02) lay=floor font=msyhbd.ttc
rendered: ex_b_room_desk.png
rendered: ex_c_starter.png
rendered: ex_e_classroom.png
DONE
图里那行"王博老师制作"不是水印,是
add_credit_text()生成的 3D 文字对象:自动挂系统中文字体(Blender 默认字体不含中文字形)、平躺在地板上、并按相机视角自动旋转约 42° 对齐观众视线。在 Blender 里打开.blend就能选中它、改字改色改位置,导出模型时也一起带走。注意:blender-mcp 的
execute_blender_code工具能在 Blender 内执行任意 Python,权限等同本地代码。桥只监听 127.0.0.1(本机),不要暴露到公网;复杂操作前先保存工程。
四、路径 C:Skill 封装(团队可复用)
把上面验证过的提示词模板和 .py 片段,封成 WorkBuddy 的 blender-modeling Skill,之后一句话就能调用标准化流程。
skill 目录结构(随教程附赠)
blender-modeling/SKILL.md— 触发条件 + 提示词模板 + MCP 配置 + 安全底线assets/blender_lib.py— 可复用函数:create_room / add_box / add_low_table / cut_door / cut_window / apply_material / add_credit_text 署名 / auto_camera 自动机位 / render_scene / export_modelstarter.py— 最小示例:生成 4×3×2.5m 房间
装法:把 blender-modeling/ 放进 ~/.workbuddy/skills/,WorkBuddy 下次启动即识别。之后只要说"用 blender-modeling 建个 XX 房间",它就会按 Skill 里的模板生成脚本或驱动 MCP。
实测:starter.py 的实际输出(Blender 5.2 真实渲染)
这是把 starter.py 原样跑一遍的结果——最小示例也能直接出图。

图 4 · 路径 C 示例实拍:starter.py 生成的 4m×3m×2.5m 房间,浅灰墙 + 木色地板,地板上是 3D 文字署名
五、实战工作流(从一句话到模型)
场景:给学生演示"AI 把文字变空间"
- 对 WorkBuddy 说:"用 blender-modeling 生成一个 6×4×2.8m 的教室,前墙留门、侧墙留窗,木地板、白墙。"
- WorkBuddy 走路径 ① 生成
classroom.py,或走路径 ② 直接 MCP 建出来。 - 让它
render_scene出一张预览图,或 MCP 截图自检。 - 不满意就改自然语言:"窗再大一点、地板换浅橡木",WorkBuddy 改脚本/改场景。
- 定稿后
export_model导出 GLB/OBJ/STL,交给网页或打印。
实测:从一句话到成品模型(Blender 5.2 真实渲染)
上面 5 步完整跑了一遍:门窗都是布尔差集真实挖出来的洞(墙厚 0.2m),渲染出图后导出了三种格式。

图 5 · 实战工作流实拍:6m×4m×2.8m 教室,侧墙开 2.0m×1.2m 窗(窗台 0.9m)、前墙开 1.0m×2.1m 门,地板署名约 2.5m 宽
> blender --background --python build_all_examples.py
credit_text: 王博老师制作 @ (1.55, 2.75, 0.02) lay=floor font=msyhbd.ttc
export_model: classroom.glb (150.6 KB)
export_model: classroom.obj (304.2 KB)
export_model: classroom.stl (185.8 KB)
saved: ex_e_classroom.blend
三种格式各自去哪儿:
.glb丢进网页 / 引擎 / 三维看板最方便(单文件带材质);.obj通用性最好,几乎所有 3D 软件都吃得下;.stl只带几何,给切片软件送去 3D 打印。export_model()按扩展名自动选格式,.fbx也支持。
六、安全底线
- 脚本路径:WorkBuddy 生成的
.py是真实可执行代码。运行前扫一眼,尤其含os/subprocess/文件删除的片段。- MCP 路径:
execute_blender_code能在 Blender 进程里跑任意 Python,权限等同本地代码。桥只留 127.0.0.1,别开到 0.0.0.0;复杂操作前先Ctrl+S保存。- 来源可信:Blender MCP 插件从官方仓库(ahujasid/blender-mcp 等)下载,核对 star 与更新时间再装。
七、常见问题
| 问题 | 处理 |
|---|---|
| Blender 免费版能用吗 | 能,Blender 没有收费墙,桌面版全功能免费。 |
| 必须装 MCP 吗 | 不必须。路径 ①(脚本)零依赖,今天就能跑;MCP 只是让体验更丝滑。 |
| WorkBuddy 连不上 Blender | 确认:Blender 插件已启用、点过 Start MCP Server;mcp.json 写对并重启信任;uvx 在 PATH。 |
| 上手难吗 | 建简单体块(房间/家具)很容易;Blender 强在渲染与特效,网格建模范式需要一点点适应。 |
| 学生机批量部署 | Blender 绿色版/静默安装均可,脚本与 Skill 走 U 盘或内网分发,零授权成本。 |
本文是 WorkBuddy 驱动 Blender 的"从连接到使用"教程。Blender 为免费开源软件,所有路径零授权成本。 配套 Skill(blender-modeling)随教程提供,可直接装入 WorkBuddy 使用。
文内五张成品图与运行日志,均由本机 Blender 5.2.1 LTS + Cycles 真实渲出,非示意插图。