threejsassets
home / browse / vehicles

Low-poly 3D vehicles for three.js

The vehicle collection is 25 models drawn from four packs — and nine of them have no engine at all: a saddled dromedary, a Nile felucca under lateen sail, a gilded ceremonial chariot, a donkey cart, a horse-drawn farm cart, a hand cart, a garden wheelbarrow and two town bicycles. The rest is ordinary traffic — sedans, taxis, a low-floor bus, a bendy articulated bus, a courier van, a box truck, a garbage truck. One Draco-compressed GLB each, 4.5 to 21 KB over the wire.

25 assets · updated weekly

How the fleet is built

Nothing here is a recolour unless the description says so. taxi-01 does share the City sedan's hull in taxi yellow, with a checker door band and a lit roof medallion. But metropolis-taxi-01 was modelled in its own right — scalloped arches with flared lips, an upright glasshouse, a separately slatted grille — because a downtown block needed a cab that did not read as the same car parked twice.

Triangle budgets

564 triangles for the Cozy Village wheelbarrow, 3,174 for the Desert Kingdom felucca and its rigged lateen sail, and an average of about 1,175 across the collection. Anything with an engine sits in a narrow band between 848 and 1,466, so a street with a dozen cars parked along it costs roughly what one detailed building does.

One mesh, one material

Each vehicle exports as a single merged mesh sharing one lowpoly MeshStandardMaterial — no textures, no second request after the GLB. That is what makes a car park instanceable, and why recolouring is a palette edit. Pack bundles ship palettes.json with four named palettes (day, warm, cool, night) over 113 colour keys.

Authored small, on purpose

A sedan is about 4.2 m long and the city bus hull about 8 m, set against architecture standing at roughly 70% of real height — so vehicles read as vehicles rather than dwarfing a shopfront. Desert Kingdom's camel and carts sit near 0.65× metric for the same reason. The scale is baked into the geometry, not applied at placement.

Questions

Yes, and deliberately a little small: a sedan is roughly 4.2 m long against architecture authored at about 70% of real height, which is what stops a parked car from looking like a bus next to a shopfront. Metric scale is baked into the geometry and the pivot sits on the ground, so there is no per-asset scale factor to keep in a spreadsheet.
One GLB per vehicle, Draco-compressed, 4.5 to 21 KB, origin at the base and centered so it sits on a road tile at y = 0 without a pivot correction. A pack bundle adds the same models as typed React Three Fiber components generated with gltfjsx --keepnames — so in an R3F project a sedan is <CarSedan01 /> rather than a loader call.
That is the only way to repaint one — there are no textures. Each vehicle carries a single shared lowpoly material and its colour lives in vertex data, so a bundle ships the palette that generated it as a plain key-to-hex JSON: 113 keys in the City pack across four palettes.
They are authored to. Headlights, tail bars, bus route blinds and the taxi roof sign are painted with glow keys — lamp for lamps and headlights, glass for window grids, neon for signage — that the night palette keeps bright while every ordinary key drops to 30–45% lightness. The shipped GLB is baked to the day palette; the night one comes with the pack bundle.
Neither. There are no rigs, no animation tracks and no pedestrians anywhere in the library — the fleet is deliberately driverless static set-dressing. Wheels are modelled as free-standing geometry standing in open cut-away arches rather than painted onto the body, but the export merges each vehicle into one mesh, so spinning a wheel means splitting it out yourself first.
Low-Poly 3D Vehicles for Three.js (GLB) — threejsassets