Contents

OpenTopos: Towards Agentic 3D Procedural Generation Without Human Feedback


作者Yupeng Gao
状态未发表 research preview,2026 年 6 月
代码https://github.com/gaoypeng/opentopos

给定文本 prompt,orchestrator 驱动多个 coding agent 并行写 Blender Python 代码,framework 无头执行 Blender 渲染,VLM judge 评分,失败则自动生成 fix task 迭代,直到通过或达到上限——全程无人干预,最终产出带 articulation 的完整 3D 资产(GLB + URDF)。

研究动机

核心方法

1. 整体控制流:DAG 任务图

整个生成过程是一个 DAG(有向无环图),每个节点是 AgentTask(调用 LLM)、ToolTask(调用确定性工具)或 SubgraphTask(运行时展开为子任务)之一。Runner 用 Kahn 算法做拓扑排序,用线程池并行执行无依赖节点(默认 4 workers)。所有任务的输出写到共享 workspace,agent 之间不直接通信,只通过文件系统协作。

2. design.json:多 agent 协调的唯一合约

01_agent_design 写出 design.json,这是整个 pipeline 的核心合约文件,所有 part agent 并行运行时只读自己对应的 entry,互不通信。schema 包含 robot_name、description、parts(每个 part 有 world_xyz、world_extents、color_rgba、geometry_strategy、texture.prompt、instances)和 joints(每个 joint 有 parent、child、type、origin_xyz、axis、limit)。设计原则:world_xyz 和 world_extents 是硬约束,part agent 写的代码产出的 object 的世界 bbox 必须在 5mm 容差内。

3. SubgraphTask 展开:运行时 DAG 动态扩展

当 02_subgraph_parts 的依赖完成后,runner 读取 design.json,调用 articulated_parts 展开策略,在运行时将 SubgraphTask 替换为对每个 part 的 agent 任务 + texture 工具任务,并在最后生成 verify/render/judge 批量任务。展开后的完整 plan 持久化到 plan.expanded.json。Resume 时优先读 expanded 版。

4. Part Agent 职责

每个 part agent 接到 goal:写 src/parts/<name>.py,实现 build_<name>() 函数,返回一个 Blender object,名字必须与 design.json 中 name 字段完全匹配。关键约定:build_<name>() 返回 object 的世界 bbox 中心必须在 world_xyz 的 5mm 内,extents 在 world_extents 的 5mm 内;只写几何代码,不写材质/纹理/着色器代码;无随机性。

5. VLM Judge:如何评分

tool_judge 调用 ClaudeVisionCritic.evaluate(),流程:将 8 张多视角渲染图 copy 到 critic_images 目录;构建 judge prompt,包含 identity_recognizability(weight=0.25)、completeness_checklist(weight=0.20)、geometry_detail(weight=0.20)、structure_plausibility(weight=0.15)、fit_quality(weight=0.10)等 7 个评分标准;以 agent 方式调用 Claude,允许 agent 读取图像文件后输出 JSON;计算 overall_score,pass_threshold = 0.65。

6. Fix Loop:失败后自动迭代

Runner 的主循环最多 max_global_iters 次:执行所有 ready 的 tasks,若所有 judge 通过则提前终止;否则 build_fix_tasks 分析失败原因,生成 fix task(per-part judge 失败则创建 fix_part 任务包含得分、保留项和改进项;assembly judge 失败则创建 fix_loop 任务包含所有 criterion 的得分和 suggested_fixes;runtime 错误则创建包含 traceback 的 fix_part_runtime 任务),追加到 DAG 并重跑。Sticky-pass 机制:per-part judge 一旦通过,在后续迭代中该 part 不再重新运行,防止 VLM 评分随机性导致退步。

7. Template + Instances:重复 part 的代价优化

当某 object 有重复 part(如 4 条腿),design agent 使用 instances 字段:Part agent 只写 build_leg() 一个函数(canonical pose),build.py 负责 copy × 4,命名为 Leg_0, Leg_1, Leg_2, Leg_3。实测效益:4 条腿从 ~$3.0(4 个独立 agent)→ $0.74(1 个 canonical agent),节省 75%,且 per-part judge 质量更高。

主要实验结果

局限与展望