WanMove Native
Drag-a-point motion control for native Wan
- positive
- track_mask
- positive
- tracks
WanMove is trajectory-based motion control - you specify where points in the frame should move, and the generation makes the scene follow those tracks. Think "drag this object along this path" rather than "describe the motion in words and pray." This node is the _native build, meaning it works against ComfyUI's native Wan conditioning rather than the wrapper's own embeds pipeline - a useful distinction, because it slots into a standard native Wan graph instead of forcing you into the WanVideoWrapper's WANVIDIMAGE_EMBEDS world.
Motion is the hardest thing to prompt in video. The KB's Wan prompting advice basically gives up on precision - "just use basic guidance, to pinpoint the elements and action" - because text is a blunt instrument for movement. Track-based control is the alternative: instead of hoping the model interprets "she turns to the left," you draw the path and it follows.
How it works
You hand it your positive conditioning and a string of track coordinates - a serialized description of point trajectories, typically produced by a point-tracking or trajectory-authoring tool upstream. Optionally you add a mask to say which region the tracks apply to. It bakes the motion trajectory into the conditioning and passes it back out, plus a separate tracks object you can route onward. Sampling then respects those paths.
The inputs and outputs
positive(CONDITIONING, required) - your positive prompt conditioning. This is what gets the motion mixed into it.track_coords(STRING, required) - the trajectory data, as a string. This is the motion itself; it comes from a tracking/authoring node, not something you type by hand in practice.track_mask(MASK, optional) - restricts the motion to a region. Handy when you want one object to move while the background holds.
Outputs:
positive(CONDITIONING) - the motion-infused conditioning; wire it into your KSampler's positive.tracks(TRACKS) - the parsed tracks, for visualization or reuse downstream.
The only thing a beginner really sets here is where the track_coords come from - get that plumbing right and the node does its part.
How to install it
It's in Kijai's WanVideoWrapper. ComfyUI Manager: search ComfyUI-WanVideoWrapper, install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/kijai/ComfyUI-WanVideoWrapper
pip install -r ComfyUI-WanVideoWrapper/requirements.txt
then restart. Because this is the native-conditioning variant, it plays with ComfyUI's built-in Wan nodes, so you don't strictly need the wrapper's whole embeds stack around it - but you do need a Wan model that responds to trajectory control and a way to generate the track_coords string.
Common issues & troubleshooting
Nothing follows the tracks. The most common cause is empty or malformed track_coords. It's a string with a specific structure; if your upstream tracker exported nothing usable, the node has no motion to apply. Check the string actually contains coordinates.
Motion applies to the whole frame when you wanted one object. That's the track_mask doing nothing - either it's not connected or it's blank. Mask the region you want moved so the rest stays put.
Native vs wrapper confusion. This node speaks native ComfyUI CONDITIONING, not the wrapper's WANVIDIMAGE_EMBEDS. Don't try to bridge it into the WanVideoSampler's embeds input - route it into a native Wan sampling path instead.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| track_coords | STRING | JSON string or list of JSON strings representing the tracks | |
| track_maskopt | MASK | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| tracks | TRACKS | — |