π€οΈ Gimbal Waypoint Spline
Fly a multi-stop latent flight plan instead of morphing prompt-to-prompt
- waypoints_batch
- mu_anchor
- latent_path
- flight_telemetry
Morphing between two images is old hat. Morphing through five of them, on a smooth path that respects the curve of the latent space, at a consistent speed - that's what Gimbal Waypoint Spline does. You hand it a batch of keypoint latents (say: "portrait β neon city β ocean at dusk"), and it returns a whole flight path of interpolated latents you can render as an animation, a style journey, or a camera-style pan through one concept.
It's part of the Gimbal-comfy suite by Form & Noise, the pack that treats latents as navigable geography instead of dice. The other nodes steer one point at a time; this one plots the route between many. It's the closest the pack gets to a dedicated animation tool, so if you came here wanting motion, this is the instrument.
How it works
The node takes your waypoints_batch - a LATENT where the batch dimension holds N β₯ 2 keypoint samples - and interpolates between consecutive pairs to build total_steps frames. Internally each waypoint is flattened into a vector, a population centroid (ΞΌ) is computed from mu_anchor if you supply one, or the mean of all waypoints if you don't, and the interpolation runs through that ΞΌ-centered space so the path doesn't collapse toward the origin.
Spline_mode picks the flavor: Spherical_SLERP (geodesic arcs between points - the pack's recommended default), Catmull_Rom_Spline (smoothly curved, passes through the waypoints, tension 0β1 sharpens or softens the curve), Normalized_Linear, and Cosine_Ease (eases in and out of each stop). loop_trajectory closes the path by connecting the last waypoint back to the first - your toggle for seamless loops. constant_velocity (on by default) reparameterizes by geodesic arc length, so the camera moves at a uniform speed instead of racing through short segments and crawling across long ones.
The inputs that matter
waypoints_batch- the keypoints. You build this by stacking several single latents into one batch.total_steps- 4 to 2048, default 60. How many frames the path is divided into.tension- only really does anything in Catmull-Rom mode; 0.5 is a fine middle.loop_trajectory- flip it on for seamless loops.
Outputs are latent_path (a batch of total_steps latents you feed to a KSampler, then decode and stitch into video frames) and flight_telemetry, a DICT with the arc-length accounting if you want to check your work.
Common issues
The same Step-0 rule from the rest of the pack applies hard here: interpolate between fresh denoise=1.0 latents, not mid-denoise states, or the geometry fights you mid-flight. If you get a ValueError about "at least 2 waypoints", your batch is malformed - the samples need N β₯ 2 on the batch axis. And mind memory: 2048 steps of 4-channel latents is a lot of tensors sitting in VRAM at once, so generate in chunks if you're on a 6β8 GB card.
Install
# ComfyUI Manager β search "Gimbal"
# or:
cd ComfyUI/custom_nodes
git clone https://github.com/FormAndNoise/Gimbal-comfy
pip install -r Gimbal-comfy/requirements.txt
Restart ComfyUI; find it under Add Node β Gimbal/Trajectory. Dependencies are just torch, numpy, pillow - nothing extra to download.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| waypoints_batch | LATENT | Batch of N >= 2 keypoint latents | |
| total_steps | INT | 604β2048 | β |
| spline_mode | COMBO | Spherical_SLERP | 4 options: Spherical_SLERP, Catmull_Rom_Spline, Normalized_Linear, Cosine_Ease |
| loop_trajectory | BOOLEAN | false | Connects last waypoint back to first for looping |
| tension | FLOAT | 0.500β1 | β |
| constant_velocity | BOOLEAN | true | Reparameterizes by geodesic arc length for uniform speed |
| mu_anchoropt | LATENT | Population centroid for ΞΌ-centered Slerp. If absent, the mean of all waypoints is used. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| latent_path | LATENT | β |
| flight_telemetry | DICT | β |