Nodes/ComfyTV/3D Scene
ComfyUI Node

3D Scene

A DCC Scene, Multi-Camera Capture, and a Keyframed Camera Path — Inside One Node

By jtydhr88·Created 3 months ago·Updated about 15 hours ago· 725
3D Scene
    • image
    • video
    • images
    project_id
    parent_output_id0
    scene_state{}
    channelcolor
    width1024
    height1024
    captured_image
    captured_images
    captured_video

    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_video fields 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/height before composing the shot; changing it later re-frames everything.
    CategoryComfyTV/Input

    Inputs (9)

    NameTypeDefaultDescription
    project_idSTRINGInternal — populated by the projectStore on the frontend.
    parent_output_idINT00–2147483647Internal — lineage parent set by spawn handlers on the frontend.
    scene_stateSTRING{}Internal — Scene3D editor state JSON (characters/primitives/lights/camera/output).
    channelCOMBOcolorInternal — render channel used by capture/record; driven by the node body.
    widthINT102464–4096Internal — capture/record width in pixels; also fixes the editor viewport aspect.
    heightINT102464–4096Internal — capture/record height in pixels; also fixes the editor viewport aspect.
    captured_imageSTRINGInternal — /view URL of the last Capture upload.
    captured_imagesSTRINGInternal — JSON images batch of the last Capture (one entry per scene camera).
    captured_videoSTRINGInternal — /view URL of the last Record upload.

    Outputs (3)

    NameTypeDescription
    imageCOMFYTV_IMAGE
    videoCOMFYTV_VIDEO
    imagesCOMFYTV_IMAGES