A photo or a sentence.Get the object.

A Claude Code skill that builds a 3D object in Blender from a photo or a text brief, and from a photo, grades it against the real one.

See the bench

Needs Blender 4.4+ with a Blender MCP server running. Three commands in Claude Code.

Rebuilt from one photo.
Graded against the real thing.

Reference photo: an old brass hurricane lantern with a glass globe and a wire bail, cut out on transparent background
What kiln saw Poly Haven, Lantern_01 (CC0)

Hurricane lantern

0.897

shape score against the real hurricane lantern, which the session never saw. 1 = identical.

before 2.0
0.830
height
+19%
shipped
229 KB
triangles
12,314
Reference photo: a rusted olive-green ammunition box with a yellow stencil reading 200 CARTRIGES 7.62 MM
What kiln saw Poly Haven, ammo_box (CC0)

Ammo box

0.950

shape score against the real ammo box, which the session never saw. 1 = identical.

before 2.0
0.854
height
+16%
shipped
187 KB
triangles
3,856
Reference photo: a tall gothic wooden chair with a pointed arch, a rose and tracery in its back
What kiln saw Poly Haven, WoodenChair_01 (CC0)

Gothic chair

0.750

shape score against the real gothic chair, which the session never saw. 1 = identical.

before 2.0
0.445
height
−29%
shipped
239 KB
triangles
9,908

From a photo, in five steps you can audit.

The ammo box above, rebuilt again here from the session's own files: its parts, its scans, its measure, its joints, its export. Every quoted line is from that session's production log (… marks a cut).

  1. 1. Read the photo before modeling.

    Thirteen parts listed from enlarged crops, each with how it meets the next. What one photo cannot say is stated before modeling: the real size, the camera's angle.

    Real size: US M19A1 .30 cal / 7.62 mm can, as the stencil says … 0.280 L x 0.095 W x 0.180 H m

    ammo-box_log.md
    The ammo box reference photo kiln worked from
    the photo and the crops the session read
  2. 2. Texture from scans, not noise.

    Two Poly Haven CC0 scans: green_metal_rust for the paint, tinted toward the photo's olive, and rust_coarse_01 for the wear, masked by the form.

    wear: Poly Haven rust_coarse_01 scan, tinted toward the photo's rust, masked by form (bevel-vs-normal edge mask, AO cavities, the bottom 35 mm, …)

    ammo-box_log.md
  3. 3. Measure against the photo.

    fidelity_check.py renders the model at the photo's camera and compares the two silhouettes. Red is the photo only, cyan the model only, white where they agree.

    0.918 silhouette overlap, photo camera

    Final (shipped _final.glb): IoU 0.918, identical to round 2 … export changed nothing.

    ammo-box_log.md
  4. 4. Look at every joint.

    Each end of a part that touches another is rendered alone and looked at. A part that joins another enters it; no distance can judge that.

    Joints: 22 joint renders looked at (review/r0/joints_sheet.png): staple legs enter mount plates, handle ends roll round the staple bars, bail hooks through the bracket ears, rivets sit on the strip.

    ammo-box_log.md
  5. 5. Ship, and measure the file that ships.

    Draco and WebP in separate steps, no simplification, then re-measured as a GLB: what you get, not the .blend.

    5.54 MB 3,856 triangles, Draco + WebP

    Optimize: gltf-transform resize 1024 → webp → draco (separate steps, no simplify): 5.54 MB → 187 KB (-97%).

    ammo-box_log.md

bothphoto onlymodel only

Fifteen lanterns. Five turning points.

One photo and the same brief, fifteen times, each version the skill after the previous one's findings, scored against the real lantern it never saw. The curve is all fifteen; the stops are where something changed.

The reference photo of the hurricane lantern
The photo
kiln version 1kiln version 4kiln version 6kiln version 12kiln version 15
kiln, v1
The real Poly Haven lantern, never shown to kiln
The real one, never shown to kiln

v1

0.830

height +23%$1.90

Before the photo method.

Too tall by almost a quarter.

v4

0.843

height +29%$4.06

Traced wires, layered textures.

Fitted the photo better than the real object: it copied the photo's perspective into the geometry, its base 30% too tall.

v6

0.862

height +2%$4.15

