Camera cutscenes without a mod: keyframes, interpolation and spectator tricks
Vanilla moves a camera one way — a ticking teleport function — and the timeline registry sets the mood around it. What each is good for, and the smoothing that stops it looking robotic.
There is no camera object in vanilla, so a cutscene is an illusion built from teleports, with a timeline to change the world around it.
Method 1: teleport the player every tick
The old, universal way. Put the player in spectator, then move them along a path:
gamemode spectator @s
tp @s 100.0 70.0 200.0 -90.0 10.0
one tp per tick from a function chain. It works on every version and needs nothing special. The problems are all about smoothness:
- 20 keyframes per second. A ten-second shot is 200
tplines. - Linear steps look mechanical. Real camera moves ease in and out.
- Rotation wraps badly. Going from yaw 170 to -170 is a 20-degree turn, but naive interpolation spins 340 degrees the wrong way. Normalise the angle difference into the range -180…180 before stepping.
Generating those lines is what a keyframe tool is for — you place a handful of positions and it emits the per-tick function with easing applied.
Easing
The difference between amateur and watchable is the interpolation curve. Between two keyframes, with t from 0 to 1:
linear t
ease-in-out t < 0.5 ? 2t² : 1 − 2(1−t)²
smoothstep t² × (3 − 2t)
smoothstep is the safe default. Apply it to position and rotation together or the camera arrives before it finishes turning.
Method 2: timelines, for everything except the camera
Recent versions added a timeline registry, and it is tempting to read it as a camera track:
data/<namespace>/timeline/intro.json
It is not one. A timeline runs against a world clock and keyframes environment attributes — sky and fog colour, ambient sound and music, light — with native interpolation. It cannot move a player, so the camera itself is still method 1. What a timeline does well is the mood of a cutscene: fade the sky, shift the fog and swap the music in step with the teleports, without a per-tick command for each.
The cost is that it only exists on recent versions, so a map targeting older clients has to fake the mood with /time and /weather.
Keeping the player put
The teleport path fights two things:
- Player input. Spectator lets the player fly away mid-shot. Re-teleporting every tick overrides it, which is one reason the brute-force method persists.
- Chunk loading. A camera flying somewhere unloaded shows void.
/forceloadthe path before the shot and remove it after.
Hiding the HUD
Spectator mode and F1 get you most of the way. For a clean frame, a resource pack that blanks the HUD sprites removes the crosshair and hotbar without the player pressing anything — see the HUD guide.
Place keyframes on a path and export the per-tick function, and build the timeline that sets the scene around it, with the Cutscene & Timeline Builders.