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.