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's reconstructed position as a small marker. Scene+ creates one; snap cards and geometry to it.
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.
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
- Card for a plate in space, ReadGeo3D for geometry (USD, OBJ, FBX).
- Merge3D gathers them into a scene.
- Camera3D — or the camera your CameraTracker solved.
- Render3D renders the scene back into the 2D graph as ordinary layers, including depth and motion.
What lives here
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.