LTX Director Motion Brush V2 Guide
LTX Director Motion Brush V2 Guide
- optional_latent
- motion_guide
- frame_idx
- render_summary
- motion_guide_video
- motion_guide_any
LTX 2.3's motion-track control doesn't understand your storyboard. It understands video - specifically, the sparse-dot control clips the IC-LoRA was trained on. This node is the translator between the two: it takes the motion tracks you drew inside the Director Motion Brush timeline and renders them into that control video automatically. It's the quiet middleman that makes the whole "draw the motion" thing actually work.
What it does
In the included workflow, the main LTXDirectorMotionBrushV2 node hands its motion_tracks JSON to this node, and this node's rendered output feeds LTXAddVideoICLoRAGuide, the ComfyUI-LTXVideo node that injects the IC-LoRA motion-track conditioning into sampling. You don't have to wire much yourself - but understanding what it renders explains half your results.
For each segment, it takes your brush strokes, interpolates each track's points across the segment's frame range, then stamps a moving dot per frame. The dots carry an age-based trail: fresh points are big and bright, older ones shrink and fade - that comet-tail look is exactly what the motion-track control LoRA reads as direction and speed. The channel order is deliberately matched to LTXVDrawTracks so the IC-LoRA conditioning sees what it expects.
The inputs that matter
motion_tracks- the JSON emitted by the main node'smotion_tracksoutput. Leave its default alone; it gets replaced.width/height- render resolution, default 768×512. This is the canvas for your control video, not the output video.duration_frames- timeline length excluding the final endpoint. 0 means "figure it out from the payload or the latent", which is what you want in a normal workflow.trail_frames(default 50) - how long each dot's tail persists. Lower = tighter dots that read as fast/jumpy; higher = longer streaks.min_radius/max_radius(default 2 / 8) - dot size range.optional_latent- connect the Director video latent and width/height/duration are inferred from it (if you left them at 0).
Outputs
The outputs are motion_guide (an IMAGE batch of the rendered frames), frame_idx, render_summary, motion_guide_video (the VIDEO you'll actually feed into LTXAddVideoICLoRAGuide), and motion_guide_any - a wildcard copy for nodes with * sockets. render_summary is a JSON string that quietly tells you what happened: it includes segments_rendered and tracks_rendered.
That last one is your debugging friend. If render_summary shows segments_rendered: 0, your tracks never made it into the payload - you probably drew them with Motion Brush off, or the timeline didn't save them. If the count looks right but the video ignores your tracks, the usual suspects are trail_frames (too long and the trail muddies the signal) and dot radius (too small and the control barely registers).
Install
It ships in the same pack as everything else, so you don't install it separately:
comfy node install ltx-director-motion-brush
# or clone into ComfyUI/custom_nodes, then restart
The pack needs ComfyUI-LTXVideo (for the IC-LoRA guide nodes it feeds), comfyui-kjnodes, and ComfyUI-Impact-Pack, plus the Lightricks IC-LoRA Ingredients and Motion-Track-Control models. Those are the actual cost of entry - the renderer itself is CPU-side and cheap.
The honest take
This node is not where the artistry happens; it's where your intent becomes a format the model respects. The one real gotcha is treating the rendered dots as literal. You're not painting the exact trajectory - you're giving the IC-LoRA a directional hint it can interpolate. Draw broad, confident strokes rather than micromanaging them, and lean on trail_frames to tune how forcefully the motion reads. Combined with GuideAttention on the conditioning side, it's the difference between a video that drifts and one that moves like you asked.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| motion_tracks | STRING | {"version":1,"duration_frames":120,"segments":[]} | Motion track JSON emitted by LTX Director Motion Brush. |
| width | INT | 7680–8192 | — |
| height | INT | 5120–8192 | — |
| duration_frames | INT | 00–10000 | Timeline duration excluding the final endpoint. 0 uses the Director payload or optional latent. |
| trail_frames | INT | 500–500 | — |
| min_radius | INT | 21–64 | — |
| max_radius | INT | 81–128 | — |
| optional_latentopt | LATENT | Optional Director video latent. When connected, width, height, and frame count are inferred if the explicit values are 0. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| motion_guide | IMAGE | — |
| frame_idx | INT | — |
| render_summary | STRING | — |
| motion_guide_video | VIDEO | — |
| motion_guide_any | * | Wildcard copy of motion_guide_video for nodes that use ANY sockets. |