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.
Needs Blender 4.4+ with a Blender MCP server running. Three commands in Claude Code.
Rebuilt from one photo.
Graded against the real thing.

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

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

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. 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 photo and the crops the session read 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.md3. 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.md4. 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.md5. 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.







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.
| version | score | note |
|---|---|---|
| v1 | 0.830 | Before the photo method. |
| v2 | 0.865 | Same brief, next skill. |
| v3 | 0.876 | Measured review instead of eyeballing. |
| v4 | 0.843 | Traced wires, layered textures. |
| v5 | 0.848 | Size and camera angle settled before modeling. |
| v6 | 0.862 | Reviewed at the right colour. |
| v7 | 0.861 | The sRGB export fix. |
| v8 | 0.905 | Dark metal reported. |
| v9 | 0.921 | A TRELLIS.2 mesh of the photo as a measuring template. |
| v10 | 0.914 | Metal mask: one soft worn region. |
| v11 | 0.897 | Every joint rendered and looked at. |
| v12 | 0.914 | contaminated, not a measurement |
| v13 | 0.924 | First sandboxed run. |
| v14 | 0.880 | Every figure from this lantern removed from the skill. |
| v15 | 0.897 | Scanned 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 animateBiped 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.

