camera-systems
Build game cameras that feel good — 2D follow with a deadzone, look-ahead, smoothing, and level-bounds clamping; 3D third-person orbit with collision and first-person look; plus multi-target framing and a shake hook. Engine-neutral techniques that pair with the engine's camera node and rigs like Uni
By gamedev-skills · 2,883 installs
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill camera-systems
Source repository · Upstream listing
Camera systems
The camera is the player's window; bad camera work makes a good game feel awful. This skill
covers the engine neutral camera techniques — smooth follow, deadzones, look ahead, bounds
clamping, third person orbit with collision, first person look, and multi target framing — and
maps them onto each engine's camera node or rig.
When to use
Use when a 2D camera should follow the player smoothly, stay inside the level, lead the
player's motion, or ignore small movements (deadzone).
Use when building a 3D third person orbit camera (mouse/stick look, collision push in) or a
first person look controller, or framing multiple targets at once.
Use to fix camera jitter, snapping, motion sickness, or a camera that shows past the level edge.
When not to use: for the magnitude and trigger of screen shake and impact juice, use
game feel (this skill exposes the shake offset hook it drives). For the engine's concrete
camera node/component setup, use godot 3d essentials (Camera3D, environment) or the engine
skill. For player movement itself use the engine movement skill ( godot 2d movement ). For
performance of many cameras/render targets, see performance optimization .
Core workflow
1. Decide what the camera serves. Platformer (lead the jump, see hazards), top down (center
with deadzone), third person (orbit + collision), first person (look only). The genre sets the
rules.
2. Follow smoothly and frame rate independently. Move the camera toward the target with
exponential smoothing or a spring ( SmoothDamp ), not a fixed lerp(a, b, 0.1) — that 0.1 is
per frame and changes with frame rate.
3. Add a deadzone so tiny target movements don't nudge the camera; it only follows once the
target leaves a box/zone. Stops nausea in twitchy games.
4. Lead the action with look ahead by offsetting the camera target in the direction of
motion or facing, eased in/out so it doesn't whip.
5. Clamp to level bounds so the camera never shows outside the playable area; combine with
smoothing so it eases to a stop at the edge.
6. For 3D, separate look from collision. Orbit via yaw/pitch on a rig; use a spring arm /
ray to pull the camera in when geometry blocks it; clamp pitch.
7. Update the camera after the target moves. Follow in the late/post step (after movement and
physics resolve) to avoid a one frame lag jitter.
8. Verify by moving the target at low and high frame rates , into corners and walls, and at
the level edges; confirm no jitter, no peeking past bounds, smooth stops. Report what you saw.
Patterns
1. Godot 2D built in follow: smoothing + bounds (don't hand roll first)
2. Frame rate independent smooth follow (when you hand roll it)
3. Deadzone + look ahead (lead the player, ignore jitter)
4. 3D third person orbit with collision push in
5. Screen shake hook (owned trigger lives in game feel )
Pitfalls
lerp(pos, target, const) per frame is frame rate dependent — floatier at 30 FPS, snappier
at 144. Use 1 exp( rate dt) or SmoothDamp .
Following in the normal update before the target has moved yields a one frame lag jitter.
Follow in LateUpdate / after movement/physics resolve.
No bounds clamp lets the camera show black past the level edge. Clamp focus to the level
rect (account for the viewport half size so the view , not the center, stays inside).
No deadzone in twitchy games makes the camera twitch with every micro movement → nausea.
Unclamped pitch in third/first person flips the camera over the top. Clamp pitch (about
80° to +45° for an orbit, ±80° for first person).
Mouse look sensitivity that changes with window size (Godot): InputEventMouseMotion.relative
is scaled by the stretch settings; read screen relative for captured mouse aiming.
Camera clipping through walls in 3D — use a spring arm / occlusion ray to pull in.
Snapping on teleport/respawn is jarring; either hard cut intentionally (and reset
smoothing) or fast ease. Don't let a huge SmoothDamp distance whip across the level.
Shake driving the follow target instead of an additive offset makes follow fight shake.
Compose: smooth follow first, add shake offset last.
Per axis vs radial deadzone confusion — a box deadzone feels different from a circular one;
pick deliberately.
References
For the exponential smoothing/spring derivation, a complete deadzone+look ahead+bounds 2D rig,
3D spring arm/orbit details, first person look, multi target/group framing and split screen,
cinematic camera blends, and the Cinemachine 3 / Godot Camera2D / PhantomCamera mapping, read
references/follow and framing.md .
Related skills
game feel — owns screen shake trauma/triggers; this skill exposes the offset it writes.
godot 2d movement , godot 3d essentials — the player/world the camera frames; Camera3D setup.
physics tuning — interpolate camera follow with the physics step to kill jitter.
platformer , fps shooter — genres whose camera rules this skill implements.
performance optimization — cost of extra cameras, render targets, and split screen.