
刚开始接触 3D 重建时我的第一反应是这一定需要多视角照片、复杂标定、密集重建最后再进建模软件手工清理。但当我尝试把“大模型编码 Agent”和“Blender 程序生成”放在一起时发现另一条更轻量的路径输入单张图片让多模态大模型理解场景布局再让编码 Agent 生成一段可编辑、可执行的 Blender Python 脚本最终在 Blender 里直接“拼”出一个 3D 场景。这个过程不需要研究者级别的重建算法也不需要精细到一毫米的建模手艺更像是在“用代码描述空间”。这篇文章会围绕这条方案展开完整拆解单张图片转 3D 场景的原理、编码 Agent 的工作流、Blender 脚本生成与执行方式以及实际项目中容易踩的坑。适合正在折腾 AI Agent、对大模型生成代码感兴趣或者想用 Blender 做程序化场景的开发者。读完以后你可以搭出一套“图片输入 → 场景描述 → Agent 写脚本 → Blender 渲染”的自动化链路。1. 方案概述大模型编码 Agent 如何“拼”3D 场景1.1 这不是传统意义上的 3D 重建先澄清一个容易混淆的概念。传统 3D 重建一般指从多张图片或者视频序列中恢复物体的几何结构比如用 COLMAP、OpenMVS 生成稠密点云再经过网格化、纹理映射得到高保真模型。这条路线精度高但流程重、门槛高普通项目很难快速落地。本文要讲的方法更像“3D 场景拼装”或“程序化 3D 生成”用多模态大模型分析单张图片中的主体物体、空间关系、材质颜色再用编码 Agent 把这些信息转成 Blender Python 脚本Blender 在后台执行脚本生成由几何体、灯光、相机组成的可编辑场景。最终产出的不是一张贴图也不是一个不可编辑的网格文件而是一个.blend工程你随时可以在 Blender 里拖拽物体、改材质、调灯光。这种方案的优势很明确输入成本低只需要一张图片。输出可用性高得到的是可编辑、可执行、可再渲染的 Blender 程序。扩展性强同一套工作流可以复用到室内设计、电商摆拍、短视频分镜、游戏场景概念预演等场景。缺点是几何精度有限不能还原复杂物体的真实轮廓。但它做“场景草图”和“快速原型”已经足够。1.2 工作流里的三个角色整个方案可以抽象为三个角色第一个是“视觉理解器”用多模态大模型读取图片输出物体列表、空间位置描述、颜色材质、风格氛围。这一步的输出不是图片而是结构化的 JSON 或自然语言。第二个是“编码 Agent”接收视觉理解结果和系统提示词负责规划 Blender 脚本的代码结构生成可执行的bpy代码。编码 Agent 不止是“生成一次代码”它还会根据 Blender 的报错信息反复修改直到脚本能成功运行。第三个是“执行器”也就是 Blender 本身。它通过命令行后台模式运行 Python 脚本把代码变成实际的 3D 场景输出.blend文件或渲染图。三者串起来就是一条自动化的 3D 生成流水线。1.3 为什么用“编码 Agent”而不是直接调模型有人会问为什么不直接让大模型输出一个 3D 模型文件原因很简单文本或代码才是大模型最稳定的输出域。让大模型直接生成.glb、.obj这类二进制或复杂文本格式很容易出错而且难以修改。但让大模型生成bpy脚本它只需要遵守 Python 语法和 Blender API 规则可调试性、可复用性都强得多。更关键的是编码 Agent 天然支持“错误反馈循环”。Blender 运行脚本后返回报错信息Agent 读取报错并修正这是普通单次生成做不到的。2. 环境准备与版本说明2.1 你需要准备什么环境上不依赖特别高配的机器但建议至少准备下面几样操作系统Windows 10/11、Ubuntu 20.04 均可macOS 也可以跑 Blender 脚本只是后台命令稍有差异。Blender3.6 LTS 或 4.x。版本需要根据你的实际项目调整示例重点演示配置思路在 3.6 环境中均可运行。Python主要使用 Blender 内置的 Python 解释器无需单独安装。大模型访问方式可以调用 API也可以在本地部署量化版代码模型比如 Qwen2.5-Coder、DeepSeek-Coder 等。深度估计模型可选比如 Depth Anything 或 MiDaS用来获取图片的相对深度信息。没有深度估计模型也能跑通流程但加上深度信息后生成场景的空间层次感会好很多。2.2 安装依赖如果你的深度估计环节使用 Python 独立处理需要准备少量依赖conda create -n image2scene python3.10 -y conda activate image2scene pip install opencv-python pillow numpy pip install torch torchvision大模型部分不限制具体 SDK。如果你用 OpenAI 兼容接口只需要安装openai库如果用本地模型可以走 HTTP 接口或 Transformers。建议先写一个极薄的客户端层方便不同模型之间切换。项目目录结构可以是这样image2scene/ ├── input/ │ └── room.jpg ├── depth/ │ └── room_depth.png ├── agent/ │ ├── prompts.py │ ├── planner.py │ └── executor.py ├── scripts/ │ ├── gen_scene.py │ └── render_scene.py └── output/ └── scene.blendinput存放原始图片depth存放深度图agent存放 Agent 工作流逻辑scripts存放最终生成的 Blender 脚本output存放.blend文件和渲染图。3. 拆解核心原理单张图片转 3D 的关键步骤3.1 视觉理解从图片到结构化描述第一步是让多模态大模型“看懂”图片。这里不要求模型输出像素级语义分割而是输出场景中的关键对象和相对关系。举个例子一张客厅照片模型输出可能像这样{ scene_type: indoor_livingroom, style: modern_minimalist, objects: [ {name: floor, type: plane, position: center_bottom, color: [0.85, 0.80, 0.75]}, {name: sofa, type: box, position: middle_center, color: [0.70, 0.50, 0.40]}, {name: coffee_table, type: box, position: center_front, color: [0.45, 0.38, 0.30]}, {name: ceiling_light, type: sphere, position: top_center, color: [1.0, 0.95, 0.85]} ], camera: {distance: 6.0, height: 1.6, fov: 45} }这一步的关键是 Prompt 设计。要让模型输出“可被代码消费”的 JSON而不是大段描述。我一般会在系统提示词里明确指定字段名、取值枚举和坐标规范。位置描述可以先用相对方位比如center_bottom、middle_center再由后面的坐标映射模块转换成 Blender 世界坐标。这样视觉模型的输出更稳定不会掉进绝对坐标的细节里。3.2 深度先验为场景注入空间层次单张图片缺少真实深度信息但单目深度估计模型可以根据透视、遮挡、光影等信息推测出相对深度。常用模型包括 MiDaS、Depth Anything。它们的输出是一张灰度深度图亮的地方近暗的地方远。深度图的用途不是精细重建而是给编码 Agent 一个先验哪个物体应该更高、更近、更大。比如图片中的沙发在画面中央偏下、深度值偏高那么在 Blender 里它应该放在比较靠前的位置墙壁在远处、深度值偏低就应该放在场景后方。获取深度图后可以继续把它映射成 Blender 的坐标。比如将深度值归一化到 0 到 1再映射到场景坐标 Z 轴或放置平面上。如果没有深度先验Agent 生成的场景会像“平面贴纸”物体之间没有前后关系。3.3 编码 Agent把描述变成可执行脚本编码 Agent 的核心能力是把视觉理解结果和深度信息翻译成 Blender Python API 调用。比如视觉模型说“有一张桌子在沙发前方”Agent 会规划用什么 Primitiveplane、cube、cylinder。放在哪里由相对坐标转换得到。长什么样材质颜色、金属度、粗糙度。场景怎么渲染相机朝向、灯光位置、渲染引擎。这过程中 Agent 需要处理很多细节比如 Blender 坐标系的轴方向、材质颜色需要 RGBA 四通道、默认立方体的大小为 1。这些约束写进系统提示词生成的代码才可靠。3.4 Blender 后台执行无界面运行正常情况下人打开 Blender 需要点击操作但程序生成场景不可能每次手动操作。Blender 支持命令行后台模式blender --background --python gen_scene.py -- scene_desc.json--background表示不启动图形界面--python指定要执行的脚本--之后是传给 Python 脚本的参数。脚本执行完成后会生成.blend文件方便后续打开、编辑和渲染。4. 搭建编码 Agent 工作流4.1 系统提示词模板编码 Agent 的质量很大程度上取决于提示词。我把这套 Prompt 分成三块角色定义、输出要求、约束条件。SYSTEM_PROMPT 你是一位 Blender Python 程序生成专家。 用户会给你一个场景 JSON 描述可能包含物体、颜色、相机、灯光信息。 你的任务是生成完整的 Blender Python 脚本。 要求 1. 只使用 bpy 模块。 2. 每个物体都必须有清晰的命名。 3. 物体材质使用 Principled BSDF设置 base_color。 4. 脚本开头需要清空当前场景中的默认物体。 5. 脚本末尾添加一盏区域灯和一盏点光灯。 6. 使用 Cycles 渲染引擎分辨率设置为 1920x1080。 7. 只输出 Python 代码不要输出解释、注释以外的文字。 8. 代码中不要使用外部系统调用。 注意 - Blender 坐标使用右手系默认地面为 XOY 平面。 - 颜色格式为 RGBA取值范围 0 到 1。 - 所有变量名保持紧凑简洁。 这组提示词有几个好处限制了模型输出范围强制清空场景避免了默认立方体干扰指定渲染引擎能保证渲染结果符合预期约束禁止外部系统调用则提高了安全性。4.2 Agent 循环生成、执行、报错、修复编码 Agent 不只生成一次代码。更稳定的做法是“生成 → 后台执行 → 捕获报错 → 反馈给模型 → 再次生成”直到脚本成功运行或达到最大尝试次数。下面是一个极简 Agent 循环示例逻辑清晰便于理解import subprocess import json from llm_client import chat_completion def call_agent(prompt, historyNone): messages [{role: system, content: SYSTEM_PROMPT}] if history: messages history messages.append({role: user, content: prompt}) return chat_completion(messages) def run_blender_script(script_path, data_path, timeout90): cmd [ blender, --background, --python, script_path, --, data_path ] result subprocess.run( cmd, capture_outputTrue, textTrue, timeouttimeout ) return result.returncode, result.stdout, result.stderr def agent_loop(scene_json_path, max_tries3): user_prompt 请根据这个场景 JSON 生成脚本\n open(scene_json_path, encodingutf-8).read() history [] script_path scripts/gen_scene.py for attempt in range(max_tries): response call_agent(user_prompt, historyhistory) code extract_code_block(response) with open(script_path, w, encodingutf-8) as f: f.write(code) returncode, stdout, stderr run_blender_script(script_path, scene_json_path) if returncode 0: print(脚本执行成功) return script_path # 把报错信息作为下一轮上下文 feedback fBlender 返回错误信息请修复代码\n{stderr[-2000:]} history.append({role: assistant, content: code}) history.append({role: user, content: feedback}) raise RuntimeError(Agent 在多次尝试后仍未生成可执行脚本)这里的llm_client.chat_completion是一个自封装的函数你需要根据自己调用的模型 SDK 去实现。extract_code_block负责从模型输出里提取纯 Python 代码避免把 Markdown 标记或自然语言一起写入文件。这个循环看起来简单在实际项目里非常有效。Blender 的报错信息通常很明确比如“AttributeError: NoneType object has no attribute diffuse_color”模型看了之后能很快修正。4.3 更稳固的 Agent 策略先规划再编码上面是一次性生成完整脚本。场景复杂以后脚本可能几百行单一生成会容易混乱。更好的方式是分两步第一步Agent 先生成“代码规划”描述要创建哪些物体、每个物体的坐标和材质参数、相机灯光如何配置。第二步根据规划生成具体的bpy调用。这样做的好处是即使最终代码出问题你也能从规划层快速定位是“思路不对”还是“API 写错”。我习惯把规划保存为一份plan.json和生成脚本放在一起作为可追踪的中间产物。{ steps: [ {action: create_plane, args: {name: floor, size: [6, 6, 1]}}, {action: create_cube, args: {name: sofa, location: [0, -2, 0.5], scale: [2.2, 0.8, 0.6]}}, {action: set_material, args: {target: sofa, color: [0.71, 0.53, 0.4]}}, {action: add_camera, args: {location: [0, -8, 2.2], fov: 45}} ] }这样中间状态人类可读也方便排查。4.4 安全边界不要让 Agent 任意执行代码在真实业务中Agent 生成的代码可能包含潜在风险比如文件删除、网络请求、系统命令执行。因此在执行阶段必须做安全约束只在隔离环境或测试机中运行生成脚本。给子进程设置超时时间避免无限循环。限制脚本只能访问指定输入输出目录。人工 Review 关键代码后再跑下线场景。生产环境禁止自动执行未经验证的生成脚本。5. 实战案例单张室内图片生成 Blender 场景5.1 输入与预期输出假设我们输入一张现代客厅照片。图片中有木地板、灰色沙发、白色茶几、落地灯、一幅装饰画。目标是让 Agent 生成一个 Blender 场景地面是一块大平面。沙发是组合立方体。茶几是长方体。落地灯由圆柱灯杆和球形灯罩组成。相机从偏前方 45 度角俯视。最终能在 Cycles 引擎下渲染出接近原图氛围的图像。先让多模态模型读图得到结构化 JSON 描述再交给 Agent 去写脚本。5.2 准备好场景描述文件将视觉模型输出的结果清理后保存为input/scene_desc.json{ cameras: [ {name: main_cam, location: [0, -7, 2.5], rotation: [0, 0, 0], fov: 45} ], lights: [ {type: point, location: [0, 0, 3.5], energy: 100}, {type: area, location: [-3, 3, 2], size: 2, energy: 300} ], objects: [ {name: floor, type: plane, location: [0, 0, 0], scale: [6, 6, 1], color: [0.82, 0.78, 0.7]}, {name: sofa_base, type: cube, location: [0, -1.5, 0.3], scale: [2.2, 0.9, 0.6], color: [0.55, 0.55, 0.6]}, {name: sofa_back, type: cube, location: [0, -1.9, 0.7], scale: [2.2, 0.3, 0.5], color: [0.55, 0.55, 0.6]}, {name: coffee_table, type: cube, location: [0.3, 0.6, 0.25], scale: [1.2, 0.6, 0.25], color: [0.95, 0.95, 0.9]}, {name: lamp_pole, type: cylinder, location: [2.2, 1.2, 0.75], scale: [0.06, 0.06, 1.5], color: [0.3, 0.3, 0.35]}, {name: lamp_shade, type: sphere, location: [2.2, 1.2, 1.7], scale: [0.3, 0.35, 0.3], color: [1.0, 0.85, 0.6]} ] }这段 JSON 就是视觉理解阶段的目标产物。你也可以先用多模态模型输出原始文案再用手工或脚本整理成这个结构。5.3 编写可执行的 Blender 脚本下面是scripts/gen_scene.py的核心版本可以直接保存运行。main()读取 JSON再逐个创建物体、材质、灯光和相机。# 文件路径scripts/gen_scene.py import bpy import json import sys def clear_scene(): 清空当前场景中的所有 Mesh 物体。 for obj in bpy.data.objects: bpy.data.objects.remove(obj, do_unlinkTrue) def new_material(name, color): 创建带基础色的 Principled BSDF 材质。 mat bpy.data.materials.new(name) mat.use_nodes True bsdf mat.node_tree.nodes.get(Principled BSDF) if bsdf is not None: bsdf.inputs[Base Color].default_value color [1.0] return mat def add_object(desc): 根据描述创建 Plane、Cube、Cylinder 或 Sphere。 name desc[name] loc tuple(desc[location]) scale tuple(desc[scale]) color list(desc[color]) if desc[type] plane: bpy.ops.mesh.primitive_plane_add(size1, locationloc) elif desc[type] cube: bpy.ops.mesh.primitive_cube_add(size1, locationloc) elif desc[type] cylinder: bpy.ops.mesh.primitive_cylinder_add(radius1, depth1, locationloc) elif desc[type] sphere: bpy.ops.mesh.primitive_uv_sphere_add(radius1, locationloc) else: raise ValueError(fUnsupported type: {desc[type]}) obj bpy.context.object obj.name name obj.scale scale obj.data.materials.append(new_material(name _mat, color)) return obj def setup_light(desc): if desc[type] point: bpy.ops.object.light_add(typePOINT, locationtuple(desc[location])) elif desc[type] area: bpy.ops.object.light_add(typeAREA, locationtuple(desc[location])) light bpy.context.object light.data.energy desc[energy] if desc[type] area: light.data.size desc.get(size, 1.0) return light def setup_camera(desc): bpy.ops.object.camera_add(locationtuple(desc[location])) cam bpy.context.object cam.rotation_euler tuple(desc[rotation]) cam.data.lens desc.get(lens, 35) bpy.context.scene.camera cam def main(): # 解析命令行参数通过 -- 传入 JSON 路径 if -- in sys.argv: idx sys.argv.index(--) data_path sys.argv[idx 1] else: data_path input/scene_desc.json with open(data_path, r, encodingutf-8) as f: scene json.load(f) clear_scene() for obj_desc in scene[objects]: add_object(obj_desc) for light_desc in scene.get(lights, []): setup_light(light_desc) for cam_desc in scene.get(cameras, []): setup_camera(cam_desc) if __name__ __main__: main()运行命令blender --background --python scripts/gen_scene.py -- input/scene_desc.json执行成功后scene_desc.json中描述的物体会被创建到 Blender 场景里。你可以打开 Blender 查看也可以修改scripts/gen_scene.py里的clear_scene()、add_object()等函数实现自己的扩展逻辑。5.4 进一步整合深度信息如果想“更有立体感”可以在add_object之前先用深度图计算物体高度或前后位置。比如读取depth/room_depth.png把每个像素的亮度映射成该位置的 Z 偏移再渲染成一张地面网格。# 文件路径scripts/gen_depth_mesh.py核心思路 import bpy import cv2 import numpy as np depth cv2.imread(depth/room_depth.png, cv2.IMREAD_GRAYSCALE).astype(np.float32) depth cv2.resize(depth, (64, 64)) # 创建地面网格并设置顶点高度 bpy.ops.mesh.primitive_grid_add(x_subdivisions63, y_subdivisions63, size6, location(0, 0, 0)) mesh_obj bpy.context.object mesh mesh_obj.data verts [] for i in range(64): for j in range(64): # 将深度亮度映射到 Z 轴 z depth[i, j] / 255.0 * 0.5 x (j / 63.0 - 0.5) * 6.0 y (0.5 - i / 63.0) * 6.0 verts.append((x, y, z)) mesh.vertices.foreach_set(co, [item for v in verts for item in v]) mesh.update() bpy.ops.object.shade_smooth()这段代码的思路是把深度图变成一张带起伏的地面形成“前低后高”的层次感。实际项目中你可以结合物体描述把深度图用于摆放茶几、沙发、灯具的位置和高度不必真的让地面凹凸不平。6. 代码讲解Blender Python 场景生成核心片段6.1 材质让物体看起来真实场景里的物体默认是灰色材质视觉上很单调。改动主要依赖 Principled BSDF 节点。上面的new_material函数只设置了 Base Color完善一下import bpy def create_metal_material(name): mat bpy.data.materials.new(name) mat.use_nodes True bsdf mat.node_tree.nodes.get(Principled BSDF) if bsdf is not None: bsdf.inputs[Metallic].default_value 1.0 bsdf.inputs[Roughness].default_value 0.2 return mat这里Metallic控制金属程度Roughness控制粗糙度两者组合能模拟不锈钢、塑料、陶土等效果。实际建模中你可以在add_object里接收额外的材质参数。6.2 灯光场景氛围的关键上面示例里用了POINT和AREA两种灯光。POINT模拟灯泡靠近物体会让局部变亮AREA光线更柔和适合模拟窗户或大型柔光灯。灯光参数主要有energy强度和size面积大小。面积越大阴影越柔和。bpy.ops.object.light_add(typeAREA, location(0, -1, 3)) area bpy.context.object area.data.energy 500 area.data.size 3这里size设置为 3 后阴影边缘会很自然。如果追求真实感可以添加第二盏补光灯背景暗部就不会完全死黑。6.3 相机与渲染输出为了让生成结果能直接出图脚本里应该包含相机和渲染参数设置。等整个场景搭建好后执行一次静态渲染输出 PNG 图。import bpy def render_view(): scene bpy.context.scene scene.render.engine CYCLES scene.cycles.samples 128 scene.render.resolution_x 1920 scene.render.resolution_y 1080 scene.render.image_settings.file_format PNG scene.render.filepath //output/render.png bpy.ops.render.render(write_stillTrue)scene.cycles.samples是采样数数值越高画质越好、耗时越久。先设 128 做预览确认构图没问题再提高。6.4 坐标系和缩放陷阱第一次写 Blender Python 脚本最容易踩的坑是坐标系。Blender 中默认地平面是 XOY 平面也就是 Z 轴朝上。你输入的平面尺寸和物体位置都要基于这个理解。另外Blender 的primitive_cube_add(size1)只指定边长 1再通过obj.scale非等比缩放例如scale[2.2, 0.9, 0.6]。这个scale是相对原始尺寸的比例不是绝对尺寸。如果你需要精确尺寸必须在缩放后再检查obj.dimensions。7. 常见问题与排查思路实际项目中问题大多集中在几个地方代码生成失败、深度图映射有误、渲染效果不理想。下面整理成表格方便查阅。问题现象常见原因解决思路Blender 后台脚本无输出忘记加--background或脚本语法错误使用--background先在任何 Python 环境里做语法检查bpy.data.objects.remove报错正在移除被场景引用的相机或灯光遍历时先复制对象列表再删除或只删除 Mesh 物体生成的脚本有AttributeError模型记住了不存在的 Blender API把完整报错返回给 Agent让 Agent 根据版本修正场景物体位置不对相对方位转坐标逻辑出错输出 JSON 检查必要时在 Blender 里先放置一个参考平面材质偏暗未设置灯光或渲染引擎仍是 Eevee使用 Cycles并添加一盏强度足够的区域灯物体相互穿透没有为每个物体添加碰撞或手动对齐简化场景先让 Agent 输出位置坐标人工检查后再生成深度图网格太碎分辨率太高导致顶点过多先降采样到 64x64再逐步提高细节排查顺序建议如下先检查 JSON 描述是否合理。再单独运行blender --background --python看报错。如果有报错把最后 2000 字返回给大模型修复。如果脚本能跑通再打开 Blender 视觉检查物体位置。最后调整灯光和渲染参数。其中“把报错返回给 Agent”是最高效的修复手段。不要人工去猜让 Agent 自己根据反馈改代码省时省力。8. 最佳实践与工程建议8.1 把描述和代码分离最推荐的架构是视觉模型产出中间 JSON编码 Agent 只负责 JSON 到代码的转换。不要把图片理解、场景规划、代码生成全部交给一个大模型。分离之后任何一个环节出问题都能单独调试和替换模型。8.2 为 Agent 定义“可执行边界”代码生成类 Agent 容易出现“自由发挥”过头的情况。比如模型想加一段自动下载贴图的代码或者使用subprocess调用系统命令。这些行为在实际工程中都是安全风险。系统提示词里要明确只允许使用bpy模块禁止访问文件系统之外的资源生成代码必须经过人工 Review 后再执行。8.3 预留人工调整入口即使 Agent 生成的场景已经很接近目标最终建模师或开发者仍然需要做调整。所以脚本里所有物体和材质参数都要尽量放在 JSON 中避免硬编码。这样修改一张图的效果不用改代码只需要改 JSON 描述。8.4 日志与追踪Agent 每次生成的脚本、报错信息、最终运行结果都要保存下来。一旦场景出问题你能翻出历史记录看到是哪一轮生成造成的。推荐记录三样东西每一步的系统提示词和用户输入。模型返回的代码。Blender 的 stdout 和 stderr。有了这些Agent 的行为就是可追踪的。8.5 数据合法性与最小权限在读取图片、生成场景前确认你对图片内容有使用权和处理权。不要拿未经授权的私人照片、商业产品图做自动化加工。特别在生产环境中涉及用户数据时必须确认授权和合规边界。9. 总结与学习路线这套方案的核心思路是把“3D 重建”从空间几何问题转变成“代码生成”问题。大模型负责理解图片和规划场景编码 Agent 负责把规划写成可运行的 Blender 脚本Blender 负责最终出图和工程文件。整个流程可以反复调试、批量执行适合快速做概念场景、室内布局预演和 AIGC 3D 内容生产。下一步你可以继续深入几个方向学习 Blender Python API 的更多细节比如 modifiers、约束、物理引擎。尝试更好的视觉理解方案比如结合 SAM 做图像分割后再逐物体定位。把 Agent 循环做得更健壮加入单元测试、lint 检查、渲染预览对比。探索本地大模型部署把编码 Agent 完全私有化保证数据不出内网。如果你是零基础建议从最简单的“立方体 平面 灯光”开始先熟悉bpy.ops.mesh.primitive_*和材质节点再一步步加入深度、相机路径和复杂建模。如果你已经有 Blender 基础那就直接把这套 Agent 工作流接进自己的自动化管线里。工具的进化很快但底层的思路相对稳定用大模型理解空间用代码描述场景再用执行器把描述变成现实。希望这篇文章能帮你把这条链路跑通。如果实践中有新的坑也欢迎在评论区一起交流。