# BlenderWorld: 223 Blender briefs, graded by an agent that opens the .blend

> Satyajit Ghana — Head of Engineering @ Inkers Technology
> canonical: https://ai.thesatyajit.com/articles/blenderworld
> date: 2026-10-23
> tags: benchmarks, agents, 3d, qwen, mcp, multimodal

[BlenderWorld](https://arxiv.org/abs/2610.23986) (arXiv 2610.23986, dated 16 October 2026; Zhejiang University, Alibaba's Qwen team, CUHK, Fudan, NTU) is a benchmark for agents that build 3D scenes in Blender. Each of its 223 tasks is a production brief: recreate this data-centre aisle with a cold-aisle enclosure, model this lion cub with fur and a rig, build a Chesterfield sofa to these dimensions and render it at 4K. The agent gets the brief, any reference images or video, and any spec files. It hands back an editable `.blend` plus whatever renders and exports the brief asked for.

Qwen's announcement puts the motivation in one line: "Looking right in 2D doesn't really mean the scene holds together in 3D." So BlenderWorld does not score a hero render. It renders the submitted project from eight views it chooses itself, and it sends a second agent into the `.blend` to check what the pixels cannot show.

I read the paper (the PDF ships in the [GitHub repo](https://github.com/QwenLM/BlenderWorld)), the evaluator code at commit `dd4f357`, and the [Hugging Face dataset](https://huggingface.co/datasets/Qwen/BlenderWorld). I downloaded all 223 task records and rubrics (6.3 MB), installed Blender as the `bpy` Python module on a shared 4-core cloud VM with no GPU, built two toy submissions, and ran the evaluator's own scene-inspection helper and scoring functions on them. I made no hosted model calls, so I did not run the judges themselves. Labels throughout: **measured** means I computed it from a file or a run, **reported** means it is the authors' figure, **reasoned** means it is my arithmetic on the other two.

## Why 3D output is hard to grade

Code benchmarks have tests. 2D design benchmarks can compare a screenshot to a target. A 3D brief has neither.

There is usually no ground-truth asset. "Recreate this room" from one photograph admits many correct scenes, and "design a booth in this style" admits more. A single render is also a weak witness. It sees one side of every object, and an agent that knows it is being judged on one picture can build only what that picture sees. The paper's own failure gallery has exactly this: a farm scene where the two people are photographs mapped onto flat quads, present in the submitted camera and gone from the side.

And some requirements are not visual at all. "Keep the .blend editable", "the wooden leg is 150 mm", "under 3,000 faces", "UVs do not overlap": none can be read off pixels. BlenderWorld routes each requirement to the evidence that can settle it.

## The tasks

Every number in this section is **measured** from the 223 `task.json` and `rubric.json` files in the Hugging Face release (revision `e67837a`), and each one matches the paper's own figure.

| Input | Tasks |
|---|---:|
| Text only | 78 |
| Image + text | 130 |
| Video + text | 15 |
| With a spec attachment (Markdown, YAML or JSON) | 59 |

The 59 attachments are 28 Markdown, 20 YAML and 11 JSON files (**reported**, Appendix A). They carry dimensions, material lists, camera settings and polygon budgets. The paper says 500 criteria, 18.9%, come from attachments (**reported**).

The tasks sit in nine categories. Architecture and interiors dominate with 72; then art and animation 30, products and manufacturing 28, characters and animals 25, nature and landscapes 21, rendering and simulation 17, vehicles and machinery 11, procedural and game assets 10, and science and visualization 9. Some briefs are in Chinese: the sofa task, `bw_0160`, asks in Chinese for a 2200 by 950 by 750 mm three-seat sofa with 150 mm turned wooden legs on brass casters, 85 mm three-quarter camera, 3840 by 2160 output, and a `.blend` kept because, in my translation of the brief, "the client will most likely want changes".

<Figure
  src="https://media.thesatyajit.com/ai/articles/blenderworld/fig1.jpg?v=935ca7133b6b8231"
  alt="A ring chart of BlenderWorld's nine categories and their subcategories, surrounded by example tasks: a sci-fi interior redesign, an exploded product view, a cell-membrane visualization, an alpine environment, a locomotive, a glass still life, an armored character, animal posing, character rigging, a bear walk cycle and a rally car with dust. Each example pairs a reference with an agent's output."
  caption="The task taxonomy, with references shown left or top and GPT-6-Astra's outputs right or bottom (BlenderWorld paper, Figure 1)."
/>

### What the agent works with

The agent runs in a Linux container with one NVIDIA GPU, Blender 4.2.10, a shell, file tools, image viewing and the Blender MCP server (**reported**, Appendix D). The MCP tools are `execute_blender_code` (run Python inside Blender), `get_scene_info` and `get_object_info`, `get_viewport_screenshot`, plus Poly Haven and Sketchfab search and download. So the interface is both: an agent can drive a live Blender over MCP or write scripts and launch Blender headless from the shell. The two GPT models ran under Codex CLI 0.147.0; the other eleven under Claude Code 2.1.220. The Harbor packaging gives each task an 8-hour generation budget (**reported**, dataset card).

The deliverable is one ZIP per task with `final.blend` at its root, and optional `textures/` and `outputs/`. A ZIP with no `.blend` scores zero and stays in the denominator. Evaluation runs in a separate container, and the rubrics are hidden from the agent during generation.

## The rubric: 2,651 compound pass/fail criteria

Each task carries between 6 and 22 binary criteria, 11.9 on average, 2,651 in all (**measured**). Each criterion has a category, an importance weight, an evidence route, and a written pass and fail condition.

- **Weights**: 2,208 criteria are major (weight 3), 396 secondary (2), 47 detail (1). That is 83.3% at weight 3 (**measured**), so in practice the weighted pass rate is close to a plain pass rate.
- **Routes**: 1,544 criteria are `scene_summary`, which means the scene-inspection agent judges them, and 1,107 are `render`, judged by a vision model (**measured**). More than half the benchmark, 58.2%, is decided by opening the file (**reasoned**: 1,544 / 2,651).
- **Categories**: function 660, geometry 446, composition 310, material 291, lighting 203, space layout 157, holistic 156, layout 125, physics 124, scale 69, presence 52, count 32, color 26 (**measured**).

A criterion is not a single fact. The paper calls each one an "acceptance unit": related conditions merged so the criterion passes only when all of them hold. The sofa's `R02` reads, in full: every leg "has a recognizably rotationally turned wooden profile, its wooden leg component is nominally 150 mm high, and it is fitted beneath with a connected caster assembly whose wheel and mounting hardware visibly and materially read as brass." Four requirements, one bit. That keeps the bar high and makes a single failed criterion hard to interpret, as the paper admits.

Editability is graded explicitly. 301 criteria in 214 of the 223 tasks mention it (**measured**, a text search for "editab" in criterion and pass condition). The sofa's `R10` wants the `.blend` to retain "editable sofa geometry, assigned materials, the author-final camera, lights, HDRI world, and render configuration ... rather than only flattened content". A reply under the post asked whether a scene that renders right but is one joined mesh would pass. The rubric does not say; it is left to the judge's reading of "editable", and I could not test it without running the judge.

The rubrics were written by GPT-5.6-Sol, piloted with GPT-5.6-Sol as the judge, and cross-checked by at least two of GPT-5.6-Sol, Gemini 3.1 Pro Preview and Claude Opus 4.8, with human review "complementing" (**reported**, Appendix B).

## How a submission is scored

<Figure
  src="https://media.thesatyajit.com/ai/articles/blenderworld/fig4.png?v=75b5c73cd38368c8"
  alt="Four-panel pipeline. Task input: query, visuals and files go to an agent with Blender MCP tools, which builds, inspects and refines, then delivers a .blend, images and video. Prepare artifacts: unpack and validate, missing .blend scores 0, then an automatic agent render selects 8 views with Cycles on a GPU at 1024 squared. Rubric and dimension judging: an Agent-as-Judge handles scene_summary criteria from the .blend and files, a VLM-as-Judge handles render criteria with blind descriptions, and a dimension judge gives 8 integer ratings from 1 to 10. Score fusion: rubric score is 100 times the weighted pass rate, dimension score is 10 times the mean rating, fused 1 to 1 into a mean task score over 223 tasks."
  caption="The evaluation pipeline: an agent renders eight views, criteria are routed to a scene-inspection agent or a vision judge, and the weighted rubric score is averaged with eight visual ratings (BlenderWorld paper, Figure 4)."
/>

There are three model roles, and the paper uses GPT-5.6-terra for all three (**reported**).

**1. The render agent picks eight views.** A coding agent (the Claude Code CLI, pointed at whatever Anthropic-compatible endpoint you configure) opens the `.blend`, reads the brief and the rubric, and renders eight 1024 by 1024 views in Cycles at 64 samples. It starts from the submitted camera, then picks wide views and at least two detail views relevant to the rubric. It may move cameras and change render settings. It may not touch geometry, materials, lighting, animation or colour management, and it may not repair defects. Each view gets at most two corrective re-renders, enforced by a Blender startup hook that refuses a fourth attempt at the same output path (**measured** from `render_agent.py` and the evaluation guide).

**2. The scene inspector opens the file.** For `scene_summary` criteria, a second coding agent copies the `.blend` and runs Blender headless with a probe script it writes itself. The prompt in `judge_blender_agent.py` asks it to pull object lists, triangle counts, modifiers and Geometry Nodes inputs, shape keys, drivers, bounding-box dimensions in millimetres, unit settings, render engine and samples, material node graphs, UV overlap, physics settings and embedded scripts, and to save the probe and its raw output as an audit trail.

The rule that makes this more than a script runner: for each criterion the agent returns two sub-verdicts, `bpy_check` (does it hold in the file) and `visual_check` (does it hold in its own renders), each pass, fail or not applicable. The harness, not the model, then sets the score to 1 only if every applicable sub-verdict passed. A red Principled BSDF base colour that renders grey fails. A dimension that looks right but measures wrong fails.

**3. The vision judge** scores the `render` criteria from the eight views, the agent's own exported images and up to sixteen frames from exported video, with original exports taking precedence when evidence conflicts. A separate blind pass writes prompt-free descriptions of the submission and reference images for grounding. The same judge rates eight dimensions from 1 to 10: scene fidelity, physical plausibility, style and colour, realism, spatial layout, proportion and scale, lighting and materials, completeness.

From `evaluation.py`, with $w_j$ the weight and $\hat y_j \in \{0,1\}$ the verdict of criterion $j$, and $d_k$ the eight ratings:

$$
S_\text{rubric} = 100\,\frac{\sum_j w_j \hat y_j}{\sum_j w_j},\qquad
S_\text{dim} = 10\cdot\frac{1}{8}\sum_{k=1}^{8} d_k,\qquad
S = 0.5\,S_\text{rubric} + 0.5\,S_\text{dim}
$$

The benchmark score is the mean of $S$ over all 223 tasks, with failed evaluations as zero. The public evaluator refuses a result unless every criterion has an integer 0 or 1, all eight ratings are integers from 1 to 10, and the fused score matches this formula to within a millionth.

The sofa task below is real: its eleven criteria, their weights and routes come straight from `bw_0160/rubric.json`. The verdicts are yours to set.

<RubricScorer />

Nine of the sofa's eleven criteria go to the scene inspector. Weights sum to 32 (ten at weight 3, one at 2), so one missed major criterion costs 9.375 rubric points and half that, 4.6875, on the task score (**reasoned**). The dimension score moves in steps of 1.25 per rating point.

## What I ran

The exception for this piece let me install Blender as a Python module if it fit in a gigabyte. The `bpy` 4.2.0 wheel installs to 1.5 GB, so I used `bpy` 4.5.0 instead, which came to 888 MB in a venv (**measured**). That is not the evaluator's pinned 4.2.10, and the real evaluator would abort on the version mismatch before any model call. The helper I ran uses only APIs present in both.

I wrote a builder that makes a toy version of the sofa: a box body sized to 2200 by 950 by 750 mm, four cylinder legs on brass caster wheels with mounts, a camera, Cycles at 64 samples and 3840 by 2160. Two variants:

- **drift**: 102 mm of timber on a 48 mm caster, 50 mm lens. These are the leg numbers from the paper's Opus-5 failure case (Figure 15c below).
- **spec**: 150 mm of timber on the same caster, 85 mm lens.

Then I opened each `final.blend` read-only and ran the evaluator's own helper, `evaluators/evidence_checks.py`, which the inspector is told to use, followed by the kind of measurement the inspector prompt asks it to write.

```text
                              drift          spec
scene_facts().engine          CYCLES         CYCLES
scene_facts().cameras.lens_mm 50.0           85.0
camera down pitch (deg)       8.27           8.27
UV overlap, SofaBody / Leg_0  none / none    none / none
timber leg height (mm)        102.0 x 4      150.0 x 4
floor to frame (mm)           150.0          198.0
triangles, 13 objects         924            924
probe wall time               0.023 s        0.020 s
```

All of it **measured**, CPU only. Two things fall out.

**The fixed helper is narrow.** `scene_facts()` reports the Blender version, the render engine, frame rate, each camera's lens, depth of field and its downward pitch from the horizontal, rigid-body substeps, and a triangle-by-triangle UV overlap test. It does not report object dimensions, materials, modifiers or counts. Those, which are most of what `scene_summary` criteria ask about, come from a probe the judging model writes on the spot. "Scene inspection" in BlenderWorld means an agent with bpy, not a deterministic checker, and the paper lists deterministic dimension and tolerance scripts as future work. The probe and its output are saved next to every verdict as the audit trail.

**The wrong quantity measures correctly.** In the drift build, floor to frame is exactly 150.0 mm, because 102 plus 48 is 150. That is the check Opus-5 wrote for itself in the paper's case study, and it passed its own verifier. The brief asked for 150 mm of wood. A scene inspector that measures the timber object gets 102 mm and fails `R02`. Whether it measures the right thing depends on the probe it writes.

Then I fed verdict sets through the repository's `build_score_summary()` and the inspector's `normalize_agent_rubrics()` (**measured**):

- All eleven pass: rubric 100.0.
- Drift build, `R02` and `R08` fail: rubric 81.25. Losing only the weight-2 `R04` instead gives 93.75.
- A model that self-reports `score: 1` but says `bpy_check: pass`, `visual_check: fail` gets 0. The harness overrides it and records `cross_check_applied: true`. A criterion where both sub-verdicts are not applicable falls back to the model's own score.

## Results

| Agent | Text | MM | Score | Rubric | Dimension | Perfect % |
|---|---:|---:|---:|---:|---:|---:|
| GPT-6-Astra | 78.6 | 80.7 | **79.9** | 87.3 | 72.6 | 42.2 |
| Opus-5 | 74.8 | 72.1 | 73.0 | 80.9 | 65.1 | 25.6 |
| GPT-5.6-Sol | 71.7 | 65.5 | 67.7 | 74.7 | 60.7 | 15.7 |
| DeepSeek-V4.1-Flash | 66.0 | 65.5 | 65.7 | 72.0 | 59.4 | 11.7 |
| Qwen3.8-Max | 59.6 | 61.1 | 60.6 | 65.9 | 55.3 | 10.3 |
| GLM-5.3-Flash | 63.1 | 57.8 | 59.7 | 64.8 | 54.4 | 6.28 |
| Grok-4.6 | 60.0 | 55.4 | 57.0 | 61.4 | 52.7 | 6.73 |
| Opus-4.8 | 58.6 | 56.1 | 57.0 | 60.2 | 53.7 | 5.38 |
| Seed2.1pro-0915 | 54.7 | 49.5 | 51.3 | 54.9 | 47.7 | 3.59 |
| Qwen3.8-27B | 46.1 | 48.6 | 47.7 | 50.0 | 45.5 | 1.35 |
| Kimi-K3 | 41.3 | 49.4 | 46.5 | 47.9 | 45.2 | 1.79 |
| Gemini-3.8-Flash | 35.9 | 33.2 | 34.2 | 29.8 | 38.5 | 0.45 |
| MiniMax-M3 | 34.1 | 30.6 | 31.8 | 28.9 | 34.7 | 0.45 |

All **reported** (paper Table 2; one run per agent per task, highest available reasoning effort). The table is internally consistent (**reasoned**): for every row, the mean of Rubric and Dimension equals Score to within 0.05; the 78-to-145 weighted mean of Text and MM equals Score to within 0.07; and Perfect times 223 lands on a whole number of tasks (94 for GPT-6-Astra, 57 for Opus-5, 35, 26, 23, 14, 15, 12, 8, 3, 4, 1, 1), which match the counts in the paper's Figures 9 and 10.

GPT-6-Astra leads every column, with fewer output tokens per task (84.5K) than Opus-5 (241K) or DeepSeek-V4.1-Flash (209K). Its lead is bigger on image and video tasks (80.7 against Opus-5's 72.1) than on text (78.6 against 74.8). And full success is rare: the best agent passes every criterion on 94 of 223 tasks; the paper's Appendix E.2 says 143 of its outputs clear 90% of criterion weight, so 49 miss by a small margin (**reported**).

The 50:50 fusion is a choice, and it barely matters for the ranking. Because the benchmark score is a mean of a linear combination, the leaderboard at any weight is the same combination of the two column means, so I can re-weight it exactly from Table 2.

<LambdaBoard />

Across every weight from all-visual to all-rubric, exactly one pair of agents swaps: Grok-4.6 and Opus-4.8, whose lines cross at a rubric weight of about 0.455, just under the paper's 0.5 (**reasoned**; it matches the paper's Figure 12b). Gemini-3.8-Flash and MiniMax-M3 are the only agents whose visual ratings beat their rubric scores.

<Figure
  src="https://media.thesatyajit.com/ai/articles/blenderworld/fig13.png?v=80ebb095966e2c8b"
  alt="Heatmap of mean fused score for thirteen agents across nine task categories. GPT-6-Astra scores 81 on architecture and interiors, 84 on products, 77 on art and animation, 79 on characters, 78 on nature, 71 on rendering and simulation, 81 on vehicles, 87 on procedural and game assets and 82 on science. Opus-5 scores 75 on rendering and simulation, above GPT-6-Astra there. Lower rows fade toward the 20s and 30s."
  caption="Mean fused score by category for all thirteen agents; every agent does better on procedural and game assets than on art and animation or characters and animals (BlenderWorld paper, Figure 13)."
/>

## Can the judge be trusted?

The paper checks its judge against people on 150 pairs of outputs for the same input, three human raters per pair, 147 pairs after dropping three-way splits (**reported**, Table 6). With GPT-5.6-terra as judge, the fused score picks the human-preferred output 82.99% of the time. On the 70 pairs whose average scores are within 10 points, that drops to 68.57%. The rubric score alone does worse: 73.47% overall and 51.43% on close pairs, which is barely better than a coin. The dimension score, the eight 1-to-10 ratings, agrees with people more than the rubric does in every judge tested.

Read that next to the leaderboard. A gap of a few points between neighbours, like Grok-4.6 and Opus-4.8, is inside the range where the judge and people disagree a third of the time on individual outputs. Means over 223 tasks are steadier than single pairs, but the paper reports one run per agent and no variance, so I cannot say how much steadier (**reasoned**).

Two more things a reader should hold in mind, neither of which the paper tests:

- **Family overlap.** The judge (GPT-5.6-terra), the rubric author and pilot judge (GPT-5.6-Sol), and the first- and third-placed agents (GPT-6-Astra, GPT-5.6-Sol) all come from one vendor. The human-agreement study does not break results down by which model produced the outputs, so self-preference is neither shown nor ruled out.
- **The rubrics are public.** Every task folder in the Hugging Face release carries its `rubric.json` under `tests/`. That is necessary for anyone to run the evaluator, and it means a future model trained on the web can have seen the answers' checklist. Generation-time isolation only protects the runs in the paper.

## How agents fail

<Figure
  src="https://media.thesatyajit.com/ai/articles/blenderworld/fig7.png?v=aa0a74df17956ecd"
  alt="Four failure examples. (a) GPT-6-Astra was asked for converging balls, paint trails and ripples; the evaluated top view is a blank canvas. (b) GPT-6-Astra was asked for two people inspecting a soybean field; they appear in the submitted camera and vanish in a side view. (c) GPT-6-Astra's lion cub has large eyes and finger-like toes. (d) GPT-5.6-Sol's person lying on the grass floats above it."
  caption="Four recurring failure modes: a missing dynamic interaction, view-dependent geometry, anatomical distortion and missing ground contact (BlenderWorld paper, Figure 7)."
/>

The paper's failure analysis (**reported**) names four patterns: dynamic interactions that never happen, scenes that only exist from one camera, distorted fine anatomy, and objects that do not touch what they should rest on. The trajectory traces in Appendix E.8 are better than the gallery, because they show the cause.

<Figure
  src="https://media.thesatyajit.com/ai/articles/blenderworld/fig15.jpg?v=00184533d7fa3145"
  alt="Three failure trajectories with selected tool calls. (a) GPT-6-Astra cuts the two people out of the reference with grabCut and textures one quad per person, noting it is a camera-facing projection, not a rigged human; the people disappear in a side view. (b) GPT-5.6-Sol places alignment markers so the shoe tip sits on the tower ray in projection, checks the error is below 1e-6, but never checks body support; the body hangs above the lawn. (c) Opus-5 writes a task of 150 mm total including brass casters, builds 102 mm of timber on 48 mm casters, and its verify script reports 150.0 mm floor to frame as ok; the saved timber is 0.102 m against 0.150 m required."
  caption="Three trajectories where the agent's own check passed and the requirement failed: flat photo cards, a projection test that ignores contact, and a self-check that measures the wrong quantity (BlenderWorld paper, Figure 15)."
/>

Each of the three is an agent that verified something, carefully, and verified the wrong thing. GPT-5.6-Sol held its forced-perspective alignment error under one millionth and left the body floating. Opus-5 rewrote "150 mm wooden legs with brass casters" into "150 mm total including casters" in its own task list, built to that, and confirmed it. That is the same pattern I reproduced with the toy sofa above, and it is the strongest argument for the benchmark's design: the judge has to re-derive the requirement from the brief, not from the agent's notes.

The tool-use numbers point the same way. Seed2.1pro-0915 and DeepSeek-V4.1-Flash look at images the most, 33.9 and 31.3 times per task, and score in the middle; GPT-6-Astra looks 15.0 times and leads (**reported**, Figure 6). Looking is not the bottleneck. Knowing what to check is.

## What it costs to run

The evaluator needs Blender 4.2.10, Node.js 22.17.0, ffmpeg, the Claude Code 2.1.220 CLI and a vision Chat Completions endpoint. Every task runs two coding agents and a vision judge, so a full pass is 223 agentic sessions on your bill; the Harbor package asks for one GPU and an 8-hour timeout per phase (**reported**). `bw evaluate --dry-run` checks the submission inventory without calling anything.

<RepoCard repo="QwenLM/BlenderWorld" />

## Where it sits

BlenderWorld is the third agentic 3D benchmark on this site in a few weeks, and they measure different things. [AA-3D](/articles/aa-3d) has agents write three.js pages and lets a human panel vote on blind pairs. [3DCodeVerse](/articles/3dcodeverse) treats the program as the artifact and scores renders and measured gaps in a repair loop. [SKY-001](/articles/sky-001) compared frontier models each writing one Blender script for a whole car. BlenderWorld's contribution is the `.blend` as evidence: an editable project, opened and probed, with the render as a veto. If you are building a Blender agent, the [Blender 5.3 splat importer](/articles/blender-5-3-gaussian-splats) and [WorldClaw](/articles/worldclaw), which builds whole worlds as Blender programs, are the neighbouring pieces.

What I take from it: the rubric-plus-inspection design is right, and the paper's own trajectories show why. The thing to watch is that the inspector is itself a model writing bpy. Until the dimension and tolerance checks are deterministic scripts, which the authors list as future work, a BlenderWorld score is two layers of agent judgement, and its close calls should be read that way.

## Unverified

- I did not run the three model roles, so no score here reproduces Table 2, and my `bpy` was 4.5.0, not the pinned 4.2.10.
- Whether a single joined mesh passes the editability criteria is the judge's call; the rubric text does not settle it.
