Nodes/comfyui_fk_server/FK_3D姿态编辑器(3D Openpose Editor)
ComfyUI Node

FK_3D姿态编辑器(3D Openpose Editor)

Pose a 3D mannequin in your browser and get four ControlNet maps out

By juehackr·Created 2 years ago·Updated 7 months ago· 583
FK_3D姿态编辑器(3D Openpose Editor)
    • OpenPose
    • Depth
    • Normal
    • Canny
    • Width
    • Height
    pose
    depth
    normal
    canny

    FK_3D姿态编辑器(3D Openpose Editor) is the juehackr/comfyui_fk_server pack's answer to the classic 3D Openpose Editor web app - the one everyone used to block out SD 1.5 poses by dragging a 3D humanoid around. This is that idea embedded as a ComfyUI node: you pose a mannequin in your browser, and the node hands you four ControlNet condition maps from the same scene. Pose, depth, normal, and canny, all perfectly aligned because they're rendered from one 3D setup. If you do any character work where body position matters, that single feature saves you a pile of preprocessing fiddling.

    How it works

    The browser editor saves its renders as PNGs into ComfyUI's temp directory under a 3dposeeditor subfolder. The four inputs - pose, depth, normal, canny - are STRINGs that hold the filenames of those saved renders. You don't type them; the editor fills them in as you work. When the node executes it loads each PNG, converts it to RGB, and returns it as an IMAGE tensor.

    The neat part is how it stays live. The node implements IS_CHANGED by hashing the pose file, so the moment you adjust the pose in the editor and the file changes, ComfyUI treats the node as dirty and re-runs everything downstream. You edit the pose and the graph follows without you hunting for the Queue button. It's the closest thing to "drag the mannequin, watch it generate" you'll get in a node graph.

    Inputs and outputs that matter

    You'll barely touch the inputs - they're bookkeeping. The outputs are where it pays off:

    • OpenPose, Depth, Normal, Canny (IMAGE) - wire each into a ControlNet Apply node for the matching control type. From the ControlNet playbook: OpenPose for body pose, depth for spatial arrangement, normals for surface orientation (handy with relighting), canny for clean edges. Four conditions, one pose.
    • Width, Height (INT) - the editor canvas size. Handy for syncing your latent or KSampler resolution to the pose canvas so nothing rescales weirdly downstream.

    Install

    Standard pack install - same for every node in this pack:

    cd ComfyUI/custom_nodes
    git clone https://github.com/juehackr/comfyui_fk_server.git
    pip install -r ComfyUI/custom_nodes/comfyui_fk_server/requirements.txt
    

    Restart ComfyUI (or install via ComfyUI Manager by searching the pack title). Dependencies are just PyCryptodome and pybase64, no model downloads. This node does need the pack's Node.js side server running, since the pose editor is a web app - the pack auto-runs npm install in its server/ folder on first launch, but Node itself has to be on the machine.

    Troubleshooting

    • "请先进行姿态编辑" (please edit pose first). The most common error. It means no pose render exists in 3dposeeditor yet - open the node's UI and actually move a joint before queuing.
    • My edits aren't triggering a re-run. The hash-based change detection only fires when the graph is connected downstream of this node. If nothing's wired to the outputs, there's nothing to re-run.
    • The editor UI won't open. The Node.js side server isn't up. Check the ComfyUI terminal for FKServer: lines; a missing Node install is the usual culprit.
    • Poses vanished. Clearing ComfyUI's temp directory wipes the saved renders. Re-pose and move on.

    Fair warning for a pack like this: parts of it are encrypted, though this node's logic in tietu_node.py is plain readable Python. Still, install it knowing you're trusting the author - a disposable venv is cheap insurance.

    CategoryFK_Nodes

    Inputs (4)

    NameTypeDefaultDescription
    poseSTRING
    depthSTRING
    normalSTRING
    cannySTRING

    Outputs (6)

    NameTypeDescription
    OpenPoseIMAGE
    DepthIMAGE
    NormalIMAGE
    CannyIMAGE
    WidthINT
    HeightINT