TK 可动素体相机
Pose a dummy, get camera tags instead of guessing them
- 相机提示词
- camera_meta
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 fieldwhen 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.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| pose_preset | COMBO | A-Pose | 3 options: A-Pose, T-Pose, 自定义 |
| pose | STRING | {"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 | COMBO | 自定义 | 18 options: 自定义, 正面, 背面, 左侧, 右侧, 正上方俯视, +12 |
| pos_x | FLOAT | 0.00-1–1 | — |
| pos_y | FLOAT | 0.00-1–1 | — |
| pos_z | FLOAT | 0.00-1–1 | — |
| roll | FLOAT | 0.00-1–1 | — |
| fov | FLOAT | 5020–100 | — |
| extra_tags | STRING | — | |
| config | STRING | {"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)
| Name | Type | Description |
|---|---|---|
| 相机提示词 | STRING | — |
| camera_meta | STRING | — |