Orbit Motion
Elements orbiting a centre point, with depth. Install with npx remotion-ui@latest add orbit-motion.
PrimitivePrimitives
$ npx remotion-ui@latest add orbit-motionSatellites around a hub.
import { OrbitMotion } from "@/remotion/primitives/orbit-motion";
<OrbitMotion periodInFrames={120} center={<Logo />} showPath>
<Chip label="Scenes" />
<Chip label="Atoms" />
<Chip label="Cuts" />
</OrbitMotion>Depth is what makes it an orbit
The ellipse is the easy half. What separates an orbit from a circular slide is that a child on the far side of the ring is smaller, dimmer, and painted behind whatever sits at the centre. All three come from the same sine, so the pass behind the middle happens by itself — there is nothing to schedule and nothing to get out of sync.
Set depth={0} for a flat, diagrammatic ring; raise it for a tilted, physical
one.
Multiple children
Every child gets its own slot, evenly spaced, so a satellite diagram is the default case rather than something you assemble by hand.
Give them different content. Identical children on an evenly spaced ring make
the whole picture repeat every periodInFrames / count frames, which looks like
a much faster loop than the one you asked for — and, if you are sampling stills,
can make a moving component look frozen.
Layout
centerX and centerY are percentages of the frame; radiusX and radiusY
are pixels. upright keeps children level while they travel, which is almost
always what type wants; turn it off for something that should bank into the
curve.
The ellipse is the easy half; depth is what makes it an orbit. One sine drives scale, opacity and `zIndex` together, so a satellite passes behind whatever is at the centre by itself. Give satellites different content — identical ones make the ring repeat every revolution divided by their count.
Agent notes
Install first, then import the copied source component locally. AI guide →
@/remotion/primitives/orbit-motion- Use when: frame-level motion primitives and reusable animation wrappers.
- Customize: radiusX, radiusY, periodInFrames, phase, plus copied source for timing, layout, colors, and typography.
- Rule: do not import this component from the
remotion-uinpm package; it is copied into your project.
Usage
import { OrbitMotion } from "@/remotion/primitives/orbit-motion";
<OrbitMotion periodInFrames={120} center={<Logo />}>
<Chip label="One" />
<Chip label="Two" />
</OrbitMotion>API Reference
| Prop | Type | Default | Description |
|---|---|---|---|
| children | ReactNode | - | Each child gets its own slot on the ring, evenly spaced. |
| radiusX | number | 210 | Horizontal radius, in px. |
| radiusY | number | 78 | Vertical radius. Smaller reads as a tilted ring. |
| periodInFrames | number | 120 | Frames for one revolution. |
| phase | number | 0 | Where the first child starts, in degrees. |
| tilt | number | -12 | Tilt of the whole ring, in degrees. |
| direction | "cw" | "ccw" | "cw" | Which way it turns. |
| centerX | number | 50 | Centre of the orbit, in percent of the frame. |
| centerY | number | 50 | Centre of the orbit, in percent of the frame. |
| depth | number | 0.28 | Scale difference between the near and far side. 0 is flat. |
| depthFade | number | 0.4 | How much the far side dims. |
| upright | boolean | true | Keep children upright instead of letting them ride the ring. |
| showPath | boolean | false | Draw the ring itself. |
| pathColor | string | "rgba(255,255,255,0.14)" | Colour of the drawn ring. |
| center | ReactNode | - | What sits at the centre. |