ComfyUI Node

Directing

Record real camera cuts against your 3D set and hand the video to Seedance or MiniMax

By arturitu·Created 2 months ago·Updated 19 days ago· 45
Directing
  • acting
  • Captured Video
directing_data

Directing is where the whole Staging ➔ Acting ➔ Directing pipeline pays out. Staging built the set, Acting recorded a real motion take on it - now this node points cameras at that performance, lets you cut between them on a timeline, and records the result as an actual video file. What comes out of the Captured Video socket isn't a latent or a mask; it's a genuine rendered 720p clip of your three.js scene, ready to plug straight into a reference-to-video model like Seedance 2.5, MiniMax H3 Reference-to-Video, or a Wan VACE-style setup as the motion/structure reference.

If that sounds like it should be the hardest node in the pack to understand, the pleasant surprise is it's the most direct. You already know what a camera is. This node is basically a tiny virtual film set: pick a rig, place cuts, hit render.

How it works

This is the one node in the pack where the mechanism is genuinely worth understanding, because it explains the node's quirks. Everything else in the pack moves state around JSON; Directing records. When you queue the graph, the backend sends a message to the browser and waits (up to 40 seconds). The browser frontend - the same Vue/three.js widget you've been playing in - scrubs the acting timeline, plays your camera cuts at 30fps, and records the WebGL canvas with the browser's MediaRecorder. The resulting WebM is uploaded to ComfyUI's server, converted to an H.264 MP4 (yuv420p, QuickTime-friendly) if ffmpeg is available, saved into your ComfyUI input/ folder as 3d_directing_record_<nodeid>.mp4, and finally handed back as a VIDEO output.

That's a genuinely unusual architecture for a ComfyUI node: the video is rendered client-side in your browser tab, not by a Python sampler. The backend coordinates, the browser does the actual filming.

Camera tools inside the widget include third-person, first-person, tracking-side, and an auto-framing master-wide mode, plus a Spring Arm (an anti-collision rig that keeps the camera from clipping into walls - which is why Directing needs the real stage geometry threaded through the acting data, not just a point moving in space).

The inputs and outputs

  • acting (optional *) - connect your Acting node's Acting Data here. This is not optional in practice: Directing refuses to run without recorded motion.
  • directing_data (hidden string) - your cut timeline, managed internally by the widget. You edit it visually, not by hand.
  • Captured Video - the VIDEO output. Wire it into a reference-to-video model's video input, or into a Save Video node. Note the workflow convention: some of these model nodes have licensing/geofencing quirks of their own (MiniMax H3's community license, for one) - that's a property of the model you're feeding, not of this node.

How to install it

Same story as the rest of the pack: ComfyUI Manager → search "Scene Camera Action", or

cd ComfyUI/custom_nodes
git clone https://github.com/arturitu/ComfyUI-scene-camera-action.git
pip install -r ComfyUI-scene-camera-action/requirements.txt

Restart ComfyUI, and it's under the scene-camera-action category. One extra system dependency: ffmpeg on the PATH so the WebM gets converted to MP4. Without it you'll still get video - just as .webm, which not every downstream video node is happy with.

Common issues

The README's own FAQ covers the #1 failure: if Directing errors with "Directing canvas is disabled. Connect an Acting node and record motion first," you didn't record a take in Acting. Directing needs an actual trajectory, not a connected-but-empty acting node.

The bigger one is architectural and easy to trip over: because recording happens in the browser, the workflow must be queued from an open browser tab with the widget alive. Queue a workflow via the API or from a tab where the graph isn't visible/active and nothing responds within the 40-second window - you'll get the "No video file was generated" error. Keep the tab on the workflow, and don't background it while it renders. Also note that each Directing node overwrites its own 3d_directing_record_<nodeid>.mp4 on rerun, so save/clip anything you love before changing the graph.

Camera cuts aren't AI magic - but that's exactly why they're reliable. Record the shot you want, and let the generative model fill in the pixels.

Categoryscene-camera-action

Inputs (2)

NameTypeDefaultDescription
actingopt*Acting motion connection from an Acting node
directing_dataoptSTRINGSerialized camera cut timeline (managed internally)

Outputs (1)

NameTypeDescription
Captured VideoVIDEO