Ask a model for a 3D chair and you get five boxes.

A box for the seat, a box for the back, four thin boxes for legs. They're roughly in the right places. Turn the camera and one leg is floating a centimetre above the floor, the back is sunk into the seat, and the whole thing is the size of a house because nobody said what unit "1" was.

It's not that the model can't do geometry. It's that nobody taught it how people who make 3D models actually work.

Flash is my open source agent, and Onyx is the local model behind it: an open-weights base in Ollama, shaped by one long Modelfile. The last update taught it taste in typography, layout and color. This one teaches it two crafts: building 3D models and directing images.

3D: the order matters

The new 3D MODELS section opens with the rule every modeller learns first:

A model is judged by its silhouette first, its proportions second, and its detail last. Get the outline right from three angles before adding anything small, because no amount of detail rescues a shape that reads wrong.

Then it works through the habits that separate a model from a pile of primitives.

Real units, real sizes. Metres, Y up, resting on the ground at zero. Before placing a part, work out how big the real thing is: a chair seat sits near 0.45 m, a door near 2 m by 0.9 m, a mug near 0.1 m tall. "Proportion errors are what make a model look like a toy."

Block out, then refine. Rough the whole object in a handful of big shapes, check it, then split them into real parts. And name every part for what it is, left rear leg, lid, screen, never box3, so the next edit can find it.

Parts meet. This one surprised me with how much it matters:

A table top overhangs its legs, a lid has a lip, a screen sits inside a bezel. Leave a visible seam, gap, or step where two parts join; a single smooth block where three pieces should be is the look of a placeholder.

Nothing is perfectly sharp. A bevel of a few millimetres catches light, and it's most of what separates a made object from a primitive.

Materials over polygons. Metalness is 0 or 1. Roughness does the work, and almost nothing sits at 0. Worn edges rougher, handles smoother, painted metal not mirror metal.

Detail where the eye goes. The front, the handles, the controls and the moving parts get extra parts. The underside stays simple.

Hinges are hinges. A door turns about its hinge, a drawer slides on its runners. Set the pivot at the hinge or axle, not at the part's centre, and never swing past what the real part can do.

Three views, every time. Front, three-quarter, and top or side, wherever there's a picture to look at. Floating parts, parts sunk into each other, and gaps at the ground line are the defects to hunt:

A part that only looks right from the angle you built it at is not done.

And when it writes the model in code (trimesh, three.js, Blender's Python): merge what never moves, keep normals pointing out, apply transforms before export, ship glTF in metres, and say the overall size in the reply, so you can check it against the real thing.

Images: direct, don't just prompt

The second new section is IMAGE DIRECTION. It applies whether Onyx is drawing with code or writing a prompt for an image generator.

One subject, and a reason to look. Decide where the eye lands first, put it off centre on a third, and give it the strongest contrast. Everything else gets quieter.

Value before color. This is the one I'd tattoo on every generated image:

Squint at the draft or convert it to grey: if the subject does not separate from the background in light and dark alone, no colour choice will save it.

Light has a direction. One key light, from a side and a little above, and every shadow agrees with it. "Flat light from everywhere is the default look nobody chose."

Depth is layers. A foreground element, the subject, and a background that recedes by getting lighter, cooler and lower in contrast.

Prompts are briefs. Write it the way you'd brief a photographer:

"A ceramic mug on a walnut table by a window, late afternoon side light, 50mm, shallow depth of field, steam rising" beats "a beautiful cozy mug, high quality, 4k".

Iterate like an art director. Generate a few, judge them against the brief, and refine the closest one, changing one thing at a time so you learn what moved it. Check hands, text, reflections and edges at full size, because that's where generators fail first.

Deliver for where it's going. 1:1 for a feed, 9:16 for a story, 16:9 for a slide, 2:1 for a cover, with the size named in the reply.

The one-line version

Every Onyx Modelfile ends with a short recap, the lines it should keep if it remembers nothing else. Onyx 3's recap now has this one:

A model is checked from three views in real metres; an image has one subject, a light, and values that read in grey.

That's most of what a first-year 3D or illustration course spends a semester on. It turns out a model can follow it on day one, as long as someone writes it down.

Try it

Onyx builds from its Modelfile with Ollama:

git clone https://github.com/Natuworkguy/flash cd flash python3 models/build.py models/flash-onyx-<version>.Modelfile 

Then ask Flash for something with real parts: a desk lamp with a hinged arm, a mailbox that opens, a poster for a neighborhood bake sale. Turn the model around. If a leg is floating, it owes you a fourth view.