Nodes/ComfyUI-3D-Human-Pose/3D Cinematic Pose
ComfyUI Node

3D Cinematic Pose

This node shows you the shot before you generate

By wanjin123111·Created 8 months ago·Updated 8 months ago· 0
3D Cinematic Pose
    • image
    • prompt
    horizontal_angle0
    vertical_angle0
    zoom5.0

    The pack title says "3D Human Pose," which is a lie in the useful direction: this isn't pose estimation, it doesn't analyze anything, and it needs no models, keys, or API calls. What ThreeD_Human_Pose (display name "3D Cinematic Pose") actually is, is a WYSIWYG camera-angle controller - a little Three.js mannequin you spin around until the shot looks right, and it writes the prompt for you.

    That's a genuinely useful niche. Camera language is the highest-leverage lever in modern prompting - the KB's prompt-engineering research found that naming an actual physical camera/view is the single biggest win for realism - but "30 degrees to the side" is abstract until you've seen it. This node shows you. Drag, scroll, done.

    How it works

    All the heavy lifting happens in a web viewport, not Python. The node ships a web/ directory with a Three.js scene: a gray blocky mannequin whose front is marked by a red nose, back by a blue head, and whose feet are split green (front) / yellow (heels) so you never lose orientation even looking straight down from overhead. Left-drag orbits the camera, scroll zooms.

    The live prompt is computed in JavaScript so you see it update as you drag - then, on the Python side, process() recomputes the same string via get_calc_prompt() and hands it out. The "snapshot" you get as an IMAGE is the frontend's actual canvas, serialized as a base64 data URL into a hidden widget and decoded back into a tensor. That's the whole trick, and it means the node is dependency-free on the Python side: no requirements.txt, no model files, just torch/numpy/PIL that ComfyUI already has.

    The inputs and outputs that matter

    You almost never touch the inputs directly, because the viewport syncs both ways - drag the mannequin and the widgets follow, or type values and the model moves. But they're there if you want precision or keyframe-like control:

    • horizontal_angle (INT, -3600 to 3600) - degrees around the subject. The wide range means you can spin several full turns.
    • vertical_angle (INT, -90 to 90) - up/down pitch, from worm's-eye to overhead.
    • zoom (FLOAT, 0.5 to 100) - distance, mapped to shot size.

    Two outputs, both worth wiring:

    • image (IMAGE) - the current viewport screenshot. It's a stylized gray mannequin, not a clean pose skeleton, so it works best as a loose ControlNet condition or an IPAdapter/Reference reference rather than a strict pose map. Keep the control weight modest.
    • prompt (STRING) - the generated cinematography phrase, e.g. front-right three-quarter view, high angle shot, close-up. Wire it straight into a CLIP Text Encode.

    The prompt logic itself is solid: an 8-point compass that distinguishes a true side profile from a three-quarter view (that "paper-flat side" vs "shows depth" split is exactly what trips people up), vertical thresholds that graduate from overhead shot, bird's-eye view (>70°) down to worm's-eye view (<-50°), and distance bands from extreme close-up to wide shot. Flux and SDXL both read these terms well.

    Installation

    ComfyUI Manager is the easy route - search "ComfyUI-3D-Human-Pose" or "3D Cinematic Pose" and install, then restart. Or by hand:

    cd ComfyUI/custom_nodes/
    git clone https://github.com/wanjin123111/ComfyUI-3D-Human-Pose.git
    

    Restart ComfyUI and right-click → 3D Pose → 3D Cinematic Pose. There are no extra dependencies to install and nothing to download.

    Where people get burned

    Two gotchas, both real:

    Black output image. The author coded for this: if the base64 snapshot fails to reach the backend, process() returns a default black 512×512 tensor. If your image output comes out black, the frontend→backend handoff broke - usually stale browser cache on the old JS, so hard-refresh your browser tab. If you're in a workflow that runs headless or the browser tab was never opened, the snapshot path can't run at all.

    It needs internet the first time. Three.js is loaded from a CDN in the viewport. First open of the node may stall or show nothing if you're offline or a CDN is blocked. After it's cached it's fine, but this is why "0 downloads, works offline" is not quite the story.

    For a beginner it's a low-stakes, high-education node: you'll internalize what a three-quarter view actually is faster than any vocabulary list will teach you. Just don't expect it to hold your subject's pose - that's ControlNet and OpenPose's job.

    Category3D Pose

    Inputs (3)

    NameTypeDefaultDescription
    horizontal_angleINT0-3600–3600
    vertical_angleINT0-90–90
    zoomFLOAT5.00.5–100

    Outputs (2)

    NameTypeDescription
    imageIMAGE
    promptSTRING