Protoface Kling 3.0 Pro · Motion Control
Your character, someone else's dance
- video
- files
- run id
The trick that makes people stop scrolling
Motion transfer is the most eye-catching thing in video generation right now: you supply a still of a character and a clip of a person dancing, fighting, or walking, and the character performs that motion. It's the mechanic behind a thousand "my OC does the trend" posts, and it's genuinely useful for anything where the choreography already exists - reference footage, a mocap-ish phone video, a clip you licensed.
This is Kling 3.0 Pro's motion-control task in Protoface, the beta pack that exposes hosted models as ComfyUI nodes. Two media inputs, a couple of toggles, paid per generation.
Worth saying plainly: this is not ControlNet. There's no skeleton extracted, no depth pass, no local graph of preprocessors. You hand a remote model two clips and it figures the correspondence out. If you want the local version, that's Wan with a pose or depth ControlNet, and it's a very different workflow with a very different set of failure modes.
How it works
Same shared adapter as every node in the pack - schema-derived controls, validation, upload, journal, submit, poll, download as native VIDEO. Both media inputs go up as assets (content-hashed, cached for reruns), and the provider does the retargeting.
generation_id is the paid-request identity. Fixed means reuse or resume; increment to buy a new render. And both media inputs count: swap either one and you've changed the request.
The inputs that matter
image is the character - a still, front-facing-ish, clean. This is the identity being transplanted.
video is the performance - the motion to copy. Shorter is better; a 30-second source clip is not what you want to feed it.
character_orientation defaults to video, and this is the one that decides whether your result looks right. It matches the generated character's orientation to the video (the performance) or to the image (the still). Choose video when the choreography matters more than the pose you shot; choose image when you need the character to stay in the framing of your still. Getting this backwards is the classic "why is it sideways" moment.
keep_original_sound defaults to true, which keeps the source clip's audio track on the output. Turn it off if the source audio is a phone recording of a mall.
prompt and negative_prompt are media-style controls here (Default / Set / Null), not plain boxes - Default means the field isn't sent. Prompting motion control is a light touch: it's mostly there to say what the scene is, not to redirect the choreography.
Outputs
video is a native VIDEO list, files a PROTOFACE_FILE list of the original downloads, and run id a string for Protoface Resume Run. Chaining two of these - motion control, then Extend - is a legitimate way to build a longer sequence, and the References mode on the media inputs means the intermediate doesn't have to be re-uploaded.
Install
Manager → search Protoface → install protoface-nodes → restart → reload the browser. Manual:
git clone --branch v0.1.0 --depth 1 https://github.com/protoface-ai/protoface-comfyui.git custom_nodes/protoface
python -m pip install -r custom_nodes/protoface/requirements.txt
ComfyUI 0.41.0+ and Python 3.10+, installed into ComfyUI's own interpreter. av (PyAV) is what lets native video move in and out of these sockets - if the video input refuses a connection, check that package first. Then click Protoface in the lower-right corner and enter a key.
Where people get burned
Feeding a video into the image slot. Different modalities, different sockets. If the frontend gives you a mode picker, pay attention to which mode you're in.
Long source clips. Motion control works best on short, clear performances. A minute of handheld footage gives the model a minute of ambiguity.
Expecting a refund for a cancel. The pack's README is explicit: interrupting requests cancellation, and cancellation is best effort. Your charge is between you and your account.
Rerunning "to see if it helps" without incrementing. Same request identity, same recorded job. Increment on purpose, not out of impatience.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | COMBO | The positive prompt for the generation. | |
| image | COMBO | A public URL, a data URI, or an asset id. | |
| video | COMBO | A public URL, a data URI, or an asset id. | |
| character_orientation | COMBO | video | Generate the orientation of the characters in the video, which can be selected to match the image or the video. |
| keep_original_sound | BOOLEAN | true | Whether to retain the original video sound |
| negative_prompt | COMBO | The negative prompt for the generation. | |
| generation_id | INT | 00–9007199254740991 | Keep fixed to reuse/resume this paid job. Increment for a fresh paid generation; independent of the model seed. |
| request_scope | STRING | Automatically assigned per node. Headless clients must supply a stable unique workflow/node ID. This is not a secret. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| files | PROTOFACE_FILE | — |
| run id | STRING | — |