← 返回 AIGC教程
AI建模 今天

不用学建模:一句话,AI 免费帮你把 3D 模型渲染出来

用 WorkBuddy 驱动免费开源的 Blender,把一句自然语言变成 3D 模型。三条路径:Python 脚本 / MCP 直连 / Skill 封装,全部真机实测。

不用学建模:一句话,AI 免费帮你把 3D 模型渲染出来

先给结论: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

  1. 从 blender.org 下载安装 Blender 桌面版(3.0+ 均可,最新版更佳)。安装完打开一次,确认能进入默认场景。
  2. 新建/打开一个工程。Blender 自带 Python 控制台与文本编辑器,无需任何插件即可运行脚本。
  3. (可选)打开文本编辑器:编辑器类型 → 文本编辑器,用来粘贴/运行脚本。也可直接用 脚本 工作区。

第 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 当场把文字变成空间",这就是那一步的实拍结果。

Blender 渲染的 8m×5m×3m 房间:四面浅灰墙、木色地板

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

在房间前墙开出 1.0×2.1m 门洞后的渲染结果

图 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,真正操作场景

五步接通

  1. 装 uv。 Python 包运行器:pip install uv(或去 astral.sh/uv 装)。验证:uvx --version 能出版本号。
  2. 装 Blender MCP 插件。 下载 blender-mcp 仓库的 addon.py,在 Blender 里 Edit → Preferences → Add-ons → Install 选中它,勾选启用 "Interface: Blender MCP"。
  3. 在 WorkBuddy 登记 MCP。 打开(或新建)~/.workbuddy/mcp.json,写入下面配置,然后重启 WorkBuddy 并在连接器里信任该服务器:
    {
      "mcpServers": {
        "blender": {
          "command": "uvx",
          "args": ["blender-mcp"]
        }
      }
    }
  4. 在 Blender 里启动连接。 按 N 打开右侧面板 → BlenderMCP 标签 → 点 Start MCP Server。面板显示监听状态即成功。
  5. 对话驱动建模。 直接对 WorkBuddy 说:"在原点建一个 4×3×2.5m 的房间,地板木色、墙浅灰,再放一张矮桌"。它会调用 MCP 工具实时在 Blender 里建出来,还能get_viewport_screenshot 截图自检。

实测:这句话跑出来长什么样(Blender 5.2 真实渲染)

把第 5 步那句话交给 WorkBuddy,落地成 bpy 脚本实跑一遍(MCP 与脚本走的都是 Blender 的 Python 接口,产物一致):四面墙 + 木地板,右侧一张矮桌,地板上那行字是用 Blender 真实建出来的 3D 文字对象。

4×3×2.5m 房间内放了一张矮桌,地板上是 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_model
    • starter.py — 最小示例:生成 4×3×2.5m 房间

装法:把 blender-modeling/ 放进 ~/.workbuddy/skills/,WorkBuddy 下次启动即识别。之后只要说"用 blender-modeling 建个 XX 房间",它就会按 Skill 里的模板生成脚本或驱动 MCP。

实测:starter.py 的实际输出(Blender 5.2 真实渲染)

这是把 starter.py 原样跑一遍的结果——最小示例也能直接出图。

starter.py 生成的 4×3×2.5m 房间,浅灰墙、木地板与 3D 文字署名

图 4 · 路径 C 示例实拍:starter.py 生成的 4m×3m×2.5m 房间,浅灰墙 + 木色地板,地板上是 3D 文字署名

五、实战工作流(从一句话到模型)

场景:给学生演示"AI 把文字变空间"

  1. 对 WorkBuddy 说:"用 blender-modeling 生成一个 6×4×2.8m 的教室,前墙留门、侧墙留窗,木地板、白墙。"
  2. WorkBuddy 走路径 ① 生成 classroom.py,或走路径 ② 直接 MCP 建出来。
  3. 让它 render_scene 出一张预览图,或 MCP 截图自检。
  4. 不满意就改自然语言:"窗再大一点、地板换浅橡木",WorkBuddy 改脚本/改场景。
  5. 定稿后 export_model 导出 GLB/OBJ/STL,交给网页或打印。

实测:从一句话到成品模型(Blender 5.2 真实渲染)

上面 5 步完整跑了一遍:门窗都是布尔差集真实挖出来的洞(墙厚 0.2m),渲染出图后导出了三种格式。

6×4×2.8m 教室,侧墙开窗、前墙开门,地板上有 3D 文字署名

图 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 真实渲出,非示意插图。

WorkBuddyBlender3D建模MCP