Nodes/AnimoFlow/Draw Waypoints (AnimoFlow)
ComfyUI Node

Draw Waypoints (AnimoFlow)

Pin down the exact spots your character must hit

By AnimoFlow·Created 2 months ago·Updated about a month ago· 1
Draw Waypoints (AnimoFlow)
    • root2d_json
    • traj_restore_json
    • duration
    points_json[{"x": 0.5, "z": 0.5, "f": 0.0}, {"x": 1.8, "z": 1.4, "f": 0.5}, {"x": 2.6, "z": 2.6, "f": 1.0}]
    duration4.0

    AnimoFlow_DrawWaypoints is the more structured sibling of AnimoFlow_DrawTrajectory. Where the trajectory node gives you a freehand curve, this one gives you a pin pad: you place numbered waypoints on a top-down ground plane, each with a time attached, and the generated character must pass through them. Instead of "roughly follow this squiggle," it's "be here at this moment, there at that moment." It's the difference between sketching and storyboarding.

    Same canvas conventions as the trajectory node - an 8m × 8m ground plane, origin center, up-the-page = +Z - and the same single-sourced stage library on the back end, so the pins serialize into the hidden points_json widget and canonicalize exactly like the webUI. Each pin carries three fields: x, z, and f - the frame fraction (0.0 to 1.0) saying when in the motion the character should be at that spot. The time strip under the pad lets you drag pin markers to adjust those times, and "Even times" resets them to spread evenly. That time dimension is what makes this node worth having: you can tell Kimodo to dawdle at one waypoint and sprint to the next, which is genuinely hard to express any other way in a ComfyUI graph.

    The wiring

    Three outputs, all ready-to-wire JSON strings:

    • root2d_jsonAnimoFlow_Kimodo's root2d_json input. This is the sparse root2d constraint - sparse because pins, not a dense curve, and Kimodo's training included exactly this kind of sparse constraint, so it's the node's natural target.
    • traj_restore_jsonAnimoFlow_GLBExport's traj_restore_json, so the exported GLB puts the character back on your pin layout.
    • duration → the generator's duration input, same single-source-of-truth pattern as the trajectory node. The pad's duration fixes the root constraint's frame indices (Kimodo runs at 30 fps) and is re-emitted so the generator is wired from the pad.

    Inputs are points_json (the pin list) and duration (1–30s, default 4). The shipped default pins trace a clean L-shaped corner - a good starting point for seeing how constraint strength behaves.

    Using it

    Install is the usual two-part AnimoFlow affair (nodes via Manager or git clone https://github.com/AnimoFlow/comfyui-animoflow.git, then ./install.sh doctor + ./install.sh up --gpu if you're driving Kimodo). The waypoints_kimodo curated workflow is pre-wired end to end, so that's the fast path.

    Two gotchas worth knowing. First, the same Nodes 2.0 interactive-widget shrinking bug affects this pad (and AnimoFlow_DrawTrajectory and the priorMDM timeline) - the node physically shrinks when you click or drag it; enlarge it manually and keep working. Second, a constraint is only as good as the model's capacity to honor it: with Kimodo, if the character skims past your pins instead of through them, raise cfg_constraint on the generator node before you re-draw anything. And for the record - this node produces only root constraints. If you want to also steer the style of the motion between pins, that's what segmenting the prompt does in AnimoFlow_PriorMDMTimeline.

    CategoryAnimoFlow/Input

    Inputs (2)

    NameTypeDefaultDescription
    points_jsonSTRING[{"x": 0.5, "z": 0.5, "f": 0.0}, {"x": 1.8, "z": 1.4, "f": 0.5}, {"x": 2.6, "z": 2.6, "f": 1.0}]
    durationFLOAT4.01–30

    Outputs (3)

    NameTypeDescription
    root2d_jsonSTRING
    traj_restore_jsonSTRING
    durationFLOAT