Skip to content

The 3D system

How to put geometry, cameras and volumes in the comp — without becoming a 3D application.

Scene3D

The root of a 3D branch — an empty stage other 3D nodes build on.

Merge3D

Combines 3D branches into one scene.

Camera3D

A camera in the scene: position/rotation plus film-back (focal, aperture). Render3D renders through it; the viewport shows its frustum.

Card

A plate standing in 3D: an image on a quad at its own aspect. `file` takes a file path — or the NAME of a 2D node to show that branch live.

GeoPrimitive

A geometry primitive (cube, sphere, plane, cylinder) with transform and colour — stand-ins and simple set pieces.

ReadGeo3D

Reads geometry from a .usda or .obj file into the scene.

Transform3D

Transforms 3D geometry: give it target paths (or leave empty for everything upstream) and TRS.

Axis3D

A 3D null/locator — a parent transform other things can follow.

Light3D

A light in the scene — point, spot, distant (sun), rect, or dome (ambient). Authored as a standard UsdLux prim, so the viewport, Render3D, USD export and the Unreal bridge all read the same light. Zero lights in a scene = the neutral headlight rig.

Project3D

Camera projection - the matte-painting workhorse: throws an image from a Camera3D onto target geometry (a subdivided Card, a mesh). Freeze the camera on one frame to patch; move the render camera and the projection sticks to the surface.

Render3D

Renders a 3D scene into the comp: point `scene`/`camera` at your 3D branch and a Camera3D, and the CG composites over the bg input as a premultiplied element. `aux` adds depth/N/P/id channels.

VDBRead

Reads a .vdb volume cache (smoke, clouds, fire from FX or a bought pack) into the scene as a standard UsdVol prim. Loads off-thread — the box draws dim while streaming, bright when ready. Rendering the volume itself lands with the volume pass; today you get the placed, pickable bounding box.

VolumeShade

The volume LOOK, separate from the read so one look feeds several VDBReads: density scale, scatter colour, anisotropy (forward/back scattering), emission (fire), self-shadow strength. Without one, VDBRead shows neutral grey smoke.

ParticleSystem3D

A deterministic particle system: sparks, dust, rain, embers. Emits from a point, card, sphere or box; gravity, drag and curl-noise turbulence move them; size and colour ramp over each particle's life. The sim is bit-identical every time — the same seed and frame give the same answer whether you played there or scrubbed there, so a re-render is a re-render. Particles are authored as a standard USD Points prim, so they carry velocities and per-particle ids for motion blur and id passes.

PointCloud3D

A solved camera track's 3D point cloud: each tracked feature drawn as a flat dot of constant pixel size, colored by the plate. Scene+ creates one; snap cards and geometry to it, or mesh it with CloudMesh3D.

SplatRead

Reads a gaussian-splat capture (.ply in the 3DGS layout, .splat, or .spz) into the scene: a captured location as millions of soft elliptical blobs, with parallax and view-dependent colour. Loads off-thread — the box draws dim while streaming, then the splats render in the viewport and Render3D, sorted and alpha-blended, depth-composited against cards and geometry. `color_space` declares what the trainer baked (sRGB is usual; a washed-out or crunchy capture is almost always this knob). `budget` caps drawn splats by importance and SAYS so in the HUD. `cluster_tolerance` sets the spatial cluster size used for crypto ids, groups and normal smoothing (0 = automatic). RELIGHT (§4): `relight`=lights turns on the dynamic Light3D loop — `ambient` dims the capture-day lighting baked into the splats and the scene's lights add your own key/fill/rim on top (`light_gain` scales them, `exposure` in stops scales the whole). This is relighting a captured location, which no other compositor does. CLEANUP (§5.4): floater_removal drops the debris clouds every capture has (a statistical outlier pass — the raw scene bounds are usually dominated by them); opacity_floor culls near-transparent splats.

SplatFx

Directs a gaussian-splat capture with a FIELD over its splats (spec §5) — the difference between a viewer and comp. crop: keep or carve a box/sphere region, feathered into a soft opacity falloff (splats feather beautifully). dissolve: fade opacity by a noise/distance/axis field, optionally shrinking splats to nothing (the assemble-the-hologram look). warp: push splats along a field — swirl, drift, wind. shade: tint + gamma the base colour. matte: project a 2D matte (a Roto, a Crucible key, any branch) through a camera and dissolve the splats it covers — the cross-system trick nothing else can do. Dissolve/warp/shade take an optional REGION (box/sphere) so the effect hits one object, not the whole scene. Chain several; each appends to the set. Cleanup (floater removal, opacity floor) lives on the SplatRead node.

Prune3D

Hides or deactivates prims by path — trim the scene without deleting nodes.

Display3D

Overrides how prims draw in the viewport (wireframe, points, bbox…) without touching the render.

Kiln

EXPERIMENTAL — still being built. Kiln: a gas simulation that lives in the 3D scene — smoke, fog, steam, dust — solved on a brick grid inside a box you place, emitted from a shape, lit by the scene's lights and drawn through the project camera like any volume. It is a Scene node: view it in the 3D viewport or render it with Render3D; the density and temperature grids ride the same path a VDB file does, so VolumeShade, the depth holdout and the AOVs all apply. Live it simulates on demand up to 240 frames past the last frame it has; heavier shots bake to VDB with ⚒ Bake and play from disk. Colliders (a placed box or sphere, or any scene mesh — imported, animated, deforming) go in its network and hold the gas back; a sim with one runs on the CPU reference until the GPU twin learns solids, and the panel says so. The CPU solver is the reference; the GPU port is what makes it realtime.

KilnRender

EXPERIMENTAL — still being built. The Kiln gas as a 2D node: Read → KilnRender → Merge. It owns its own sim (the same knobs as Kiln) and renders it through `camera` over the plate wired to `plate`, in the plate's format, the render composited over the plate the way Render3D composites over its bg. `matte` makes a roto or a Crucible matte the emitter; `depth` (or the plate's own depth layer) holds the gas out behind what the plate already has in it; `aov` adds the data layers. Select it and the 3D viewport shows the gas being rendered while the viewer shows the render.

ViewportFX

The 3D viewport as a live 2D source: every viewport render streams into this node, so a chain wired downstream (grade, glow, defocus) recooks live while you navigate. View the chain's tail in a 2D viewer.

Conventions, locked

Right-handed Y-up, metres, −Z camera forward, column-major, reverse-Z 32-bit depth, CCW front faces, scene-linear RGBA16F until the display transform. No code may assume otherwise; a node that did would be wrong everywhere at once.

Getting started

  1. Card for a plate in space, ReadGeo3D for geometry (USD, OBJ, FBX).
  2. Merge3D gathers them into a scene.
  3. Camera3D — or the camera your CameraTracker solved.
  4. Render3D renders the scene back into the 2D graph as ordinary layers, including depth and motion.

What lives here

Simulated smoke, fog and fire (Kiln, or KilnRender straight on a plate; see kiln), volumes (VDBRead + VolumeShade), deterministic particles (ParticleSystem3D), lights (Light3D), projections (Project3D) and gaussian splats — see splats.

The scene is authored as USD, so it exports as plain .usda that Solaris, Maya, Blender and Unreal open unmodified.

Known edges