One Photo, One Script: Nex-N2.6 Builds a Perfume Bottle in Blender
We gave Nex-N2.6 a single product photo and asked for a Blender script that models the bottle, matches its materials, lights the scene, and renders an animated product reel. It got the shape and the parts right; the lights blew the scene out.
Nemo
DGX Spark & Local Inference Engineer

By Nemo, DGX Spark & Local Inference Engineer, SMF Works
Test three of three on Nex-N2.6 (one-shot, Cold Iron). This one is new for us: we hand the model a single product photo and ask it to write one Python script that, run headless in Blender, builds the 3D model, matches the materials, sets the lighting, and renders an animated turntable reel. No iteration, no taste passes: one photo in, one script out, whatever renders is what we judge.
The photo (left in the hero above) is a square-shouldered clear glass perfume bottle: amber liquid, a two-tier brushed-gold cap, a visible dip tube, sitting on black polished marble against a light gray studio backdrop. Nex-N2.6 is image-capable (text+image in, text out), so the photo went into the prompt directly as an image part.
What the model wrote
It identified the product correctly in one paragraph and then wrote a 13.4 KB script that built, in order: a superellipse-lofted bottle body with real glass thickness (Solidify), a separate amber-liquid inner mesh, two small air bubbles at the shoulders, the dip tube, a two-part cap (CapBody + CapTop in brushed gold), a procedural black-marble floor (a genuine node setup: noise texture into a color ramp with near-black stops), an open-topped cyclorama backdrop, and a three-point area-light rig (key 300 W, fill 90 W, rim 200 W). The camera does a 240-frame turntable orbit with a gentle crane rise, tracked to the bottle, 50 mm at f/5.6. It also set a fixed random seed and printed the object/material/camera summary the prompt asked for.
That is the agentic billing doing its thing: the model spent 26,868 of 31,077 output tokens thinking before writing a line (this model always thinks; its catalog does not allow anything else, as the Cold Iron post explains), and the plan shows. Nothing in the script is filler. Every object in the final scene maps to something visible in the photo.
Two mechanical fixes, then it ran
The script needed two repairs to run headless on Blender 4.5.3, both API renames the model got wrong, both logged in the repo:
wall.data.polygons.remove(p.index)— that method does not exist in 4.5 (neither by index nor by object); we swapped the block to delete the cyclorama's cap faces withbmesh.ops.delete.scene.render.file_format = 'FFMPEG'— the setting moved toscene.render.image_settings.file_formatyears ago.
After those two mechanical fixes the script ran unmodified to completion: scene build in seconds, .blend saved, 240-frame Cycles render launched. One honest note on scope: the fixes are the same kind we documented for Muse Ember in the Portofino test, and we keep the same rule. A script that cannot run at all is the result; a script that runs after an API rename is a repair we document.
The verdict: right skeleton, blown-out lights
The rubric was written before we looked at any frames. Scored against the reference photo (frame previews at 40, 120, and 220 of the orbit, plus a probe render with a neutral view transform):
| Criterion (0-5) | Score |
|---|---|
| Geometry matches the photo's silhouette | 4 |
| Materials match the photo | 2 |
| Lighting setup quality | 2 |
| Animation quality | 4 |
| Runs headless (after documented repairs) | 4 |
| Deliverables (.blend + video + summary) | 5 |
| Total | 21/30 |
The geometry is the win. Square body with rounded corners, squat but recognizable proportions, shoulders, neck, two-tier cap, dip tube, bubbles, thick glass base: every part from the photo exists, correctly parented to a turntable rig. The animation is clean: a stable orbit with no cuts, no broken geometry, no z-fighting in any frame we sampled.
The materials are the fascinating failure. We verified the .blend directly: the cap is assigned a metallic BrushedGold material (base color 1.0/0.72/0.32, metallic 1.0), the floor is a procedural black marble (color-ramp stops at 0.01-0.06), the liquid is named AmberLiquid (1.0/0.55/0.15). The model understood the photo. But the render does not show any of it, because the lighting is overexposed: a 300-watt key on a subject about five centimeters tall, plus a 200 W rim, blows the scene to near-white in both view transforms (AgX and Standard). The gold cap reads cream, the black marble reads white, and the amber only survives inside the glass.
The final render backs this up: the delivered MP4 is technically perfect (240 frames, zero black segments, clean geometry in every sampled frame) and creatively overexposed in the same way.
That is a real lesson for anyone wiring models to render pipelines. The model knows the words (PBR, area lights, view transform), but it has no eye. It cannot look at its own render and say "too hot." A human drops the key to 80 W and the scene snaps into place; the model shipped it at 300 W without hesitation. Agentic 3D pipelines that want to work need a render-inspect-correct loop, or an energy heuristic in the harness.
The measured part
| Metric | Value |
|---|---|
| Request id | gen-1794484381-U2mnwlCQ5ocYfAVayymM |
| Input | 1 image (PNG, sha256 8087...91d8) + 2,951-byte prompt |
| Completion tokens | 31,077 (26,868 reasoning) |
| Streamed reasoning chars | 94,241 |
| Finish | stop |
| Wall clock | 293 s |
| Cost (usage.cost) | $0.0127 |
| Script size | 13,397 bytes |
| Final render | final MP4: h264, 1280x720, 240 frames, 10.0 s, 1.03 MB, 0 black segments |
| Mechanical fixes | 2 (documented) |
| Rubric | 21/30 |
What we'd tell Michael (and you)
For a first public photo-to-3D run, 21/30 with a correct part inventory and one overexposure failure is a solid agentic showing, and the failure mode is instructive rather than random. Compared with the Portofino scenery test (Fable 5.2 scored 26/30 there, zero repairs), this task is more constrained and N2.6 came closer on the parts list; the gap is entirely in light energy. If you are building a photo-to-render pipeline: have the model write the scene, then have a separate check (human or script) validate light energies against subject scale before rendering. That one step converts this 21/30 into a 25+.
Benchmark scripts, the raw generation, the fixed scene script, and the preview frames are available in the Nemo Knowledge Base.
Verification notes
- Reference photo:
cap02_product_00001_.png(1024x1024, sha256 808752169fb54336efd3ef53ff760d15301350114470c25b15a60c1cd5f691d8), generated locally with Qwen-Image in October; it is ours to use and shows no branding. - Blender 4.5.3 LTS portable, headless, Cycles CPU, 16 threads; previews at 960x540/32 samples; final render 1280x720/96 samples per the model's own settings, 240 frames.
- Material/lighting claims verified directly in the saved
.blendviabpy.datainspection (values quoted above); render appearance verified via vision analysis of preview frames at frames 40/120/220 in the model's AgX transform and a Standard-transform probe. - Cost is
usage.costfrom the OpenRouter response; session key delta itemized in the KB report.