IAMCCS Motion Sketch Renderer
Draw the motion, get the control frames LTX-2 can actually read
- control_frames
- control_video_hint_json
- report
The gap between "I want the camera to push in over these 80 frames" and "here is a video frame by frame" is where motion control usually dies. IAMCCS_MotionSketchRenderer bridges it: you feed it a motion render plan (JSON) describing the movement, and it rasterizes that plan into actual control frames - glowing motion trails, sketch lines, timed exactly to your clip - that LTX-2's control mechanisms can consume. Sketch in, renderable control video out.
It's part of the IAMCCS-nodes Shotboard V4 chain (author IAMCCS), slotting between the MotionGuideBridge that produces the render plan and the MotionPartsICLoRAApply that uses the control frames. This is the node that makes the "motion sketch" real pixels.
How it works
The motion_render_plan_json describes the movement: where things are, when, over how many frames. The renderer draws each frame's position with a line, and trail_frames (default 12) keeps a motion trail behind it so the model sees direction, not just position - that's what turns a dot bouncing around into "an object moving left-to-right with a sweep." line_width (8) sets stroke thickness, glow (0.35) adds a bloom so the trail reads clearly against the background, and background_level (0) sets how dark the backdrop is (0 = black, which maximizes contrast for most control setups).
width/height (defaults 512×288) set the control resolution - deliberately modest, because control frames don't need to be big. max_render_frames (240) caps the clip length the renderer will draw; beyond that it stops rather than silently extending.
Inputs and outputs
motion_render_plan_json(STRING) - the plan fromMotionGuideBridge(or hand-written).width/height(defaults 512×288) - control frame resolution.max_render_frames(INT, 240) - frame cap.line_width(INT, 8),trail_frames(INT, 12),background_level(FLOAT, 0),glow(FLOAT, 0.35) - the look of the sketch.
Outputs:
control_frames(IMAGE) - the rendered sketch frames, ready forMotionPartsICLoRAApplyor any control-video consumer.control_video_hint_json(STRING) - metadata for downstream video handling.report(STRING) - how many frames were rendered and from what plan.
How to install
Ships in IAMCCS-nodes. ComfyUI Manager search "IAMCCS", or:
cd ComfyUI/custom_nodes
git clone https://github.com/IAMCCS/IAMCCS-nodes.git
Restart. No model downloads; the LTX-2 model and IC-LoRAs are separate. Pack floors: ComfyUI ≥ 0.3.0, Python ≥ 3.12, Torch ≥ 2.8.
Gotchas
This node renders, it doesn't invent. Feed it {} and you get an empty plan - report will tell you. The trail_frames setting is the one people underestimate: too few and the model can't infer direction (motion reads as jitter), too many and trails bleed into each other on busy motion. 12 is a genuinely good default. And remember the control resolution is the input the model gets - there's no point rendering 1024px control frames when the motion guide is being downscaled anyway; keep it lean, save the VRAM for the actual sample. That's exactly why the IC-LoRA apply node has tiled encoding built in.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| motion_render_plan_json | STRING | {} | — |
| width | INT | 51264–2048 | — |
| height | INT | 28864–2048 | — |
| max_render_frames | INT | 2401–2048 | — |
| line_width | INT | 81–96 | — |
| trail_frames | INT | 120–240 | — |
| background_level | FLOAT | 0.000–1 | — |
| glow | FLOAT | 0.350–1 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| control_frames | IMAGE | — |
| control_video_hint_json | STRING | — |
| report | STRING | — |