WanVideo Add TTMLatents
Time-to-Move motion control, drag-an-object animation for Wan
- embeds
- reference_latents
- mask
- image_embeds
This node wires Time-to-Move (TTM) into a Wan generation. TTM is a training-free motion-control trick that blew up late 2025 - the idea is you manually move things to describe the motion you want. Shift an object across the frame, or drag a cutout, roughly block out the movement, and TTM uses that as a soft guide so the model animates real, controlled motion instead of whatever it feels like. One of the viral demos (from mickmumpitz's workflow) animated a scene just by shifting objects and images around by hand, and it looked uncannily natural.
The node itself takes your running image_embeds, folds in a reference-latent guide plus a mask over a chosen step window, and returns the embeds with the TTM control added. It's another link in the wrapper's embeds chain: WANVIDIMAGE_EMBEDS in, WANVIDIMAGE_EMBEDS out.
How it works
Here's the clever, cheap part - TTM is "training-free," meaning nobody trained a control model. You provide a reference_latents: an encoded version of your crude, hand-moved motion (the object shifted to where it should end up, or a rough animated block-out). You provide a mask for the region that should follow it. Then you tell it when in the denoising process to apply the guide via start_step / end_step. Early in denoising the model locks onto your coarse motion layout; released later, it fills in believable detail. The result is motion that goes where you pushed it, rendered convincingly by Wan.
That step window is the whole art of it. Guide too long and the output looks like your crude block-out. Guide too briefly and the motion drifts back to whatever the model prefers.
The inputs and outputs that matter
embeds(WANVIDIMAGE_EMBEDS) - the running embeds from earlier in the chain.reference_latents(LATENT) - your hand-authored motion guide, VAE-encoded. This is the motion you're asking for.mask(MASK) - which region follows the guide. Everything outside is free.start_step(default 0) /end_step(default 1) - the denoising-step window where the guide is active. This is the dial you'll actually tune. A short early window (guide the first few steps, then let go) is the usual sweet spot; extendend_stepif the motion isn't sticking, shorten it if the output looks stiff and pasted.
Output: image_embeds (WANVIDIMAGE_EMBEDS) → the next Add node or the sampler.
How to install it
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. The nice thing about TTM being training-free: there's no separate control model to download. You just need your usual Wan model, VAE and text encoder. The work is upstream - you need a way to build the reference_latents, i.e. to actually move your objects/images and encode the result.
Common issues & troubleshooting
The output just looks like my crude block-out. You're guiding too far into the schedule. Pull end_step in so the model gets the back half of denoising to render properly. TTM should inform the motion, not freeze the frame.
The motion ignores what I moved. Opposite problem - extend the guide window (end_step), or check that your mask actually covers the object and that reference_latents encodes a clear enough displacement. A tiny nudge gives a tiny result.
Region bleeds. The mask is loose. Tighten it to the object that should move; the unmasked area is meant to stay put.
Node missing after install. TTM is recent; update WanVideoWrapper and restart if the class isn't there.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| embeds | WANVIDIMAGE_EMBEDS | — | |
| reference_latents | LATENT | Latents used as reference for TTM | |
| mask | MASK | Mask used for TTM | |
| start_step | INT | 0-1–1000 | Start step for whole denoising process |
| end_step | INT | 11–1000 | The step to stop applying TTM |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image_embeds | WANVIDIMAGE_EMBEDS | — |