Importing media

Images, video, audio, 3D models and splats arrive on the graph as live source nodes.

Imported media becomes a source node and flows downstream like any other value: sample its pixels, deform a model, drive a parameter from audio, render it in a scene. Decoding and GPU upload run off the cook thread.

Drag and drop

Drag a file from Finder onto the canvas and you get the source node matching its type with the file already attached. Drop several at once and they arrive as a grid, alphabetically ordered and all selected.

Dragging from the The asset browser is not the same move: it places an empty node of the right kind and leaves the path unset. Dropping onto a node's input socket does nothing in either case.

Imported files are referenced, not copied. A record points at the original on disk, so an import is instant and costs almost no space. The trade-off is that a project stores that path, so moving or renaming the original breaks the link and the node's path has to be reset. See The asset library for what the companion .ntmeta file does and does not cover.

Images

The image source node (Image) reads PNG, JPEG, WebP, TIFF, EXR, Radiance HDR, TGA and BMP. Colour space follows the format: EXR and HDR are treated as scene-referred linear, everything else as sRGB. More in Colour management.

An image arrives as a Rasters (images), readable into the graph as well as renderable. Sample its pixels as colour, brightness, alpha or a single channel to drive points, fields or parameters.

ParameterTypeDefaultWhat it does
file_pathString"String::new()"Path to image file
interpolationString"Bilinear"Interpolation when sampling: Nearest (pixelated) or Bilinear (smooth). One of: Nearest, Bilinear.
wrap_modeString"Clamp"How to handle coordinates outside image bounds. One of: Clamp, Repeat, Mirror.
opacityNumber1Layer opacity for compositing
positionVec3(0, 0, 0)Translation (X, Y, Z)
rotationVec3(0, 0, 0)Rotation in degrees (X, Y, Z)
scaleVec3(1, 1, 1)Scale (X, Y, Z)
anchorVec3(0, 0, 0)Pivot offset (X, Y, Z) — rotation/scale orbit this point

Video

Point the video source node (Video) at a clip and scrub or play it in time with the graph, or set frame_mode to Custom and drive custom_frame yourself. speed runs it faster, slower or backwards, and loop_mode covers Loop, Once, Ping Pong, Hold First and Hold Last. Frames are decoded on demand in the background.

The footage does not have to come from a file. Wire a frame sequence into sequence, from Capture or Stack, and the node plays that instead: a wired sequence overrides the path, and the same speed, loop_mode and start_offset controls scrub and loop it exactly as they do a clip. reload re-reads the file on a rising edge, for footage being written while the project is open.

HAP .mov files decode straight to compressed blocks on the graphics card, which suits VJ-style walls of video. Clips are too large to embed, so video is always referenced and the original file has to stay reachable.

ParameterTypeDefaultWhat it does
file_pathString""Path to video file
frame_modeString"Timeline"Use timeline frame or custom frame number. One of: Timeline, Custom.
custom_frameNumber0Frame number to display
speedNumber1Playback speed (negative for reverse)
loop_modeString"Loop"How to handle video boundaries. One of: Loop, Once, Ping Pong, Hold First, Hold Last.
start_offsetNumber0Frame offset from start
interpolationString"Bilinear"Interpolation when sampling: Nearest (pixelated) or Bilinear (smooth). One of: Nearest, Bilinear.
wrap_modeString"Clamp"How to handle coordinates outside frame bounds. One of: Clamp, Repeat, Mirror.
opacityNumber1Layer opacity for compositing
sequenceFrame SequenceConnect a RasterArray to play back as a sequence (overrides file path)
reloadBoolean or NumberRising edge (0→1) drops the open decoder and re-reads the file from disk
positionVec3(0, 0, 0)Translation (X, Y, Z)
rotationVec3(0, 0, 0)Rotation in degrees (X, Y, Z)
scaleVec3(1, 1, 1)Scale (X, Y, Z)
anchorVec3(0, 0, 0)Pivot offset (X, Y, Z) — rotation/scale orbit this point

Audio

WAV, MP3, OGG, FLAC and AIFF import as audio sources. Audio is another signal on the graph: analyse its level or frequency content to drive movement, colour or anything else. See Numbers, signals & audio for how audio flows alongside numbers and signals.

Trim the clip by dragging the in and out handles on the node's scrub bar, which is the same thing as setting start and end. A rising edge on trigger restarts playback from the trim start. One playhead now serves both ends of the node: what leaves waveform for the rest of the graph is the audio the speakers received, so a trigger pulse, a changed speed and the loop mode reach an analysis chain and the sound together instead of drifting apart.

The desktop app plays audio. The Web Player has no audio output, so a graph that depends on audible sound produces none when exported to the web. See Web export.

3D models and splats

Meshes import from OBJ, glTF, GLB, FBX and STL. Splats import from .splat and .spz, and from PLY: a dropped .ply is read as a splat cloud rather than a mesh, so swap the node by hand if you meant a polygon mesh. A model arrives as Geometry (meshes) to transform, deform, scatter onto or feed into a simulation. Gaussian splats arrive as points you can move, render and dissolve.

A file's own scene tree comes with it. Turn preserve_hierarchy on and the model node's hierarchy output lists every scene node as a row carrying its name, parent, rest pose and local transform, and each imported point records which node placed it. Off, those transforms are baked into the geometry and the tree is gone.

Animation comes with it too. clip_names reports what the file carries, and naming one in clip plays it: time_mode runs the clip against the timeline, or set it to Manual and drive time yourself from a keyframed curve or a retimed clock, with loop_mode covering Loop, Hold and Ping-Pong. Choosing a clip keeps the hierarchy whether or not you asked for it, because a transform baked into vertices has nothing left to animate. Leave clip empty and you import the rest pose.

An imported rig is a rig rather than a frozen mesh. A skinned glTF or FBX brings its skeleton and its per-vertex bone weights in on the same rows an authored Skeleton emits, so Deform in Bones mode skins the mesh to it and Pose moves the joints, with your own edits layering over the file's animation rather than replacing it. Blend shapes arrive as morph targets whose weights the clip drives. FBX and glTF fill the same fields, so the same character exported to either format behaves the same way. To turn one imported channel into an editable curve, pull the lane out with Split / Combine and Select and record it with Bake Keyframes.

Splats do more than load from a file. Point the splat node's path at a folder of per-frame files and it plays as a moving capture, and wiring a mesh, a volume or a point cloud into its source makes splats out of that instead. Both routes, and the trimming controls that keep a heavy capture affordable, are covered in Gaussian splats.

Model import runs in a web export as well, reading the model bytes the bundle carries rather than a path, and giving the same geometry, hierarchy and clips a desktop cook gives. FBX is the exception: the browser bundle ships without that parser, so export FBX work as glTF or GLB if it has to run on the web.

For rendering imported geometry and splats in a scene, see Points and the The render node.

When something's missing

A file that cannot be found does not stop the graph loading. A missing image shows a magenta-and-black checker placeholder and is listed in the Missing Assets panel, where Retry re-imports from the same path and Reveal opens its folder. There is no relink button. More in The asset library and When something breaks.

See also