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.

ArgumentTypeWhat it does
clipnumberHistory clip width in standard deviations of the pixel's neighbourhood (default 1.25; lower ghosts less, flickers more).
glass_depthbooleanGlass 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_blendnumberLeast share of each new frame in a settled history (default 0.05; higher reacts faster, smooths less).
history_filtercatmull_rom / lanczosThe history's resampling filter: catmull_rom (default, 5 taps) or lanczos (36 taps, sharper).
history_sharpennumberSharpening 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_spreadnumberHow far the jitter wanders inside a pixel (default 0.5; 1 the whole pixel: softer edges, calmer fine texture).
map_supersamplingbooleanMaterial maps also supersampled (four lookups a pixel) on frames the resolve averages (default off: the jitter does it over frames).
mip_biasnumberMaterial maps' mip bias while the resolve averages them (default -0.5; lower is sharper and needs the history to stay calm).
moving_blendnumberLeast 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_resolvebooleanThe 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_strengthnumberHow strongly the perceptual resolve weighs samples by their look (default 1; lower keeps sub-pixel sky gaps and glints brighter).
sharpennumberContrast-adaptive sharpening after the temporal resolve (default 0.5; the scene's camera_look sharpen adds to it).
still_render_scalenumberScreenshots 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).
temporalbooleanTemporal anti-aliasing on or off (session only).
thin_geometrybooleanThin 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_sizenumberTrees 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_sizenumberTrees 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_outlinesbooleanFar 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.

ArgumentTypeWhat it does
bodystringCamera body (sensor) name; default the kit's own.
focalnumberFocal length, mm (default 50, or the kit's nearest).
focus_distancenumberFocus, metres (default infinity).
kitstringLens kit name.
t_stopnumberIris 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.

ArgumentTypeWhat it does
actionlist / apply / make / matchlist (default), apply a LUT, make one from wheels, or match a reference picture.
applybooleanmake/match: put the new LUT on the scene's camera_look (default true).
basestringmake: a look to start from (built-in or .cube), the wheels on top.
contrastnumbermake: contrast about mid grey (1 none).
gainlist of numbermake: highlights, RGB around 0 (+ brighter).
gammalist of numbermake: midtones, RGB around 0 (+ brighter).
highlights_tintlist of numbermake: a colour added to the highlights, e.g. [0.03, 0.01, -0.02].
liftlist of numbermake: shadows offset, RGB around 0 (e.g. [-0.02, 0, 0.03] cools them).
lutstringapply: a built-in look or a .cube in Assets ("LUTs/night"); empty removes the grade.
match_exposurebooleanmatch: also take the reference's brightness (default false: the scene keeps its exposure, takes the reference's contrast shape and colour).
namestringmake/match: the new LUT's name (letters, digits, _ and -): Assets/LUTs/<name>.cube.
referencestringmatch: the picture to look like, a path in Assets ("References/park-1028/mgref_gate_1.jpg") or absolute.
saturationnumbermake: colour amount (1 none, 0 grey).
shadows_tintlist of numbermake: a colour added to the shadows (split tone), e.g. [-0.02, 0.01, 0.03].
strengthnumberapply/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.

ArgumentTypeWhat it does
entitystringEntity name (e.g. "Tower_B") or id (e.g. "#7").
fovnumberVertical field of view in degrees (0.05...175). Give fov or lens, not both. Omitted: keep the current camera lens.
lensnumberLens 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_atlist of number
override_followbooleanOne deliberate camera move even when the person turned Follow AI off; leaves Follow AI off. Use only when asked to help recover the view.
positionlist 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.

ArgumentTypeWhat it does
cameraview / playerview (default): what the viewport shows now (the game camera while playing). player: through the player's own eyes.
look_atlist of number
positionlist 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.

ArgumentTypeWhat it does
arriveemerge / drop / stand
boss requiredstringThe boss object.
dooranyOptional: the arena door (sent "seal").
fromanyThe hero's stand-in (default the player).
musicstringThe boss theme's sound (optional).
name requiredstring
objectivestring
roarstringIts roar clip (default Roar).
substring
title requiredstring

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.

ArgumentTypeWhat it does
dooranyOptional: the entrance to push in on (sent "open").
fromanyThe hero's stand-in (default the player).
name requiredstring
objectivestring
rumblestringThe door's sound (default prop:stone.scrape).
substring
subject requiredanyThe place revealed: an object's name or [x, y, z].
swellstringThe music swell under the title (default Magic/hr_reveal_swell).
title requiredstring
wakelist of stringOptional: 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).

