world

Make a 3D game world feel large and real — world scale, draw distance, fog and horizon, level-of-detail, and consistent prop/character scale. Use when a map feels small, empty, or ends abruptly, or when building open or outdoor scenes.

Skill file

Preview skill file
---
name: world
description: "Make a 3D game world feel large and real — world scale, draw distance, fog and horizon, level-of-detail, and consistent prop/character scale. Use when a map feels small, empty, or ends abruptly, or when building open or outdoor scenes."
---

# World Scale & Distance

A world feels small for three fixable reasons: it is physically small, it ends at a visible edge, or there is nothing in the distance. A "big map" means hundreds of meters with something on every horizon — not a 150m patch with empty space past it.

## Size to the experience
Pick the world size from how the player moves. A third-person shooter map you sprint across for a minute is roughly 300–1000m wide, not ~150m. Place points of interest far enough apart that traveling between them takes real seconds.

## Shape the ground
Outdoor ground is almost never flat — a flat plane is the clearest "unfinished prototype" tell after untextured gray. Give the terrain real shape: displace a subdivided plane's vertices with layered noise for hills, slopes, and valleys, or drive it from a heightmap. The noise must be *coherent* — `Math.random()` per vertex gives spiky static, not hills. Three.js ships no noise function, so add the `simplex-noise` package and sum a few octaves (each octave halving amplitude and doubling frequency) so large hills carry small undulations. Carve in readable landmarks — a ridge, a basin, some high ground — so the space has tactical variety, then call `geometry.computeVertexNormals()` so lighting follows the shape. Keep collision and the navmesh aligned to the *shaped* terrain, not a separate flat floor underneath.

The terrain is a surface like any other — it needs a real material, not a solid color (see the `materials` skill). Apply a tiled ground texture, and for a large map blend it by slope and height (grass on flat ground, rock/cliff on steep slopes, sand at the shoreline) so the whole map doesn't read as one flat green sheet.

## Give the world distance
The eye reads scale from depth cues — provide all three so the world has a horizon instead of an edge:
- **Horizon:** a skybox / environment background or a distant terrain silhouette, so the ground never ends at a hard line.
- **Fog:** `scene.fog = new Fog(skyColor, near, far)`, tuned so far geometry fades into the sky. This adds depth *and* hides the draw-distance edge. Match the fog color to the sky color.
- **Distant detail:** large background landforms, ridgelines, or structures the player can see but may never reach.

Set the camera `far` plane past the fog's far distance so nothing pops in, and keep `near` reasonable (e.g. 0.1) for depth precision.

## Fill it without tanking the framerate
Density is what makes a world believable; an empty ground between a handful of props reads as a prototype. Scatter dense detail — grass tufts, rocks, bushes, debris — across the terrain, and cluster props into *places* (an outpost, a copse of trees) rather than dotting them evenly. Naive copies kill the framerate, so use `InstancedMesh` for the repeated detail.

A loaded prop is rarely a single mesh: glTF represents one model as a hierarchy, and a part with several materials (a tree's trunk and foliage, a rock's stone and moss) arrives as a *group of separate meshes*, one per primitive. `InstancedMesh` instances one geometry+material pair, so grabbing the first mesh you find and instancing it silently drops every other primitive — you scatter bare trunks instead of trees. Instance each primitive in its own `InstancedMesh` sharing the same per-instance transforms, or merge the model's primitives into one geometry first. Note `THREE.LOD` swaps whole objects by distance and does **not** operate per-instance, so for distant instanced detail cull by distance yourself (skip far instances, or keep separate near/far instance pools) rather than wrapping instances in `LOD`.

## Keep scale consistent
Author everything in meters against the character's height (~1.8m). A tree the size of the player, or a crate the size of a house, breaks the sense of place faster than anything else.

## Finish the image
A raw render of correct geometry still looks flat. A light postprocessing pass — subtle bloom, ambient occlusion to ground objects, and gentle color grading (see the `postprocessing` skill) — is often what separates "a polished game" from "a tech demo". Add it once the scene reads correctly, not before.

Source

Creator's repository · drawcall-ai/skills

View on GitHub

Security

Verified — safe to install
Passed all 3 independent security checks
Checked by 3 independent security firms
Does it try to trick the AI?NoSAFE · Gen Agent Trust Hub
Does it sneak in hidden code?NoNo alerts · Socket
Does it have known bugs?NoLow risk · Snyk