~/satyajit

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

mdjsonmcp

2026-10-23 · 20 min · benchmarks · agents · 3d · qwen · mcp · multimodal

A 1:54 narrated explainer, drawn in code. Every number and picture in it is this article's own; the sources are below.

› transcript

Hi, I'm Corbel! This benchmark hands an agent a design brief and takes back a Blender project. Here's how it grades it. One picture can lie. So looks are judged from eight fresh renders, and structure by an agent that opens the project file. Four stations. An agent reads the brief and builds the scene in Blender. A second agent renders eight views of its choosing, fixing nothing. A third opens the project and writes a script to measure it. A vision judge scores what is visible, and rates eight qualities. Each task carries pass or fail criteria, weighted one, two or three. More than half are about structure: sizes, materials, cameras, editability. Those go to the inspector. The rest are about looks, and go to the vision judge. The inspector checks the file and its own render. A criterion passes only if both pass. Then the two halves are averaged. Half is the weighted share of criteria passed. Half is ten times the mean of the eight quality ratings. The brief wanted wooden legs a hundred and fifty millimetres tall, on casters. One agent measured floor to frame, got a hundred and fifty, and stopped. The inspector measured the wood alone: a hundred and two. The leg criterion fails. The best of thirteen agents scores about eighty, by the paper's count. And even it passes every criterion on fewer than half the tasks. The thing to remember: the render can veto the file, and the file can veto the render. Fresh renders for looks, an agent in the file for structure, and both must agree. Every source is in the full article. I'm Corbel. Bye!

Why read this

Notabletop 60%

Counts all 2,651 rubrics, runs BlenderWorld's scene-inspection helper and scorer on two toy sofas, and shows the judge is model-written bpy, not a fixed check.

  • Original analysis
  • A lasting reference
  • A new technique

3D & spatialAPI onlyMITPractitioner paper

How this was scored
Is it new?
2 of 3: A real new idea, method or capability
Can I trust it?
2 of 3: Measures key facts from files, code or configs
Can I run it?
1 of 3: API-only, gated or restrictive licence
Will I understand it?
2 of 3: Mechanism from first principles with figures
Can I act on it?
2 of 3: A concrete recipe, numbers or comparison
Will it last?
2 of 3: A reference for a year or more
Does it affect many?
1 of 3: A specialist community
Only here?
2 of 3: A teardown or measurement few others did

Score 64 of 100, ranked 246 of 607 rated articles. Each question is answered 0–3 by hand, and a 3 is rare. How articles are scored

BlenderWorld (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), the evaluator code at commit dd4f357, and the Hugging Face dataset. 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.

InputTasks
Text only78
Image + text130
Video + text15
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".

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.
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.

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

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.
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 wjw_j the weight and y^j∈{0,1}\hat y_j \in \{0,1\} the verdict of criterion jj, and dkd_k the eight ratings:

Srubric=100 ∑jwjy^j∑jwj,Sdim=10⋅18∑k=18dk,S=0.5 Srubric+0.5 SdimS_\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 SS 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.

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:

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.

                              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):

Results

AgentTextMMScoreRubricDimensionPerfect %
GPT-6-Astra78.680.779.987.372.642.2
Opus-574.872.173.080.965.125.6
GPT-5.6-Sol71.765.567.774.760.715.7
DeepSeek-V4.1-Flash66.065.565.772.059.411.7
Qwen3.8-Max59.661.160.665.955.310.3
GLM-5.3-Flash63.157.859.764.854.46.28
Grok-4.660.055.457.061.452.76.73
Opus-4.858.656.157.060.253.75.38
Seed2.1pro-091554.749.551.354.947.73.59
Qwen3.8-27B46.148.647.750.045.51.35
Kimi-K341.349.446.547.945.21.79
Gemini-3.8-Flash35.933.234.229.838.50.45
MiniMax-M334.130.631.828.934.70.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.

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.

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.
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:

How agents fail

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.
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.

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.
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.

QwenLM/BlenderWorld@dd4f357 · snapshot 2026-10-23
tracked files
41
license
MIT
branch
main
tests
none found
source
240.4 kB
commit date
2026-10-20
source by language
Python239.1 kB(18)Shell1.2 kB(2)

by size of tracked source at this commit, file counts in brackets; docs, data and vendored trees excluded

local clone, 2026-10-23 at dd4f357 — branch, commit, commitDate, fileCount, hasTests, languages, license, licenseFile, shallow

shallow clone: counts describe the pinned tree, not the history

Where it sits

BlenderWorld is the third agentic 3D benchmark on this site in a few weeks, and they measure different things. AA-3D has agents write three.js pages and lets a human panel vote on blind pairs. 3DCodeVerse treats the program as the artifact and scores renders and measured gaps in a repair loop. 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 and 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

Cite this article

For attribution, please use the following reference or BibTeX:

Satyajit Ghana, "BlenderWorld: 223 Blender briefs, graded by an agent that opens the .blend", ai.thesatyajit.com, October 2026.

bibtex
@misc{ghana2026blenderworld,
  author = {Satyajit Ghana},
  title  = {BlenderWorld: 223 Blender briefs, graded by an agent that opens the .blend},
  url    = {https://ai.thesatyajit.com/articles/blenderworld},
  year   = {2026}
}
share