Nodes/comfyui-anima-toolkit/TK 可动素体相机
ComfyUI Node

TK 可动素体相机

Pose a dummy, get camera tags instead of guessing them

By Ararararararaki·Created 3 months ago·Updated about 16 hours ago· 10
TK 可动素体相机
    • 相机提示词
    • camera_meta
    pose_presetA-Pose
    pose{"root":{"x":0.0,"y":0.0,"z":0.0},"waist":{"x":0.0,"y":0.0,"z":0.0},"chest":{"x":0.0,"y":0.0,"z":0.0},"neck":{"x":0.0,"y":0.0,"z":0.0},"head":{"x":0.0,"y":0.0,"z":0.0},"left_shoulder":{"x":0.0,"y":0.0,"z":-28.0},"left_elbow":{"x":0.0,"y":0.0,"z":0.0},"right_shoulder":{"x":0.0,"y":0.0,"z":28.0},"right_elbow":{"x":0.0,"y":0.0,"z":0.0},"left_hip":{"x":0.0,"y":0.0,"z":0.0},"left_knee":{"x":0.0,"y":0.0,"z":0.0},"right_hip":{"x":0.0,"y":0.0,"z":0.0},"right_knee":{"x":0.0,"y":0.0,"z":0.0}}
    preset自定义
    pos_x0.00
    pos_y0.00
    pos_z0.00
    roll0.00
    fov50
    extra_tags
    config{"weight_min":0.1,"weight_max":10.0,"no_weight":false,"no_weight_threshold":0.5,"azimuth":{"enabled":true,"weight":10.0,"deadzone_ratio":0.2,"directions":{"front":{"tag":"from front","enabled":true},"back":{"tag":"from behind","enabled":true},"left":{"tag":"from right","enabled":true},"right":{"tag":"from left","enabled":true}}},"elevation":{"enabled":true,"extra":10.0,"categories":{"bird":{"tag":"directly above, from above, aerial view,","enabled":true},"high":{"tag":"high angle, from above","enabled":true},"eye":{"tag":"eye-level","enabled":true},"low":{"tag":"low angle, from below,","enabled":true},"worm":{"tag":"directly below","enabled":true}},"weight":11.0},"distance":{"enabled":true,"extra":0.0,"categories":{"ecu":{"tag":"extreme close-up","enabled":true},"cu":{"tag":"close-up","enabled":true},"medium":{"tag":"medium shot","enabled":true},"full":{"tag":"full body","enabled":true},"wide":{"tag":"wide shot","enabled":true}},"weight":1.0,"follow_slider":true,"category_order":["wide","medium","cu","full","ecu"]},"tilt":{"enabled":true,"deadzone":0.15,"extra":0.0,"dutch_tag":"dutch angle","weight":1.0},"extra_master":1.0,"wheel_step":0.0003,"extras":{"lens":{"enabled":false,"value":"85mm lens"},"dof":{"enabled":false,"value":"shallow depth of field","weight":1.3},"movement":{"enabled":false,"value":"handheld camera"},"composition":{"enabled":false,"value":"rule of thirds"},"style":{"enabled":false,"value":"cinematic"}}}

    Camera control by prompt is guesswork with a vocabulary list. Is the shot in your head from below, looking up, low angle or from below, from side, low angle? Finding out costs a sampling run.

    TK 可动素体相机 replaces the guessing with a viewport. There's a low-poly mannequin in the node, you orbit a virtual camera around it, and the node emits the camera tags for the shot you just framed. It's the camera node in TK Toolkit (anima-toolkit by 时运tk).

    What's in the viewport

    The body is procedural - low-poly spheres, cylinders and blocks assembled in code. There is no GLB, no texture, no downloaded asset, and no model file. The Three.js runtime is bundled into the pack (web/js/three.module.js), so nothing is fetched from a CDN either, which matters if you're behind a filter or offline.

    The skeleton is basic FK: root, waist, chest, neck and head down the spine, plus shoulders, elbows, hips and knees. Hands and feet are drawn as outlines only, and that's a deliberate simplification - the pack's point is that this is an angle and pose reference, not an anatomy tool. Drag a joint to rotate it in X/Y, or edit XYZ numerically. There are A-Pose and T-Pose buttons, a reset, and save/restore for poses in browser storage. It renders a frame on change and then idles, so it isn't burning GPU while you think.

    Inputs

    • pose_preset - A-Pose, T-Pose, 自定义. Picking a preset seeds the pose; once you drag a joint, you're in custom.
    • pose - the pose as a JSON string, one entry per joint with x/y/z degrees. This is what save/restore and workflow persistence actually carry.
    • preset - 18 camera presets: 正面, 背面, 左侧, 右侧, 俯视, 仰视, 正上方俯视, 正下方仰视, 特写, 近景, 中景 and friends, plus 自定义. Picking one writes the position values; the default is 自定义.
    • pos_x / pos_y / pos_z - the camera position, each −1 to 1 in 0.01 steps. These are the three axes the prompt algorithm reads: horizontal angle, elevation, distance.
    • roll - −1 to 1. This is the tilt/dutch angle.
    • fov - 20 to 100, default 50.
    • extra_tags - your own additions, e.g. shallow depth of field when you don't want to enable the config's DoF block.
    • config - a JSON blob of weights and enable flags. Left alone, it's the sane default.

    Outputs

    相机提示词 (STRING) is the camera tag string. It's built by the pack's CameraControlCore, the same algorithm the retired TK 相机控制 node used, which in turn is aligned with the BSK CameraControlNode's approach: azimuth and elevation produce directional tags with weights, distance resolves to one of five bands (远景/中景/近景/全身/特写) with a continuous weight inside the band, and tilt emits a dutch-angle tag past a deadzone. The config exposes all of that - the azimuth, elevation, distance and tilt sections each have enabled and weight, the distance band has follow_slider, and there are optional extras for lens, depth of field, camera movement and composition.

    camera_meta (STRING) is a JSON record - yaw, pitch, distance, roll, FOV, the normalized camera parameters and the full pose. Wire it into a filename, a note node, or any node that parses JSON, and you have the shot logged with the image.

    The one thing to know before you install it

    This node replaced TK 相机控制, which was removed in the pack's 2.10.0. Open an old workflow that used it and you'll see "missing node type" - that's expected, not a broken install. Delete the dead node and drop this one in: the camera parameters and the two output ports map one-to-one, and the preset maths is the same core, so nothing needs re-tuning.

    Install

    cd ComfyUI/custom_nodes
    git clone https://github.com/Ararararararaki/comfyui-anima-toolkit
    # restart ComfyUI
    

    ComfyUI Manager: search TK Toolkit (anima-toolkit). Required packages are aiohttp and requests - no Three.js install, no model download. It lives under TK/camera.

    Gotchas

    Weights, on Anima, are mostly ceremony. The node emits weighted tags like (low angle:1.2). On Anima's Qwen3 encoder, prompt weighting is disabled - the parentheses travel as punctuation inside the instruction. The config has no_weight and no_weight_threshold keys; turn no_weight on and tags come out plain. If your camera tags seem to do nothing, try that first.

    Distance bands are coarse on purpose. Five bands, not a continuum. If you want "just a little closer", you're nudging pos_z and re-reading the preview, not dialling a fine value.

    The preview is not your render. You're framing a dummy; the actual composition depends on your subject count and where the model puts them. It gets the angle right, not the crop.

    CategoryTK/camera

    Inputs (10)

    NameTypeDefaultDescription
    pose_presetCOMBOA-Pose3 options: A-Pose, T-Pose, 自定义
    poseSTRING{"root":{"x":0.0,"y":0.0,"z":0.0},"waist":{"x":0.0,"y":0.0,"z":0.0},"chest":{"x":0.0,"y":0.0,"z":0.0},"neck":{"x":0.0,"y":0.0,"z":0.0},"head":{"x":0.0,"y":0.0,"z":0.0},"left_shoulder":{"x":0.0,"y":0.0,"z":-28.0},"left_elbow":{"x":0.0,"y":0.0,"z":0.0},"right_shoulder":{"x":0.0,"y":0.0,"z":28.0},"right_elbow":{"x":0.0,"y":0.0,"z":0.0},"left_hip":{"x":0.0,"y":0.0,"z":0.0},"left_knee":{"x":0.0,"y":0.0,"z":0.0},"right_hip":{"x":0.0,"y":0.0,"z":0.0},"right_knee":{"x":0.0,"y":0.0,"z":0.0}}
    presetCOMBO自定义18 options: 自定义, 正面, 背面, 左侧, 右侧, 正上方俯视, +12
    pos_xFLOAT0.00-1–1
    pos_yFLOAT0.00-1–1
    pos_zFLOAT0.00-1–1
    rollFLOAT0.00-1–1
    fovFLOAT5020–100
    extra_tagsSTRING
    configSTRING{"weight_min":0.1,"weight_max":10.0,"no_weight":false,"no_weight_threshold":0.5,"azimuth":{"enabled":true,"weight":10.0,"deadzone_ratio":0.2,"directions":{"front":{"tag":"from front","enabled":true},"back":{"tag":"from behind","enabled":true},"left":{"tag":"from right","enabled":true},"right":{"tag":"from left","enabled":true}}},"elevation":{"enabled":true,"extra":10.0,"categories":{"bird":{"tag":"directly above, from above, aerial view,","enabled":true},"high":{"tag":"high angle, from above","enabled":true},"eye":{"tag":"eye-level","enabled":true},"low":{"tag":"low angle, from below,","enabled":true},"worm":{"tag":"directly below","enabled":true}},"weight":11.0},"distance":{"enabled":true,"extra":0.0,"categories":{"ecu":{"tag":"extreme close-up","enabled":true},"cu":{"tag":"close-up","enabled":true},"medium":{"tag":"medium shot","enabled":true},"full":{"tag":"full body","enabled":true},"wide":{"tag":"wide shot","enabled":true}},"weight":1.0,"follow_slider":true,"category_order":["wide","medium","cu","full","ecu"]},"tilt":{"enabled":true,"deadzone":0.15,"extra":0.0,"dutch_tag":"dutch angle","weight":1.0},"extra_master":1.0,"wheel_step":0.0003,"extras":{"lens":{"enabled":false,"value":"85mm lens"},"dof":{"enabled":false,"value":"shallow depth of field","weight":1.3},"movement":{"enabled":false,"value":"handheld camera"},"composition":{"enabled":false,"value":"rule of thirds"},"style":{"enabled":false,"value":"cinematic"}}}

    Outputs (2)

    NameTypeDescription
    相机提示词STRING
    camera_metaSTRING