3D Scene
A DCC Scene, Multi-Camera Capture, and a Keyframed Camera Path — Inside One Node
- image
- video
- images
ComfyTV's 3D Scene stage is the one where you stop and go "okay, this pack is serious." It's a miniature DCC - characters, primitives, lights, and a camera - running as a node body with a live 3D viewport, under the ComfyTV/Input category. The point isn't to replace Blender; it's to put a 3D stage inside your ComfyUI flow so a scene can be captured into images and video that the rest of the graph then consumes. Want a camera orbit shot of a character rigged up from generated assets, feeding straight into your video pipeline? That's the workflow this node exists for.
What it does
You build the scene in the editor (scene_state - the JSON for characters/primitives/lights/camera/output, hidden plumbing set by the viewport). The stage carries its own multi-camera setup with keyframed camera paths, and the width/height inputs (64–4096, default 1024²) set the capture resolution and lock the editor viewport's aspect, so what you frame is what you get. The channel combo picks which render channel a capture/record writes - color, depth, normal, openpose, or id - which is the killer feature: you can capture a depth pass or an OpenPose skeleton of your own 3D scene and feed it into ControlNet-style workflows without hunting for a separate tool. Each of those channel/capture choices is "internal - driven by the node body," which is ComfyTV-speak for "set it in the UI, don't type it."
The outputs are what make it a stage instead of a toy: image (the last single Capture), images (a batch, one per scene camera), and video (the last Record). All three are snapshots the downstream graph consumes without re-rendering the scene.
Should you use it?
Be honest about the trade. This is a real 3D editor - there's a learning curve to placing lights and keying a camera path, and it's not going to compete with dedicated DCCs for serious modeling. But for the ComfyUI-specific job it's aimed at - generate a 3D model, pose it, capture multi-channel renders, feed them to image/video stages - it collapses what would otherwise be five disconnected tools into one node. The depth/openpose/id channels are the reason to reach for it over just screenshotting a viewport.
Install
With the whole pack:
cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV
Restart ComfyUI; find it under ComfyTV → Input. ComfyUI Manager users search "ComfyTV". Desktop/macOS installs: clone into the running instance's custom_nodes (get its absolute path from the startup log; watch for a nested ComfyTV/ComfyTV/ folder) and fully restart the backend. Rendering here is CPU/GPU local math - the pack ships zero Python dependencies - but the 3D content (models, textures) is on you: loaders come from elsewhere in the pack, and generation models download into ComfyUI/models/ per the workflow you run.
Gotchas
- Captured output is empty. The
captured_image/captured_images/captured_videofields only fill when you actually press Capture/Record in the viewport - there's no auto-capture on Run. - Viewport aspect doesn't match your video. Set
width/heightbefore composing the shot; changing it later re-frames everything.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| scene_state | STRING | {} | Internal — Scene3D editor state JSON (characters/primitives/lights/camera/output). |
| channel | COMBO | color | Internal — render channel used by capture/record; driven by the node body. |
| width | INT | 102464–4096 | Internal — capture/record width in pixels; also fixes the editor viewport aspect. |
| height | INT | 102464–4096 | Internal — capture/record height in pixels; also fixes the editor viewport aspect. |
| captured_image | STRING | Internal — /view URL of the last Capture upload. | |
| captured_images | STRING | Internal — JSON images batch of the last Capture (one entry per scene camera). | |
| captured_video | STRING | Internal — /view URL of the last Record upload. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | COMFYTV_IMAGE | — |
| video | COMFYTV_VIDEO | — |
| images | COMFYTV_IMAGES | — |