Trees built for the camera

In an MMO the camera sits behind your shoulder, a couple of metres up. Most game trees are built to be admired from the ground, and from behind a player their low limbs and leaves fill exactly the band the camera looks through. So we rebuilt our main forest trees around that camera, and made almost every tree a resource.
Clear below, full above
A main forest tree keeps a clean trunk up past the camera's line of sight, then spreads its crown overhead. Five species, sycamore, oak, beech, alder and fir, come in three variants each, with leaves, wind and felling built in our own pipeline. Under the canopy you can still see the path, the forest floor and whatever is moving on it.
Trees with low, sprawling limbs still have a place. They're our accent trees, at meadow edges and on riverbanks, where nobody fights underneath.
Forests from a recipe
We don't paint forests by hand. Each world is a recipe: zones and scatter rules in a data file, which a build step turns into the map. Spacing is a true distance test, trees clump and thin by rule, and zone outlines are warped by noise, so a forest ends in ragged fringes and stragglers rather than a neat blob. Clearings have noisy rims that thin out softly, and the smallest become pools of sunlight on the forest floor.
To choose species, sizes and densities we built a tree lab: a test level with every variant at several scales, sample stands and kinds of ground side by side, so choices are made by walking through them in game.
Thousands of trees, almost nothing on the wire
Every tree, sapling, shrub and rock is a harvest node, so a forest can't be thousands of actors. Trees are drawn as hierarchical instanced meshes and grouped into harvest fields, one per streaming cell of the world, which load and unload with the cell on client and server. Each field keeps a stable table of its nodes and replicates only the ones that aren't standing: a short list of what's been cut, when, and when it grows back. Start and end times let every player see the same moment.
Young trees replicate nothing at all. Which trees start young, and how far each has grown, comes from a hash of the node and a shared growth epoch, so every machine works it out for itself.
Epic's Instanced Actors plugin works in a similar way, but it was experimental when we looked. Ours follows its design, so moving onto it later stays straightforward.
Felling
Swing an axe and the tree creaks, then goes over from the top of its own stump. The fall is a rigid rod under gravity, hinged at the cut, with damped bounces and a slight twist. It's presentation only: the server records the result, and the falling trunk has no collision to fight your movement. A player who arrives later sees the stump, not a replay.
Every variant gets its own stump and log end, generated from its lower trunk: an axe notch on the fall side, a torn hinge with splintered fibres, axe facets, and end grain with growth rings and heartwood in the species' colours. The two halves of the cut match.
After a moment on the ground, tree and stump crumble away like dust. Each material has a twin built automatically from the standing one, with an erosion front driven mostly by how flexible each part is, broken up by noise: leaves and twig tips go first, the trunk and stump last. Dust and bark flakes follow the front. The felling content loads asynchronously, so it never stalls a frame.
Regrowth
A sapling takes the tree's place and grows to full size, and a young tree can be cut early for less wood. Respawns are random within a range and shared by everyone. When a tree regrows, the server rolls whether it comes back as a rare kind from that zone's table, and it may regrow at a nearby spare site, favouring cleared ground. Rare trees can't be camped at a known spot, and the forest heals where it was cut. Wood feeds crafting, and enough of it makes a lumber pack you carry on your back.
Built for a crowd
Every world review samples the GPU at each of its views. Our target is 12 ms per view on our review machine, roughly 60 frames a second on a mid-range PC, and a view over the ceiling fails the review. Forests taught us the most:
- Wind moves leaves with world position offset, and that invalidates virtual shadow map pages. Every tree re-rendered its shadows every frame. Scattered trees now use a rigid shadow cache, so leaves sway but cached shadows stay put. Wind also switches off beyond a distance, and the engine's shadow distance for animated geometry is pulled in to match. One forest view went from 32 ms to 14.
- Trees are Nanite meshes of about 150,000 to 275,000 triangles, most of it leaves and bark. The remaining forest cost is Nanite geometry, so the next lever is impostors for the far forest.
- We tested classic shadow maps against virtual shadow maps. Classic maps cost more in our forests, so we kept virtual ones.
What we learned
- Build materials with a renderer. Our material build once ran headless, no shaders reached the cache, and Nanite drew a new masked leaf material as solid green squares while it compiled. The build now refuses to run without a renderer, and the review checks every felled part's material.
- Stumps have to find the ground themselves. Trees are planted slightly sunk and scaled, and a stump that inherited that transform ended up buried. It now traces down to the landscape under its cut.
Tell us
How do the games you love keep forests readable under a third-person camera? And where would you draw the triangle line for trees in a hundred-player fight? Write to us at hello@worldofaccords.com.
‹ All news