AI tools: Cameras and cinematics
Cameras, lenses, focus, sequences and renders. 11 tools. You see every step your AI takes and can undo any of them.
anti_aliasing
Image stability report and settings: 4x MSAA plus temporal anti-aliasing (a sub-pixel jitter every frame resolved against the history, reprojected by depth and per-object motion vectors, clipped to each pixel's neighbourhood, so ceiling grids, wires, fixture rims, glints and distant detail stop crawling as the camera moves), its sharpening, map mip bias and the render scale. Set temporal / sharpen / jitter_spread / mip_bias / history_blend / clip to change the renderer for this session (A/B; the person's View menu keeps the saved Temporal Anti-Aliasing setting). Judge changes on a moving camera (record a pan), never on one still. A scene that must look the same without it sets camera_look anti_aliasing "msaa_only"; "taa" forces it on.
| Argument | Type | What it does |
|---|---|---|
clip | number | History clip width in standard deviations of the pixel's neighbourhood (default 1.25; lower ghosts less, flickers more). |
glass_depth | boolean | Glass panes drawn into the resolve's depth and motion vectors with short histories (default on; off reprojects what is behind glass by the depth of the things behind it). |
history_blend | number | Least share of each new frame in a settled history (default 0.05; higher reacts faster, smooths less). |
history_filter | catmull_rom / lanczos | The history's resampling filter: catmull_rom (default, 5 taps) or lanczos (36 taps, sharper). |
history_sharpen | number | Sharpening of the history where it is read between its pixels (moving camera; default 0: it feeds back into the history and crawls; never with temporal upscaling). |
jitter_spread | number | How far the jitter wanders inside a pixel (default 0.5; 1 the whole pixel: softer edges, calmer fine texture). |
map_supersampling | boolean | Material maps also supersampled (four lookups a pixel) on frames the resolve averages (default off: the jitter does it over frames). |
mip_bias | number | Material maps' mip bias while the resolve averages them (default -0.5; lower is sharper and needs the history to stay calm). |
moving_blend | number | Least share of the new frame while the camera moves (default 0.15; the history is read between its pixels; higher keeps moving pictures sharper). |
perceptual_resolve | boolean | The scene's MSAA samples resolved by how bright each looks (default on) instead of the box average of their light, which makes foliage edges glow and flicker against a bright sky. |
perceptual_strength | number | How strongly the perceptual resolve weighs samples by their look (default 1; lower keeps sub-pixel sky gaps and glints brighter). |
sharpen | number | Contrast-adaptive sharpening after the temporal resolve (default 0.5; the scene's camera_look sharpen adds to it). |
still_render_scale | number | Screenshots draw this share of their size and the temporal resolve upscales them (TAAU), the path a live Retina viewport takes below 100% (default 1; session only, for measuring). |
temporal | boolean | Temporal anti-aliasing on or off (session only). |
thin_geometry | boolean | Thin geometry (twigs, a crown's fringe over the far background) keeps its history a little longer where its distance history is trusted (default off). |
tree_coarse_size | number | Trees smaller than this share of the screen's height draw their second coarser level (about a third of the first's triangles; default 1.2, about 25 m for a 25 m tree at a normal lens; 0: off). Lower keeps detail farther out, higher is faster. |
tree_detail_size | number | Trees nearer than the voxel line but smaller than this share of the screen's height draw their first coarser level (about a quarter of the triangles; default 1; 0 full detail up to the voxel line). |
voxel_outlines | boolean | Far voxel trees' outlines anti-aliased sample by sample like a triangle's edge (default on; off decides each pixel all-or-nothing). |
camera_gear
Physical cinema cameras: with no arguments, every camera body (sensor: super35, full_frame, large_format, 65mm, imax, super16, phone...) and lens kit (modern_primes, classic_primes, super_speed, anamorphic_2x, anamorphic_1_5x, large_format_primes, cine_zoom, doc_zoom, macro, ultra_wide, phone, drone, action_cam) with what each looks like. With kit (and body, focal mm, t_stop, focus_distance m): the camera worked out as on set: the lens the kit gives for that focal length, the field of view across and high at 16:9, the full-frame equivalent, what is sharp (near and far limits, hyperfocal), breathing at that focus, coverage. Use the names in sequences (camera_body, lens_kit, lens, t_stop on a sequence or a cut) or a cine_camera component on a camera object.
| Argument | Type | What it does |
|---|---|---|
body | string | Camera body (sensor) name; default the kit's own. |
focal | number | Focal length, mm (default 50, or the kit's nearest). |
focus_distance | number | Focus, metres (default infinity). |
kit | string | Lens kit name. |
t_stop | number | Iris T-stop (default T2.8 within the lens). |
color_grade
Colour grades (3D LUTs) for the camera: list the built-in looks (film_print, bleach_bypass, teal_orange, cold_moonlight, sodium_vapor, sickly_green, vintage_fade, noir, horror_red) and the project's .cube LUTs; apply one to the scene (camera_look lut / lut_strength); make a new one with colour wheels (lift / gamma / gain, contrast, saturation, shadow and highlight tints, optionally on top of a base look); or match: grade the current view to look like a reference picture (Grade Match writes Assets/LUTs/<name>.cube). Per-area grades: a grade_zone object with its own lut. Take a screenshot to judge.
| Argument | Type | What it does |
|---|---|---|
action | list / apply / make / match | list (default), apply a LUT, make one from wheels, or match a reference picture. |
apply | boolean | make/match: put the new LUT on the scene's camera_look (default true). |
base | string | make: a look to start from (built-in or .cube), the wheels on top. |
contrast | number | make: contrast about mid grey (1 none). |
gain | list of number | make: highlights, RGB around 0 (+ brighter). |
gamma | list of number | make: midtones, RGB around 0 (+ brighter). |
highlights_tint | list of number | make: a colour added to the highlights, e.g. [0.03, 0.01, -0.02]. |
lift | list of number | make: shadows offset, RGB around 0 (e.g. [-0.02, 0, 0.03] cools them). |
lut | string | apply: a built-in look or a .cube in Assets ("LUTs/night"); empty removes the grade. |
match_exposure | boolean | match: also take the reference's brightness (default false: the scene keeps its exposure, takes the reference's contrast shape and colour). |
name | string | make/match: the new LUT's name (letters, digits, _ and -): Assets/LUTs/<name>.cube. |
reference | string | match: the picture to look like, a path in Assets ("References/park-1028/mgref_gate_1.jpg") or absolute. |
saturation | number | make: colour amount (1 none, 0 grey). |
shadows_tint | list of number | make: a colour added to the shadows (split tone), e.g. [-0.02, 0.01, 0.03]. |
strength | number | apply/make/match: how much of the grade (default 1; match blends the matched colours by it). |
focus_camera
Move the editor camera to frame an object or look at a point. With Follow AI off, only override_follow: true moves the person's view once without re-enabling AI follow; editor_command view.reset always escapes a trapped camera.
| Argument | Type | What it does |
|---|---|---|
entity | string | Entity name (e.g. "Tower_B") or id (e.g. "#7"). |
fov | number | Vertical field of view in degrees (0.05...175). Give fov or lens, not both. Omitted: keep the current camera lens. |
lens | number | Lens focal length in millimetres on a full-frame 36×24 mm sensor (1...25000): 24 wide, 50 normal, 85 portrait; thousands of mm from far away for a blueprint-true (nearly orthographic) view. Same convention as cinematic cameras. |
look_at | list of number | |
override_follow | boolean | One deliberate camera move even when the person turned Follow AI off; leaves Follow AI off. Use only when asked to help recover the view. |
position | list of number |
look
See the scene as a text report instead of a picture: what fills the view, how bright each part of the frame is, problems the engine finds itself (blown-out or black frames, headless characters, glare, stuck enemies) and the game's state. Fast and cheap; use screenshot only to judge looks.
| Argument | Type | What it does |
|---|---|---|
camera | view / player | view (default): what the viewport shows now (the game camera while playing). player: through the player's own eyes. |
look_at | list of number | |
position | list of number |
make_boss_intro
Make a boss intro: the cutscene when the hero enters a boss arena, as AAA adventure games do. The door seals behind (door sent "seal"); the arena's silence, then it reacts (a low hand-held shot, a rumble); the boss arrives its own way (arrive: "emerge": hidden, then bursting up out of the ground on its Emerge clip; "drop": from above; "stand": already there, waking); the roar (its roar clip) slowed to half speed at the peak; the name card (title, sub) as the boss theme starts (music); back behind the hero, the boss and every script sent "boss_fight_start". Framed from the boss's real size. Saved as Sequences/<name>.sequence.json to refine. Letterboxed, holds the player, skippable.
| Argument | Type | What it does |
|---|---|---|
arrive | emerge / drop / stand | |
boss required | string | The boss object. |
door | any | Optional: the arena door (sent "seal"). |
from | any | The hero's stand-in (default the player). |
music | string | The boss theme's sound (optional). |
name required | string | |
objective | string | |
roar | string | Its roar clip (default Roar). |
sub | string | |
title required | string |
make_reveal
Make an arrival reveal: the cutscene that presents a big place (a temple, a landmark, a city) the first time the hero comes to it, as AAA adventure games do. Framed from the real size and place of subject and of the hero (from, or the player): the camera leaves the hero's shoulder in a slow crane up and back while the focus pulls from the hero to the subject; a push in on the door (if given) while the wake objects' lights come up one after another and a rumble plays (the door is sent "open"); the title card (title, sub) on the swell; a blend back down behind the hero, and the objective. Saved as Sequences/<name>.sequence.json to refine with the other sequence tools; play it from a trigger (a cutscene trigger, or a script's game.cutscene). Letterboxed, holds the player, skippable.
| Argument | Type | What it does |
|---|---|---|
door | any | Optional: the entrance to push in on (sent "open"). |
from | any | The hero's stand-in (default the player). |
name required | string | |
objective | string | |
rumble | string | The door's sound (default prop:stone.scrape). |
sub | string | |
subject required | any | The place revealed: an object's name or [x, y, z]. |
swell | string | The music swell under the title (default Magic/hr_reveal_swell). |
title required | string | |
wake | list of string | Optional: objects whose point_light comes up in order during the push in (rune lines, torches). |
render_sequence
Render a sequence as it is watched (slow motion stretches it), stepped at the fixed simulation rate, through its cameras into numbered PNG frames (video: true also makes an mp4) in the project's Renders/<name>/ folder (or times: a still at each story time), on a copy of the scene. Returns a contact sheet of a few frames. fps default 24; from/to are story seconds. movie: true renders each frame as a film camera exposes it: many whole renders across the open shutter (the cut's shutter angle), the lens's iris and the pixel, averaged before the post (true depth of field with occlusion, every moving thing's real motion blur, supersampled edges); movie_samples renders a frame (default 64).
| Argument | Type | What it does |
|---|---|---|
codec | h264 / prores4444 / prores422hq | The video's codec: H.264 .mp4 (default), or ProRes 4444 / 422 HQ .mov for editing (the sound stays beside it as audio.wav). |
exr | boolean | Movie mode: also each frame's scene-linear picture as OpenEXR beside its PNG (before the post: no exposure, bloom, lens distortion or grade). |
focus_check | boolean | Tint what's sharp green, in front of focus magenta, behind blue (checking focus; not in movie mode). |
fps | number | |
from | number | Story seconds from the start. |
height | integer | |
movie | boolean | Movie mode: each frame many whole renders across the open shutter, the iris and the pixel, averaged before the post. Slower. |
movie_samples | integer | Renders per movie frame (default 64; 16 a quick look, 256 a final). |
name required | string | The sequence's name (Sequences/<name>.sequence.json). |
samples | integer | Lens integration samples per pixel; 8 editor, default 24 offline, 48-64 high quality. |
times | list of number | Story times to render stills at, instead of every frame. |
to | number | Story seconds from the start. |
video | boolean | Also write Renders/<name>.mp4 (H.264, every frame at fps). |
width | integer |
scrub_sequence
See a sequence at any story time without playing it: every track put where it is then (objects, bones, lights, clips at their exact frame) on a copy of the scene, shown through the sequence's camera (camera: "editor" for the editor's view, or eye + look for any view), with the motion paths drawn (paths: false hides them). show: true also puts that moment in the editor's viewport until scrub_sequence {show: false} or Play.
| Argument | Type | What it does |
|---|---|---|
camera | sequence / editor | |
eye | list of number | |
focus_check | boolean | A focus puller's monitor: sharp green, in front of focus magenta, behind blue. |
height | integer | |
look | list of number | |
name required | string | The sequence's name (Sequences/<name>.sequence.json). |
paths | boolean | |
show | boolean | |
t | number | Story seconds from the start. |
width | integer |
upscaler
Temporal upscaler: the scene renders at a share of the output's pixels per axis (scale; 0.67 draws about 45% of them) with a sub-pixel jitter, and the temporal resolve rebuilds full resolution from this frame's samples (weighted by their jittered distance) and the reprojected history (YCoCg variance clipping, depth disocclusion, luminance-weighted blend, per-pixel confidence). Settings apply live for this session. debug_view draws over the viewport: confidence (history length: dark red fresh to white converged), rejection (red dropped, yellow clipped, magenta firefly held), motion (where each pixel's history came from: hue direction, brightness length), jitter (this frame's sample coverage, the sequence in the corner), flicker (cyan where the clip was widened for a pixel that keeps flickering on a still view). capture renders a converged still at a scale to a PNG; sequence renders a camera move frame by frame to PNGs (for PSNR/SSIM, ghosting and sparkle checks). In the editor the viewport's Retina target already holds 2x its scene pixels per axis, so scale 1 there draws one scene pixel per point.
| Argument | Type | What it does |
|---|---|---|
big_world_metalfx | boolean | Big worlds (over 1.5 km of land or 6,000 objects) draw at big_world_scale and MetalFX rebuilds the output (default off until the 11-08 shake is proven fixed; TTR_BIG_WORLD_METALFX=1). |
big_world_scale | number | A big world's live render scale per axis under MetalFX (default 0.67). |
capture | object | Render a converged still at a scale: the history starts over, then frames from the same camera at a frozen time. |
debug_view | none / confidence / rejection / motion / jitter / flicker | Draw the resolve's decisions over the viewport (and stills). |
filter | number | Upscaling, the width (Gaussian sigma, output pixels) of the filter that rebuilds each output pixel from this frame's samples on a still view (default 0.3). |
filter_travel | number | History travel (output pixels a frame) at which the moving filter is fully used (default 2). |
fireflies | boolean | Hold a lone sample brighter than all its neighbours to their level before it enters the history (default on). |
flicker_hold | number | A flickering pixel's history may hold this many times more frames (default 2). |
flicker_reach | number | Deviations past the mean the clip's luma range reaches (default 1.5). |
flicker_relax | number | Still-view flicker handling: the history clip's luma range reaches each pixel's own mean over time give or take its deviation (default 1; 0 off). |
flicker_travel | number | History travel (output px a frame) by which the statistics are dropped (default 0.25). |
flicker_window | number | The flicker statistics' window: share a new frame moves them by (default 0.0625). |
full_motion | boolean | MetalFX gets whole motion vectors (the camera's motion from depth plus each surface's own; default on). Off: our object-only vectors, which made MetalFX's picture shake as the view moved (A/B). |
history_blend | number | Least share of each new frame in a settled history (default 0.03). |
history_clamp | number | History clip width in standard deviations of the current neighbourhood (default 1; lower ghosts less and flickers more). |
jitter_phases | integer | Positions in the jitter cycle (0 automatic: 16, or about 8 per output pixel a scene pixel covers). |
jitter_spread | number | Upscaling, how much of each scene pixel the jitter visits (default 1). |
metalfx | boolean | Below 100% scale, Apple's MetalFX temporal upscaler rebuilds the picture instead of ours (A/B; default off, TTR_UPSCALER=metalfx; big worlds use it by default, see big_world_metalfx). |
metalfx_jitter | list of number | Signs (x, y) MetalFX reads the jitter with (default [1, 1]); a wrong one shows as a wobble or blur on a still view. |
metalfx_motion | list of number | Signs (x, y) MetalFX reads the motion vectors with (default [1, 1]); a wrong one smears on a pan. |
metalfx_water_depth | boolean | MetalFX gets the depth with the water in it (default on; off: the prepass depth, which leaves the sea out: A/B for the shaky-water report). |
mip_bias | number | Material maps' mip bias on resolved frames, on top of log2(scale) when upscaling (default -0.5). |
moving_filter | number | Upscaling, the filter's width once the history travels filter_travel output pixels a frame (default 0.47). |
scale | number | The live view's render scale per axis (1 native; 0.67 about 45% of the pixels; 0.5 a quarter). |
sequence | object | Render a camera move frame by frame: warmup frames at the first pose, then frames easing from the first pose to the second, each a PNG. |
sharpen | number | Contrast-adaptive sharpening after the resolve (default 0.5; never enters the history). |
still_frames | integer | Frames a screenshot below full size accumulates before it is returned (default 40). |
still_scale | number | Screenshots' render scale (default 1: stills draw at their own size). |
stochastic | boolean | Stochastic shading on frames the temporal resolve averages (one triplanar projection, one tile-break tile and half a lamp's soft-shadow taps a frame, averaged by the history; default on, TTR_STOCHASTIC=0 off). For A/B. |
tone_gather | boolean | Gather this frame's samples by how bright they look as well as by distance (default on). |
write_cutscene
Create or replace a cutscene (an intro, a story beat) in the project's Cutscenes folder: a JSON timeline (format "ttr.cutscene") of keyframed fields, camera shots, timed events and a hand-off to the player. It is checked first; every mistake comes back named. Start it with a cutscene { file "name.cutscene.json" } component (autoplay) or game.playCutscene("name") in a script. The format is in script_reference.
| Argument | Type | What it does |
|---|---|---|
json required | string | The cutscene: {"format": "ttr.cutscene", "version": 1, "name", "length", "tracks", "shots", "events", "hand_off"}. |
name required | string | e.g. "intro" (saved as Cutscenes/intro.cutscene.json) |