explore

8 Images

Drag it.

The redesign

The viewer had to survive a page I would never see

Three constraints shaped every other decision, and not one of them is about rendering. Each is a load the interface had to carry.

Problem

A file the web cannot open

A furniture merchant has two things that do not fit together: a 3D model built for a rendering package, and a product page built for photographs. The model is heavy - the demo firetruck alone is a megabyte of mesh before a single texture loads - and it arrives as an undifferentiated lump of geometry with no idea which triangles are the seat and which are the legs.

Between those two things there was nothing. Not a rendering problem: a naming problem, a reduction problem, and a fitting problem. The rest of this page is those three.

I built a 3D editor out of 2D habits

Meshes as layers

3D software presents geometry as a scene graph. Graphics tools present it as a stack of layers, and almost everyone in this market has used one of those.

So meshes are layers. Selecting, reordering and renaming work the way they do in an image editor, and the merchant never learns a new mental model to do the one job they came for.

Paths as groups

The same borrowing, one level down. A path is a group, because that is the word the audience already has for it.

Consistency here is not tidiness. It is what lets someone who has only ever grouped objects in Figma do the equivalent thing to a mesh without being taught.

Floating panels

Docked panels eat the canvas, and the canvas is the product. So the panels float, the way Figma's do, and the model keeps the room.

It also rehearses the real constraint: if the interface can give up its own space on a desktop, it can survive being squeezed into a merchant's page later.

Parts as the unit

A shopper cannot choose a material for a mesh. They choose one for the seat, the legs, the top.

So grouping meshes into named parts is not a modelling step, it is the step that makes the product shoppable. Chair back, chair base, chair seat, chair cushions, table top, table legs, vase - seven names, and the configurator writes itself.

The material editor

Maps are a stack, not a form.

Switch a map on and the render answers. This is the screen I argued for and won.

CategorySubcategory
54 %

Normal map

H120
S180
V0

Roughness

0,35

Emission

0,27

Playing itself — touch anything to take over

The file itself

An arbitrary mesh, and the names that make it shoppable

This is the real thing - toy-firetruck.glb, exactly as the product serves it: Draco-compressed, 1,066 KB, straight out of Blender. The list beside it is not typed into this page. It is read back out of the file at runtime, which is why it says what it says.

Ten named meshes arrived with the model. Click one and the rest fall away. That is the entire argument of the product in one gesture: geometry is not shoppable, but Ladder Turret is.

Parts

10 of 10

Whole. Take a part off if you like.

The loop

From a lump of geometry to something a shopper can point at

Four moves. Each one exists because of the load named above it.

  1. 01

    Upload the model

    The merchant brings whatever their maker exported. Nothing is renamed, nothing is optimised by hand - the model arrives as it is, and the work of making it legible happens here rather than in a 3D package the merchant does not own.

    The 8 Images product viewer showing a chair, side table and vase with the materials menu open
  2. 02

    Name the parts

    Meshes are grouped into parts, and the parts get the words a shopper would use. This is the whole trick: after it, every other screen has something to talk about. Seven names on this product is what turns a mesh into a configurator.

    The parts menu listing Chair back, base, seat and cushions, Table top and legs, and Vase
  3. 03

    Attach the materials

    Materials are built in their own editor - imported, or made from layers - and attached per part. One chair seat carries 127 of them, paged sixteen at a time, which is only usable because the library is already cut into thirteen sets.

    The material picker for one part, showing 3 of 127 available materials
  4. 04

    Fit it to a page you will never see

    Desktop, tablet, phone, and a custom size the merchant drags to, with the pixel dimensions live while they drag. The viewer reflows and the chrome stays. This is the step the first version got wrong.

    The embed size rail: desktop, tablet, phone and a custom size with a live pixel readout

The fail

I designed for three screen sizes. Merchants have infinite.

The first version of the embed offered desktop, tablet and phone. Three breakpoints, the way a website is built, and it looked correct in every review because reviews happen at the sizes you designed for.

Then it went into a real page. A merchant's product column is not 1440, or 768, or 393. It is whatever is left after their header, their gallery and their sidebar have taken what they need - and at those in-between widths the viewer was wrong in the way only fixed breakpoints can be: a menu that overlapped the model, a thumbnail strip that clipped, controls that had nowhere to go.

The fix was to stop treating size as a set of cases and start treating it as a range. A custom size with a drag handle and a live pixel readout, and chrome that is laid out against the container rather than against a breakpoint. It is the least glamorous decision in the project and the one that made the product embeddable.

The proof

The viewer, running in this page

This is the shipped product, embedded the same way a merchant embeds it — which makes this portfolio page one of the arbitrary containers the thing was built to survive. Drag the frame and watch the chrome hold.

It loads on sight, and it costs what it costs: 2,273 KB across 65 requests — a megabyte of mesh, a 387 KB lighting environment, and a Draco decoder to unpack the geometry. A page that argues heavy 3D can feel light should be honest about what heavy means.

548 × 344Drag the corner. This is the test the first version failed.

One slot in somebody else's page. That was the brief.

A small thing that was not small

Models became Products, Showrooms became Scenes

The navigation shipped with different words than the ones it was designed with. Research moved them: Models and Showrooms are what the people who build 3D call these things, and they quietly told everyone else that the tool was not for them.

Products and Scenes are what a merchant calls them. Renaming a primary navigation item late is expensive and worth it - it is the cheapest possible way to widen who thinks a tool is meant for them.

Designed, not shipped

Scenes is still a waiting room

The third module - putting several products into one room and rendering the set - is designed and not live. Open it in the product today and you get a sentence and a request-early-access link.

That empty state is the part I would defend. A module that does not exist yet still has a state, and the honest one tells you what it will do and offers you a way to be told when it does, rather than hiding the navigation item and pretending the ambition is not there.

Reflection

The 3D was the easy part

Two and a half years on this, and almost none of the work that mattered was about geometry. It was about naming: parts so a shopper can point, sets so a catalogue of two thousand textiles can be chosen from, panels and layers borrowed from tools people already knew so that nobody had to be taught.

The decision I would defend in any review is the boring one - laying the viewer out against its container instead of against three breakpoints. It is invisible when it works, and it is the only reason the thing can live on a page I will never see.

Next case studyTinkoff CheckoutKeep scrolling to continue