π Gimbal Circular Orbit
Walk all the way around a subject in latent space
- center_latent
- direction_x
- direction_y
- mask
- mu_centroid
- latent_batch
- flight_telemetry
The Circular Orbit is the pack's "dolly shot" node. Instead of nudging a latent in one direction, it walks a perfect circle around a center point in latent space and hands you the whole ring as a batch of frames. Feed those through a KSampler at low denoise, decode, and you get a set of variations - or, chained into an animation, a seamless 360Β° loop that meets itself at frame 1 without a jump cut.
How it works
You give it a center_latent and it traces the curve z(ΞΈ) = center + r Β· (cosΞΈΒ·u + sinΞΈΒ·v): a circle of steps points (default 36) at radius distance, in the 2D plane spanned by two orthonormal vectors u and v. Since ΞΈ=0 and ΞΈ=360Β° are the same point, the loop closes - that's what makes it loopable in a way that random seed variation never will.
The vectors u and v come from your setup. In the default Orthogonal_Basis mode you can supply them yourself via the optional direction_x and direction_y latents (leave them empty and the node derives an orthogonal basis from the center itself). Phase_Modulated and Harmonic_Torus are the fancier modes - phase modulation wobbles the radius, and the torus mode orbits in a higher-dimensional harmonic space - useful if you want non-circular drift, but start with the basis mode.
The toggle that actually matters is preserve_hypersphere_norm (on by default). A raw circle in high-dimensional space wanders through low-density regions where the decoder gets confused; this renormalizes every frame to a constant L2 radius so the whole ring stays in the "safe" shell where real images live. Leave it on. seed exists for reproducibility, and mu_centroid lets you supply your own centroid for that norm projection instead of inferring the radius from the center.
Outputs are latent_batch (your steps frames, ready for a sampler) and flight_telemetry.
The wiring
Center concept β KSampler at full denoise β center_latent β Circular Orbit (steps=36, radiusβ1) β KSampler at denoise ~0.45, CFG ~4.5 β VAEDecode β frames. If you're making a loop, keep the refinement denoise low and consistent or the frames won't match well enough to loop.
Installing
Standard pack install: ComfyUI Manager β search "Gimbal-comfy" β install β restart, or git clone https://github.com/FormAndNoise/Gimbal-comfy into ComfyUI/custom_nodes. Dependencies are torch/numpy/pillow, all already bundled. Nothing to download - the README's clone URL is stale, the live repo is FormAndNoise/Gimbal-comfy.
Where people get burned
Radius is the dial everyone underestimates. A radius of 1 is already a meaningful excursion; crank it to 10 and every frame is out-of-distribution noise soup, regardless of preserve_hypersphere_norm (that keeps the radius constant, it doesn't make a huge radius safe). Start at 0.5β1.0 and work up. Second, steps is a trade-off - 36 is smooth but each frame is a full refinement pass, so 36 frames is 36 samplers. For a first test, 12β16 frames shows the same loop with a fraction of the render time. And this remains a young, low-footprint pack: the orbit math is sound and the loop genuinely closes, but if the frames drift slightly between iterations, that's the reality of sampling each frame independently - nobody's promising frame-consistency here, just trajectory consistency.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| center_latent | LATENT | β | |
| steps | INT | 363β1024 | β |
| radius | FLOAT | 1.000.01β20 | β |
| orbit_mode | COMBO | Orthogonal_Basis | 3 options: Orthogonal_Basis, Phase_Modulated, Harmonic_Torus |
| preserve_hypersphere_norm | BOOLEAN | true | Maintains constant L2 radius to prevent density burn |
| seed | INT | 00β18446744073709550000 | β |
| direction_xopt | LATENT | β | |
| direction_yopt | LATENT | β | |
| maskopt | MASK | β | |
| mu_centroidopt | LATENT | Population centroid for hypersphere norm projection. If absent, center_latent radius is used. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| latent_batch | LATENT | β |
| flight_telemetry | DICT | β |