CamSequencer
2.0.0A Camera COMP that sequences camera moves.
Two sequencers inside — one for the camera, one for the Look At target. Free flight, orbit, picking, zoom, viewport mode, the dutch tilt, surface collision.
The camera →CamSequencer is a Camera COMP with two sequencers inside. Frame a shot and press Append. Move, append again. Then scrub one number — or drive it from a CHOP, or a gamepad — and the camera travels your shots with the easing, splines and rotation blending you chose.
It is one of four components on the same engine. GeoPilot flies the body — a drone, an aircraft, a person on foot, a car — OpSequencer sequences any operator at all, and MixSequencer sequences the blends between them.
They all keep the same thing: a table of presets, and one number that walks it. Learn the Seq page once and you know all four. What differs is what each one points at.
A Camera COMP that sequences camera moves.
Two sequencers inside — one for the camera, one for the Look At target. Free flight, orbit, picking, zoom, viewport mode, the dutch tilt, surface collision.
The camera →A Geometry COMP that flies itself.
The body, not the camera: a drone, an aircraft, a person on foot or a car. Walking, driving, forces and assisted flight, over ground contact that finds the floor.
The body →The same preset engine, pointed at any operator.
Drag the parameters you care about onto it and they become preset columns. Everything the other three do with presets, they do because this does.
Any operator →Step-sequenced weight scenes.
Each step is a blend of presets rather than one of them. Any-to-any sequencing, in any order, turns out to be the special case where every step picks exactly one.
The matrix →Until 2.0, CamSequencer flew the camera itself — and its flight models grew up flying a camera and turned out to be bodies all along. So they moved. Walking, driving, forces, assisted flight, aerobatics and ground contact are GeoPilot's now, where they fly anything rather than only a lens, carrying the same mapping, the same pages and the same measured numbers.
The two then compose, and there are only two ways to join them: wire the camera under the pilot, or point its Source at the pilot's head bus and map by channel name. Neither needs a line of Python. Nothing forces you to use both — GeoPilot never needs a camera, and CamSequencer never needs a body.
No CHOP network, no expressions, no keyframes to babysit. The component is the camera.
Drag camSequencer.tox into your project and point your Render TOP at it. It is a Camera COMP — it renders like any other.
Frame the camera, press Append. Move it, press Append again. Each press captures the full pose and lens as a preset row.
Whole numbers recall a preset exactly. Fractions blend into the next one. The sequence wraps, so the last shot flows back into the first.
Export a CHOP to Select, animate it, or plug in a controller and fly the camera yourself — capturing new presets from the pad.
Every control below is a real parameter. Drag the left view to orbit the director's camera; the right view is what the sequenced camera actually renders.
There is no timeline and no keyframe track. Select is one float. At
2.0 the camera sits exactly on preset 2; at 2.5 it is halfway into
preset 3. Past the end it wraps back to 0, so a slowly ramping LFO is a permanent camera move.
Because it is only a number, everything can drive it at once — a CHOP export, a Python call, a click in the preset list, a bumper on a gamepad. Nothing is bound or exported behind your back.
Each preset row carries its own EASE cell, and the blend into a preset uses
that preset's easing — so a shot can ease in gently while the next one snaps.
Flip Override and the Easing menu wins for every segment instead, which is the
faster way to audition a feel across a whole sequence. Thirty-one curves ship, from
Linear to InOutElastic, plus a CustomEase slot for a
curve you draw yourself.
Two poses ten degrees apart can be written as 0 and 350. Eased channel by
channel, that is a 350-degree whip. Quaternions let you say which one you meant.
Single angle parameters — roll, or a lone rotation axis — take the shortest arc in the Slerp modes too.
Rotation columns are detected by name, in any case and any spelling the parameter uses:
Rx Ry Rz, Rotx Roty Rotz, Rotate…. You do not tag anything.
Spline Interpolation and Rotation Blend never fight: rotation triples are held out of the spline and always resolved by the rotation mode, so a smooth positional curve and a correct turn are not a trade-off.
With a Look At target set, the target fixes the camera's aim — rotation presets still swing the camera around its pivot and set roll.
That camera has no tx/ty/tz — its pose is a matrix plus a tumble pivot. Drop this
component inside one and it records the pose and the pivot, so a recalled preset tumbles
around the point you saved it with.
The Viewport page mirrors the viewport's pose in both directions without echo, and the camera sequencer reads and writes that mirror. The viewport's Transform DAT is borrowed while linked and handed back when you leave — if it already points elsewhere, the link is refused with a warning rather than silently taken.
Everything the pad does is applied to the live camera; presets only change when you press Capture. The tour below runs a fixed sequence — the control in use lights up on the diagram as you watch what it does to the shot.
Which stick you touch decides what you are doing. That leaves one thing only Orbit can do: arc over the top at a fixed radius. Rise is a translation, so it grows your distance as it lifts you — 5.05 units becomes 6.61 in a second.
The pivot is whichever exists first: the viewport's tumble pivot, then the Look At target, then a point Orbit Distance ahead of the camera.
A Render Pick CHOP samples the centre pixel of your Render TOP for world position, surface normal and the object hit — which is why it sees POPs, GPU displacement and instancing, where a Ray SOP would only ever see CPU-side geometry.
The old Wall Collision walked; this one flies. The probe fires along the direction you are actually moving, so descending into terrain lands on it exactly the way flying into a wall always did, and a climb can meet a ceiling. Stand-off is measured perpendicular to the surface rather than along the ray, and the slide keeps the part of your motion that runs along it.
It guards flown motion only, and deliberately: a preset recall, a Teleport or a hand on the parameters stays sovereign and goes exactly where you put it.
The floor is 0.05, and it is not arbitrary. A camera allowed to land exactly on a
surface picks the far side of it on the next frame and walks straight through. Keep
Stand-off above your Near clip too, or the surface is clipped away the moment you arrive.
Surface Collision costs one extra pick render per frame while you are actually moving; with it off,
picking costs nothing at all until a button asks for it.
Roll stayed here in 2.0 — as the dutch tilt it always was. The bank of a moving body,
leaning into its turns, is GeoPilot's now, and a camera wired under a
banking pilot composits the two through the wire. That is a shot the single-rz world
could not make. Turbulence stayed too: it is shot dressing, not physics, and it no longer needs a
flight model switched on to work.
Map a game controller by learning, and the component's own transform becomes a drone, an aircraft, a person on foot or a car. Parent your geometry inside it, or wire your model underneath — it is a Geo COMP. It flies anything, and it never needs a camera.
Switch models on the demo below and the controls change with it, the way the pages do in the component. Under Driving, turn Grip on and watch the corner open out — the wheel is still asking for the same radius. Under Walking, wait for the walker to stop: the head stops with it, because the bob rides on distance covered rather than on a clock.
One menu, because only one of them can move the body. Ground contact runs underneath all of them as a layer, never as a mode — which is what lets a flying body follow terrain with no walking model in sight.
On foot, Forward and Strafe are the feet: they run on the ground plane and never along the gaze, so looking down does not walk you into the floor. Rise and Zoom do nothing at all — levitating is not something feet do, and the way off the ground is Jump.
In a car, Strafe stops meaning strafe and becomes the wheel. Yaw and Pitch stop being the heading and become the driver's head, free to look about the cabin while the car goes on going where the wheels point, and returning to the road by itself when you let go. A walker's facing and heading are one thing; a driver's are two, and that is the whole shape of the model.
Under Grip the tyres have a finite hold: ask a corner for more than they have and the car understeers onto the radius they can actually keep, opening a slip angle you can catch on the stick. A stated 6.0 corner opens out to 6.996 rather than sliding on rails.
The coupling is a spectrum rather than a switch, and the wire is the setup:
A coupled camera keeps its own presets, and they live in the body's frame — so "over the left shoulder" composes with wherever the body went. The body carries the car, the head carries the eyes, and the wire composits the two.
The pilot publishes what it does not consume. null_headbus carries the axes and
button pulses a coupled camera should have — point a CamSequencer's Source at it and map by
channel name, with nothing to learn.
null_statebus carries what the body is doing: speed, grounded, airborne,
bank, model index. HUDs, engine audio, camera shake — anything in your network can react to the
body without a line of Python coupling.
A preset recall, or a hand on the transform, beats every model. A jump larger than the motion could explain drops the carried momentum and the model takes up the pose it finds — the car adopts the recalled heading and drives on from there.
That order is deliberate, and it is the whole philosophy of the thing: this is a rig for sequencers before it is a simulator. The body's own memory is an ordinary OpSequencer pointed at its transform, so easing, per-parameter overrides, Spline and Mix apply to a body exactly as they apply to anything else.
g·tan(φ)/v to 0.03%, a formula that appears nowhere in the code. A loop conserves energy to 0.20%.The stall deserves its own line: it is the lift curve, not a speed test. Zoom-climb, run out of speed at the top, and the nose drops on its own. Nobody wrote that recovery.
Press Learn, move the control. An Xbox pad, a DualShock, a MIDI surface and an OSC app all map the same way, because you teach it rather than match it.
−1 works beside a stick resting at 0, in the same mapping.
Pressing Learn snapshots every source channel; the first to travel more than 0.3
from its snapshot is mapped as +. A button is finished there. An axis keeps
listening: press the opposite control and it becomes −, or release and move
the same one again — or wait out Learn Timeout — to keep it bipolar.
Two rules came from real hardware. A release back to rest never counts as a move, so a trigger pair is never mistaken for a stick; and a control that keeps twitching after it crossed the threshold only counts again once it has actually returned to rest.
CamSequencer is the camera-shaped one. OpSequencer is the same engine pointed at any TouchDesigner operator — drag the parameters you care about onto it and they become preset columns.
Drop an operator on the panel, or point the OP parameter at one. Then drag
parameters straight from its parameter dialog onto the panel — each becomes a column in the
preset table. Pulse, momentary and sequence parameters are skipped, because they cannot hold a
value worth recalling.
ALT + drop starts fresh and captures every parameter of the operator at once, for when you would rather subtract than add.
Menus, toggles and strings cannot be blended, so they switch at the midpoint of a transition rather than being dropped.
The demo above defaults to Periodic Columns on. Turn it off and watch
Hue travel from 350° to 10°: instead of crossing zero and landing 20 degrees away,
it sweeps backwards through every other colour on the wheel.
rotate, roll, angle*, hue* and a lone
rotation axis are detected as degrees; phase* as 0..1. Anything else you add
yourself as name or name:period — Twist Offset:1.
Rotation triples get the same treatment through Rotation Groups: name the base
and Spinx Spiny Spinz blends as a quaternion like any other rotation.
One target operator, any number of preset states.
RestorePresets() brings it back.Learn the Seq page once and you know all of them. CamSequencer is it pointed at a camera, GeoPilot at a body, MixSequencer at the blends between presets — and OpSequencer at whatever you like.
A sequencer of mixes. Each step is a weight vector over another sequencer's presets; the playhead scrubs the steps and crossfades between them with that step's own easing, and the result rides out as one channel per preset — straight into any sequencer's Weights CHOP.
Give a step a single 1.0 and it recalls that preset. A run of those steps is a cue
list in any order you like, whose transitions are ordinary Mix-mode crossfades — following exactly
the same arc as the pairwise A→B mode, verified to 1e-6. Nothing is lost by getting
there the general way.
Paint several weights into a step and the same playhead sequences blends instead. Sit a step at 0.5 / 0.5 and the sequence morphs through it like any other step. An all-zero step writes nothing at all, which makes it an explicit hold.
The output is just a CHOP, so one matrix can drive several sequencers at once — a CamSequencer's mix and a GeoPilot body's inner sequencer together. One playhead then recalls a whole multi-component shot: where the body is, and where the camera is looking, in one number.
And nothing in it owns a clock. Drive Step Select from an LFO, a Timer, a Beat CHOP or your own hand — the same as every other playhead in the family.
MixSequencer is on its feature branch and being built now, so there is no download for it on this page. It is here because it is the fourth shape the engine takes, and because the family is easier to understand with it in view than without.
CamSequencer 2.0.0 — eight parameter pages. GeoPilot 1.1.0 — ten, five of them the model pages that moved across at the split.
The Seq page. Every control drives both inner sequencers at once.
EASE column, or one for all with Override.Where the shots live, and how they move with your project.
RestorePresets() brings it back.Fly the camera from a controller — or any CHOP at all.
A centre-pixel Render Pick through the render this camera renders through.
A Geo COMP of its own. Five model pages, ground contact and a coupling surface.
Promoted on the component, so op('camSequencer1') reaches all of it.
RestorePresets() on the inner sequencers.
Drop-in .tox files, each self-contained. Take the one you need — they compose, but not
one of them requires another.