Phaser AE

First-Person Camera Rig

Free packv3.0.0-23DRigs

The camera for any game played from the eyes: a walker, a shooter, a maze, an architectural tour. Mouse look, WASD movement, sprinting and flight are handled, and the rig leaves walls and ground to your game through two simple hooks.

This is a Free pack. Every phaser.io account can use it in their games.

Released October 14, 2026 · updated October 19, 2026

First-Person Camera Rig: a screenshot of its demo
A note about these graphics

Expansion packs don't come with graphics. This screenshot is one way of drawing what the pack does, made for its demo: none of the sprites, tiles or backgrounds in it are in the pack.

That's by design. A pack is a game's logic, mechanics and effects, and it works with whatever art you give it. Some packs draw effects, backdrops or 3D scenes of their own, but none carries a game's sprites.

So the look is yours. Make the art on phaser.io, bring your own, or let your agent draw it in code: the same pack can look like anything.

The pack

rigFps

function rigFps(opts: FpsOptions = {}): Pack<{ rig: FpsRigApi }>

The first-person rig: mouse or drag to look, WASD (or the arrows) to move, shift to sprint, and space and control to rise and fall while flying. Requires a 3D world; it drives the camera as an eye, so the world's distance stays 0.

Types

FpsOptions

interface FpsOptions

Manifest options.

  • speed?: number — Metres per second walking. Default 6.
  • sprint?: number — Speed multiplier while the sprint key is held. Default 1.8.
  • eyeHeight?: number — Eye height above the floor, world units. Default 1.7.
  • fly?: boolean — Start flying (no floor, and looking up flies up). Default false.
  • sensitivity?: number — Radians of turn per pixel of mouse movement. Default 0.0022.
  • invertY?: boolean — Look up when the mouse moves down. Default false.
  • lockPointer?: boolean — Lock the pointer on the first click, so looking does not need a held button. Default true.
  • maxPitch?: number — How far down the player may look, radians. Default 1.5.
  • minPitch?: number — How far up, radians (negative looks up). Default −1.5.
  • start?: { x: number; y: number; z: number } — Where to stand at the start. Default 0, eyeHeight, 0.

FpsRigApi

interface FpsRigApi

game.rig: the first-person camera.

  • floor: ((x: number, z: number) => number) | null — Authoritative ground query while walking; null keeps the original flat floor.
  • canMove: ((from: { x: number; y: number; z: number }, to: { x: number; y: number; z: number }) => boolean) | null — Optional movement validator for terrain slopes, cliffs or world bounds.
  • x: number — Eye x.
  • y: number — Eye y.
  • z: number — Eye z.
  • yaw: number — Look yaw, radians.
  • pitch: number — Look pitch, radians; positive looks down.
  • speed: number — Walking speed.
  • fly: boolean — Fly, or stay at eye height above the floor.
  • eyeHeight: number — Eye height above the floor when walking.
  • readonly locked: boolean — Whether the browser currently has the pointer locked.
  • moveTo(x: number, y: number, z: number): void — Put the player somewhere without a sweep.
  • readonly intent: { x: number; y: number; z: number } — Where the player is trying to go this step, in world units — before anything clamps it. A game that wants walls reads this together with previous, decides where the player may actually stand, and calls moveTo.
  • readonly previous: { x: number; y: number; z: number } — Where the player stood at the START of this step. Clamping needs both ends of the move: without it a game cannot tell where the player came from, because the rig has already taken the step.
  • lock(): void — Ask the browser for pointer lock (needs a user gesture).
  • unlock(): void — Release it.