Nodes/Gimbal-ComfyUI/πŸ”„ Gimbal Circular Orbit
ComfyUI Node

πŸ”„ Gimbal Circular Orbit

Walk all the way around a subject in latent space

By FormAndNoiseΒ·Created about a month agoΒ·Updated 20 days agoΒ· 0
πŸ”„ Gimbal Circular Orbit
  • center_latent
  • direction_x
  • direction_y
  • mask
  • mu_centroid
  • latent_batch
  • flight_telemetry
β—„steps36β–Ί
β—„radius1.00β–Ί
β—„orbit_modeOrthogonal_Basisβ–Ί
β—„preserve_hypersphere_normtrueβ–Ί
β—„seed0β–Ί

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.

CategoryGimbal/Trajectory

Inputs (10)

NameTypeDefaultDescription
center_latentLATENTβ€”
stepsINT363–1024β€”
radiusFLOAT1.000.01–20β€”
orbit_modeCOMBOOrthogonal_Basis3 options: Orthogonal_Basis, Phase_Modulated, Harmonic_Torus
preserve_hypersphere_normBOOLEANtrueMaintains constant L2 radius to prevent density burn
seedINT00–18446744073709550000β€”
direction_xoptLATENTβ€”
direction_yoptLATENTβ€”
maskoptMASKβ€”
mu_centroidoptLATENTPopulation centroid for hypersphere norm projection. If absent, center_latent radius is used.

Outputs (2)

NameTypeDescription
latent_batchLATENTβ€”
flight_telemetryDICTβ€”