panel-orbit

Where a spatial panel sits, and how dragging moves it. Pure — no Babylon, no DOM — so the placement rule can be tested without a headset.

A panel in a headset is parented to a reference frame at a fixed local offset: rock-steady relative to you, and something you can point at. What it has not had is a way to move it, so a panel seated above your eyeline had to be read by looking up while you edited something below you.

It rides a sphere

Tonio: "Panel dragging seems simple enough. Drag it on the surface of a sphere around its rig anchor." That is the whole model, and it is worth saying why it is better than the obvious alternative of dragging it on a plane:

on a sphere free in space
distance constant — it cannot be shoved into your face or out of reach drifts every drag
facing falls out — it always looks back at the centre needs its own billboard rule
what you control two angles six degrees of freedom, by accident
losing it bounded by the clamps below trivial

So the state is two angles and a radius, the radius does not change while you drag, and the panel re-aims at the anchor after every move. Nothing needs to remember a pose.

A limit you can feel, not one you hit

A hard stop is the right RESTING behaviour and the wrong LIVE one. The panel simply stops following your hand, and in a headset — where the only feedback is what you can see — that reads as a dropped drag rather than a limit. Tonio: "It could follow you and rubber band back."

So a drag past a limit keeps following you and stiffens (bandOrbit, rubberBand), and letting go springs back to the clamp (clampOrbit). The two together are what make it a band rather than simply a bigger box: the panel may PASS a limit, and may never come to REST past one.

rubberBand is max · (1 - e^(-over/max)), which earns its place over a linear scale with a cap three times over — it starts at 1:1 so a small overshoot feels like nothing unusual, it stiffens smoothly rather than arriving at a second hard stop, and it asymptotes, so pulling harder never takes the panel anywhere new.

The clamps exist because you cannot chase what you cannot see

elevationDeg stops short of straight up and well short of straight down, and azimuthDeg stops before the panel goes behind you.

That is not tidiness. The controls for recovering a lost panel are ON the panel — Exit VR and Re-seat live in its header — so a panel dragged behind your shoulder is one you cannot reach the recovery button of. A clamp you occasionally notice is much cheaper than a session you have to end by taking the headset off.

Straight up is excluded for a second reason: azimuth is undefined at the pole, so a drag through it would spin the panel around a direction you did not choose.