· 4 min read
Two Material Languages, and Why They Must Not Mix
Everything on the layout is either built from blocks or manufactured as one piece. Getting a model into the wrong category is the fastest way to make it look wrong, and it is not obvious which is which.
The reference image that started Traluno shows a locomotive and a coach standing on a world made of bricks. The buildings, the hills, the trees and the platform are all visibly stacked cubes. The train is not. It is a solid shape with smooth sides.
That single contrast is the entire art direction, and it is much easier to break than it looks.
The rule
Anything built is made of blocks. Buildings, walls, roofs, terrain, trees, fences, platforms, bridges, industrial structures. These are drawn with a voxel builder that shows the cube seams and jitters the colour slightly per cube, so a wall reads as many bricks rather than one painted surface.
Anything manufactured as one piece is smooth. Road vehicles, locomotives, wagons, boats, containers, animals and people. Plain boxes, plates and cylinders. No seams, no per-cube jitter.
The test is not "is it small?" or "is it detailed?". It is: in the world this thing depicts, was it assembled from parts on site, or did it come out of a factory finished?
A signal box is built. A signal is manufactured. A quay wall is built. The crane standing on it is manufactured. A tree is built, which surprises people until they think about a model tree, which really is made of separate pieces of foliage stuck on.
Why mixing them fails
Voxelise a car and it stops reading as a car. At the size a car occupies from standing height, the cube seams are close enough together to become a texture, and the eye interprets a textured lump as scenery. The car joins the buildings. It stops being a thing that moves.
The failure runs the other way too, less visibly. Smooth a building and it reads as a prop rather than a place. A smooth house has no scale reference in it, so it could be a doll's house or a tower block. The cubes are what tell you how big a house is: you count them.
That is the actual function of the block language. It is not nostalgia, it is a ruler. Everything built shares one cube size, so every built thing is measurable against every other one just by looking.
Where the detail goes instead
The hard part of the rule is that it forbids the easiest way to add detail to a smooth model. You cannot subdivide the surface into smaller cubes, because that turns it into a built thing.
Detail on a manufactured model has to come from silhouette. A locomotive gets mouldings, steps, handrails, a running board, glazing, a chimney with a lip on it. Each of those is a separate small piece that changes the outline. None of them is a subdivision of an existing surface.
This is more work than voxelising, and it is why the vehicle count grew more slowly than the building count for most of the project. It is also why the vehicles look like the reference image and the buildings look like the reference image, rather than everything looking like a compromise between them.
Two mechanical traps
There is a builder function for boxes that rotates about the vertical axis only. That is right for almost everything, because almost everything on a layout is upright and turned to face somewhere.
It is wrong for anything lying in the vertical plane: a wheel rim chord, a diagonal strut, a turbine blade, a ladder rail on a slant. Those need the plate builder, which rolls about the depth axis instead. Trying to fake a diagonal by chaining small boxes along it does not work — it reads as a dotted line, not a strut, because the gaps between the boxes are the same size as the boxes.
The second trap is the window function. It draws a glass box into the lit mesh and a tint into the glow mesh, and the glow mesh only shows at night. That is exactly right for a window: dark by day, lit from within after dusk.
It is exactly wrong for anything meant to read as clear glazing. A bus shelter built with it is a solid near-black box all day. So is a station canopy. Those want a pale solid instead, and finding out why the shelter looked like a coal bunker took longer than building the shelter did.
Where the line got redrawn
Moving models now come from glTF asset kits rather than being drawn in code, and that reinforced the rule rather than blurring it: the kits are smooth, single-piece models, exactly the language the manufactured category already wanted.
Buildings will never make the same move, and not for aesthetic reasons. The mountain reads the track underneath it to carve tunnel bores where the rails pass through. The crossing reads the road beneath it to know which way to paint its stripes. A static asset cannot do either, because it does not know what it is standing on. And the per-position colour hashing that stops a row of houses looking like a row of copies would have to go, because a static mesh has one set of colours.
So the split is now also a technical split: the things that move are assets, and the things that respond to what is around them are code. That was not the plan. It just turned out that the two categories the art direction had already drawn were the same two categories the engine needed.
- art direction
- models
- voxel
