@toytown/models
v0.2.0
Published
CC0 low-poly toy-town building models (GLB) with a manifest: houses, shops, schools, churches, props and more.
Maintainers
Readme
@toytown/models
A kit of low-poly, toy-town building models as GLB files, with a manifest.json describing them.
It includes houses, shops, cafés, pubs, schools, churches, hospitals, offices, petrol stations,
trees, small props and more. It's made for toytown-gl but
works in any engine that reads glTF.
Licence: CC0 1.0. Use the models for anything, including commercial work, with no attribution
needed. Provenance is in models/LICENSES.md.

Conventions
Every model follows the same rules:
- Y-up, metres. One unit is one metre.
- The front faces +Z, where the door and shopfront are.
- The origin is at the centre of the base, so the model sits on the ground at y = 0.
- One material per palette key. Materials are named like
wall_cream,roof_redorwindow, and their colours are inmanifest.json→paletteas sRGB hex. The GLBbaseColorFactorvalues are the same colours in linear space, as the glTF spec requires. To recolour the kit, look materials up by name. - There are no textures or node transforms. Budgets: at most 2,000 triangles per model, 300 per prop.
What's in manifest.json
{
"version": 1,
"units": "metres", "up": "+Y", "front": "+Z",
"palette": { "wall_cream": "#F4E9D8", "roof_red": "#D9644A", … },
"models": {
"house": {
"file": "generic/house.glb",
"pack": "generic",
"osm_tags": ["building=house", "building=detached"], // suggested OpenStreetMap matches
"materials": ["wall_cream", "roof_red", …],
"footprint_m": [8.6, 7.8], // width (x) × depth (z)
"height_m": 8.7,
"variants": [{ "name": "house_2", "file": "generic/house_2.glb", … }]
}
},
"props": {
"awning": { "file": "props/awning.glb", "categories": ["shop", "cafe"], "attach": { "at": "front-wall", … }, … }
}
}variants: other looks for the same category.house,shopandapartmenteach have 2. Pick one per building, for example by hashing an id, so streets don't look cloned.props: small parts to decorate a building when a full model doesn't fit. They are an awning, a red-cross sign, a church spire and a petrol-station canopy, andattachsays where each one goes.- Regional packs (e.g.
ireland/) hold landmark models such as Tramore's Metal Man.
Skin model sets
models/skins/ holds two restyled sets of the generic models, under the same names, so a renderer
can swap a whole set by name. Each folder has its own manifest.json (same format, paths relative
to the folder) and preview.png:
skins/voxel: every model rebuilt from cubes, coloured like the surface each cube came from.skins/chunky: squash-and-stretch cartoon, with squat bulging walls and tall steep roofs.
The props are restyled too. Both sets are generated by assets/generator/generate_models.py and
follow the same conventions and budgets. In toytown-gl, the voxel and chunky themes use them
(models.kit in a theme).
Using the models
three.js
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
const gltf = await new GLTFLoader().loadAsync(
'node_modules/@toytown/models/models/generic/house.glb',
);
scene.add(gltf.scene); // already Y-up, metres, front facing +ZBabylon.js
import '@babylonjs/loaders/glTF';
const result = await BABYLON.SceneLoader.ImportMeshAsync(
'',
'/models/generic/',
'house.glb',
scene,
);Unity: add glTFast and drop
the .glb files into Assets/. glTF +Z maps to Unity's forward (+Z).
Godot 4: copy the .glb files into your project; Godot imports glTF natively. A model's
front (+Z) faces Godot's +Z, the opposite of -Z "forward", so rotate 180° about Y if your game
uses -Z as forward.
Getting it
- npm:
npm i @toytown/models, then use@toytown/models/manifest.jsonand@toytown/models/generic/house.glb. - A zip is attached to each GitHub release (
toytown-models-<version>.zip).
The models are generated by assets/generator/generate_models.py in the toytown-gl repo. See
docs/adding-models.md there to add your own.