ArgumentTypeWhat it does
codech264 / prores4444 / prores422hqThe video's codec: H.264 .mp4 (default), or ProRes 4444 / 422 HQ .mov for editing (the sound stays beside it as audio.wav).
exrbooleanMovie mode: also each frame's scene-linear picture as OpenEXR beside its PNG (before the post: no exposure, bloom, lens distortion or grade).
focus_checkbooleanTint what's sharp green, in front of focus magenta, behind blue (checking focus; not in movie mode).
fpsnumber
fromnumberStory seconds from the start.
heightinteger
moviebooleanMovie mode: each frame many whole renders across the open shutter, the iris and the pixel, averaged before the post. Slower.
movie_samplesintegerRenders per movie frame (default 64; 16 a quick look, 256 a final).
name requiredstringThe sequence's name (Sequences/<name>.sequence.json).
samplesintegerLens integration samples per pixel; 8 editor, default 24 offline, 48-64 high quality.
timeslist of numberStory times to render stills at, instead of every frame.
tonumberStory seconds from the start.
videobooleanAlso write Renders/<name>.mp4 (H.264, every frame at fps).
widthinteger

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.

ArgumentTypeWhat it does
camerasequence / editor
eyelist of number
focus_checkbooleanA focus puller's monitor: sharp green, in front of focus magenta, behind blue.
heightinteger
looklist of number
name requiredstringThe sequence's name (Sequences/<name>.sequence.json).
pathsboolean
showboolean
tnumberStory seconds from the start.
widthinteger

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.

ArgumentTypeWhat it does
big_world_metalfxbooleanBig 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_scalenumberA big world's live render scale per axis under MetalFX (default 0.67).
captureobjectRender a converged still at a scale: the history starts over, then frames from the same camera at a frozen time.
debug_viewnone / confidence / rejection / motion / jitter / flickerDraw the resolve's decisions over the viewport (and stills).
filternumberUpscaling, 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_travelnumberHistory travel (output pixels a frame) at which the moving filter is fully used (default 2).
firefliesbooleanHold a lone sample brighter than all its neighbours to their level before it enters the history (default on).
flicker_holdnumberA flickering pixel's history may hold this many times more frames (default 2).
flicker_reachnumberDeviations past the mean the clip's luma range reaches (default 1.5).
flicker_relaxnumberStill-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_travelnumberHistory travel (output px a frame) by which the statistics are dropped (default 0.25).
flicker_windownumberThe flicker statistics' window: share a new frame moves them by (default 0.0625).
full_motionbooleanMetalFX 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_blendnumberLeast share of each new frame in a settled history (default 0.03).
history_clampnumberHistory clip width in standard deviations of the current neighbourhood (default 1; lower ghosts less and flickers more).
jitter_phasesintegerPositions in the jitter cycle (0 automatic: 16, or about 8 per output pixel a scene pixel covers).
jitter_spreadnumberUpscaling, how much of each scene pixel the jitter visits (default 1).
metalfxbooleanBelow 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_jitterlist of numberSigns (x, y) MetalFX reads the jitter with (default [1, 1]); a wrong one shows as a wobble or blur on a still view.
metalfx_motionlist of numberSigns (x, y) MetalFX reads the motion vectors with (default [1, 1]); a wrong one smears on a pan.
metalfx_water_depthbooleanMetalFX 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_biasnumberMaterial maps' mip bias on resolved frames, on top of log2(scale) when upscaling (default -0.5).
moving_filternumberUpscaling, the filter's width once the history travels filter_travel output pixels a frame (default 0.47).
scalenumberThe live view's render scale per axis (1 native; 0.67 about 45% of the pixels; 0.5 a quarter).
sequenceobjectRender 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.
sharpennumberContrast-adaptive sharpening after the resolve (default 0.5; never enters the history).
still_framesintegerFrames a screenshot below full size accumulates before it is returned (default 40).
still_scalenumberScreenshots' render scale (default 1: stills draw at their own size).
stochasticbooleanStochastic 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_gatherbooleanGather 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.

ArgumentTypeWhat it does
json requiredstringThe cutscene: {"format": "ttr.cutscene", "version": 1, "name", "length", "tracks", "shots", "events", "hand_off"}.
name requiredstringe.g. "intro" (saved as Cutscenes/intro.cutscene.json)
Arcwright Beta 2 (0.4.0) · generated from the engine source (25e375c86)Something wrong or missing? Tell us
Download Arcwright free