Turning a 3D Room Into a Printable Paper Model
A room that renders beautifully in a browser usually makes a terrible paper model, and the gap between the two is mostly a question of how many faces a human will cut.
Every room on arthis.land exists twice: as a .glb loaded by a WebGL viewer, and as a sheet of paper you print, score, cut and glue. The printable builds at /paper-model share a Blender source with the web rooms, but they are not an export — they are a separate build target with different constraints, and pretending otherwise is how you end up with a PDF nobody can assemble.
The short version: your printer resolves about 0.3mm, a craft knife in a human hand rather less, and a person cutting out a room-scale model gives up somewhere north of 120 faces. Everything below follows from those three numbers.
Choosing a model that can survive papercraft
Paper does exactly one thing well: it holds a plane. Anything in the mesh not comfortable being a plane will fight you. Four disqualifiers, in roughly the order they bite:
- Curves with no flat approximation. A cylinder unrolls fine. A sphere becomes a gore pattern of twelve to twenty thin petals, each glued edge-to-edge with no tab room. Facet it or drop it.
- Open shells. A single-sided wall plane has no thickness in the mesh and none on paper. The unfolder will produce a net for it, and the result is a flat sheet that collapses because nothing can take a tab.
- Thin spikes. A chair leg 8mm across at print scale is an 8mm paper tube with two 3mm tabs down its length. You cannot fold that. Anything under 12mm finished wants merging into the body it attaches to.
- Sub-millimetre detail. Panel lines, skirting, the gap between floorboards. The printer lays those down as a fuzzy grey line and the knife cannot follow. They belong in the texture, not the geometry.
Decimating to a face count a human will cut
A web room carries tens of thousands of triangles because a GPU does not care. A paper build wants tens of faces — every triangle is an extra cut edge and an extra fold. A good room-scale model lands between 40 and 90 faces. At 120 it stops being fun and becomes homework. Past 200, people print it, look at it, and never start.
Decimation alone will not get you there. Collapse mode produces triangle soup: fewer faces, but full of slivers that unfold into unusable shards. Collapse to roughly the right density, then planar decimate to merge coplanar triangles back into large flat n-gons, then fix the rest by hand. Planar is the important step — it turns 400 triangles describing a flat wall back into one quad.
Manifold geometry, and why a hole makes an unfoldable net
An unfolder walks the face graph: pick a face, cross a shared edge to the next, rotate it into the same plane, repeat. That walk requires every edge to be shared by exactly two faces. An edge with one face is a boundary and the walk stops. An edge with three is ambiguous and the walk either guesses wrongly or refuses.
That is non-manifold geometry, and why the failure arrives as "cannot unfold" rather than a warning. Duplicate vertices from a careless merge, an interior face inside a joined object, a hole where a boolean failed — each produces an edge the walk cannot cross, and the net comes out in fragments that glue to nothing. Check before unfolding, not after:
import bpy, bmesh
obj = bpy.context.active_object
# Planar pass first: collapse-only decimation leaves slivers that
# unfold into shards too thin to cut, let alone tab.
dec = obj.modifiers.new(name="Paper", type='DECIMATE')
dec.decimate_type = 'DISSOLVE' # planar
dec.angle_limit = 0.0873 # 5 degrees, in radians
bpy.ops.object.modifier_apply(modifier=dec.name)
bm = bmesh.new()
bm.from_mesh(obj.data)
# An unfolder walks face-to-face across shared edges. Any edge not
# used by exactly two faces stops that walk dead.
bad = [e for e in bm.edges if len(e.link_faces) != 2]
loose = [v for v in bm.verts if not v.link_edges]
print("faces:", len(bm.faces), "non-manifold:", len(bad), "loose:", len(loose))
if len(bm.faces) > 120:
print("WARNING: over the 120-face fun limit")
if bad or loose:
raise SystemExit("fix geometry before unfolding")
bm.free()
Fail the export on that check. A net built on a broken mesh wastes paper, ink and an evening.
UV unwrapping is not unfolding
These get conflated constantly and solve different problems. UV unwrapping maps a surface into texture space and may stretch, because a sampler compensates and nobody measures a pixel with a ruler. Unfolding must be isometric: every edge in the net is exactly as long as the edge it came from, because two paper edges that meet have to physically meet.
A UV unwrap with 4% stretch looks perfect on screen and produces a model whose last wall is 6mm short. UV islands also cut seams wherever the algorithm likes; an unfolder must cut them where a hand can reach with a knife and a glue brush. Same input, different output, no substitution.
Glue tabs
Alternate sides. Along any chain of connected faces, put the tab on one side of an edge, the other side of the next, then back. Tabs all on one side stack into a ridge that stops the model closing flat.
Never on a visible edge. A tab folds inward and glues to the inside of its neighbour, so the seam belongs where nobody looks — a back corner, under a floor, behind furniture. Hide the closing seam in the corner furthest from the open face.
Mind the fold direction. A tab folds the same way as the joint it serves, and an inside corner folds opposite to an outside corner. Get it backwards and the tab sits outside in plain view. Size them 5–7mm: under 4mm there is too little glue area, over 8mm the tab shows through and warps the panel as it dries.
Scoring, and mountain versus valley
Paper above about 140gsm will not fold cleanly unscored — the outer fibres crack and the fold wanders. Score with a dry ballpoint or bone folder against a steel rule, crushing the fibres without cutting through.
Mark mountain folds (fold points toward you) as dashed and valley folds (fold points away) as dash-dot — standard origami convention, worth keeping. Cut lines solid, tabs outlined in lighter grey so they read as different at a glance.
This is why you print on the inside face for a scored build. You score from the side that ends up inside, so the fold lines and tab guides have to be there — and the finished model carries no printed marks on any visible surface. A textured model needs texture outside and marks inside: duplex printing, plus a registration problem. Most room builds are single-colour, which sidesteps it.
Sheet layout, bleed and margin
A4 is 210 × 297mm, US Letter 216 × 279mm. Letter is wider and 18mm shorter, so a net that just fits A4's height is clipped on Letter. Lay out to the intersection — 210 × 279mm — and one file prints correctly anywhere.
Then subtract what the printer takes. A home inkjet or laser will not print within 5mm of any edge, and many take 10–12mm at the bottom where the rollers grip. Design to a 15mm margin all round and you never lose a tab to an unprintable zone, leaving roughly 180 × 249mm usable per sheet. A room at 1:50 needs two to four sheets; number them and the tabs, because loose pieces are indistinguishable once cut. Print at 100% with scaling off, or every measurement is wrong by whatever the driver decided.
Paper weight
| Weight | Behaviour | Best use |
|---|---|---|
| 80gsm | Copier paper. Curls with glue, no rigidity. | 50% test prints only |
| 120gsm | Folds easily, holds a crease, warps as PVA dries. | Test fits, parts under 20mm |
| 160gsm | The comfortable floor. Scores well, folds without cracking, flat. | Most parts, detailed sections |
| 200gsm | Rigid, needs scoring on every fold. Excellent walls and floors. | Structural panels, shells |
| 250gsm | Stiff card. Folds crack without a firm score; feeders struggle. | Base plates only, hand-cut |
| 300gsm+ | Jams most home printers. Folds crack even scored. | Avoid; needs a card printer |
160–200gsm is the workable band; 180gsm is the safe default. Below 120 the model warps as it dries, above 250 you fight the printer and the material at once.
Assembly order
- Print every sheet at 100%, scaling off, on paper from one pack — batches differ enough in thickness to show at the seams.
- Score every fold line before cutting. Scoring an already-cut piece means holding a 15mm sliver against a steel rule, which is how you slip.
- Cut the outlines: straight edges against a steel rule with a fresh blade, curves freehand, rotating the paper rather than the knife.
- Pre-fold every crease both ways, then set its final direction. This softens the fibres so the fold stops fighting you mid-glue.
- Build subassemblies first — furniture, fittings, anything inside the room — and let each dry fully before it goes near the shell.
- Assemble the shell with one face left open so you can reach inside and press seams flat. Fingers need about 60mm of opening.
- Place and glue the subassemblies through that opening, working from the far corner outward.
- Close the last face: glue its tabs at once, seat it in one movement, hold 30 seconds. You cannot reposition a closed box.
- Weight the model under a book for an hour while the joints cure.
Glue
PVA is the strongest and slowest — 30 seconds of grab, 20 minutes to firm, an hour to full strength — and it introduces water, which warps anything under 160gsm. Apply it thinly with a brush, never from the nozzle. A glue stick adds almost no moisture and suits large flat laminations, but its bond on a 5mm tab is weak enough that a knock pops the seam. Double-sided tape is instant and unforgiving: right for long straight seams you are sure of, wrong for anything you might need to nudge.
The discipline matters more than the choice. Glue one joint, hold it, wait, move on. Three tabs at once means all three are still moving when you seat the fourth, and the panel ends up 2mm out of square — which compounds, so by the last face nothing meets.
Test at 50% on cheap paper
Print the whole net at 50% on 80gsm, cut it out roughly, assemble it badly. Twenty minutes, and it finds the mistake, because there is always one: a tab folding the wrong way, two edges meant to meet sitting 4mm apart, a piece that cannot go in once its neighbour is glued. You will get a tab direction wrong at least once. Finding that out on scrap costs twenty minutes; finding it on the fourth sheet of 200gsm costs the sheet, the ink and the will to continue.
One master, two build artefacts
The .blend is the source of truth: full-resolution textures, unapplied modifiers, clean quad topology, real edge loops. From it come two outputs that never talk to each other — the .glb these nets come from, decimated and texture-compressed for the viewer that renders the digital version, and the PDF net, decimated far harder on a different axis and carrying no textures.
Do not derive the paper model from the shipped .glb. That file has been triangulated, merged by material and had its UVs packed into an atlas — fine for a GPU, hostile to an unfolder, which needs quads, separate objects and seams a person can reach. Going back to the master takes ten minutes; repairing a net unfolded from a shipped mesh takes an afternoon and never comes out clean. Version them together, or the paper model on the site is quietly of a room that no longer exists.
Written from the arthis.land and arthis.space codebases by Aayush Kumar, who builds both. If something here is wrong, or you have shipped the same problem a better way, tell me — corrections get made and credited.
Arthis