Reviewed at the right colour.

Shipped near black: the exporter wrote linear values into an sRGB image.

v12

0.914

height +2%$8.43

Contaminated: it read the bench's own results.

Not a measurement. Kept, struck out; every session since runs in a sandbox.

v15

0.897

height +19%$5.04

Scanned CC0 texture sets before procedural noise.

The tank has matter. Brass has no scan, so the frame came out a second tone.

Shape score against the real lantern, versions 1 to 15; v12 contaminated, not a measurement0.800.850.900.95v1: 0.8301v2: 0.8652v3: 0.8763v4: 0.8434v5: 0.8485v6: 0.8626v7: 0.8617v8: 0.9058v9: 0.9219v10: 0.91410v11: 0.89711v12: 0.914, contaminated, not a measurement12v13: 0.92413v14: 0.88014v15: 0.89715
Shape score of each lantern version against the real object
versionscorenote
v10.830Before the photo method.
v20.865Same brief, next skill.
v30.876Measured review instead of eyeballing.
v40.843Traced wires, layered textures.
v50.848Size and camera angle settled before modeling.
v60.862Reviewed at the right colour.
v70.861The sRGB export fix.
v80.905Dark metal reported.
v90.921A TRELLIS.2 mesh of the photo as a measuring template.
v100.914Metal mask: one soft worn region.
v110.897Every joint rendered and looked at.
v120.914contaminated, not a measurement
v130.924First sandboxed run.
v140.880Every figure from this lantern removed from the skill.
v150.897Scanned CC0 texture sets before procedural noise.

v1 to v8 and v8 to v15 come from two bench sheets rendered under the same studio light and camera; the shape score is measured the same way for all. One run per version: a few hundredths are not significant. The full record, every table and limit.

It moves, routed by subject.

No single animation method held up across a cat, a villager and a desk lamp, so kiln picks the route from the subject, and shows every clip before exporting.

New in 2.2.0: /kiln animate

villager, walk

Biped or winged, from a sentence

UniMate text-to-motion, looped by motion_loop.py

Each clip is the sample out of 4 that loops best, approved on review. UniMate's weights are CC BY-NC 4.0: non-commercial use only.

/kiln animate dragon.glb "flaps its wings"

Four-legged, idle and walk

quadruped.py, a scripted cycle measured before export

Legs kept under 95% of their length, paws in exact step, an exact loop.

/kiln animate SK_Cat.glb walk, idle

Articulated object

Rigid parts keyed by script

Every rotation's sign measured before it is used. Both approved on first review.

Measured, and left out

  • UniMate on quadrupeds: unusable for walking on a cat, a Shiba, a horse and the model author's own robot dog. kiln refuses to send a quadruped there.
  • "Walks forward": 0 of 8 samples usable; "walks in place": 8 of 8.
  • MoCapAnything V2, video to motion: excellent on rigs from its training set, unusable on two from outside it. Not shipped.
  • Scripted trot, jump, sit and attack for quadrupeds: rejected on review.

Every clip here was rebuilt for this site with kiln's own tools and rendered under the bench's studio light: the cat with quadruped.py, the lamp with props.py, the chest with chest.py (textured with Poly Haven CC0 wood and metal scans), the villager and the dragon with unimate.py (each the sample out of 4 that motion_loop.py kept, then checked by eye). Scripts, not an interactive session. Cat by madtrollstudio (CC BY 3.0) and dragon by Quaternius (CC0), both via Poly Pizza; the villager was built by kiln.

Text briefs ship light, too.

Five fixed briefs without AI, on both Blender MCP servers, before and after 2.0. The skill now does the work it used to skip, and pays for it in turns.

ahujasid's mcp-for-blender

before32.9 MB
after0.96 MB

defects found 2 to 1cost for the five $6.49 to $7.34

Blender Lab MCP, behind Claude's Blender connector

before3.87 MB
after0.75 MB

defects found 2 to 0cost for the five $5.82 to $7.81

0 of 7 GLBs compressed with Draco and WebP before, 7 of 7 after, on both.

Try it.

Needs Blender 4.4+ with a Blender MCP server running.

  1. /plugin marketplace add elithril/blender-kiln
  2. /plugin install blender-kiln@blender-kiln
  3. /kiln setup