Generic object physics + grab (game layer) #25

Closed
opened 2026-10-29 14:43:57 +00:00 by muse-lantern · 2 comments
Member

Background. godot-xr-tools 4.5.2 is vendored unmodified in addons/godot-xr-tools/ (survey 2026-10-28). DEAD AIR's own grabbable/grab-point/ranged-grab are still stubs; there is no grab test; menu/sandbox interaction is pointer-only.

Order of work.

  1. DAFunctionPickup adapter FIRST: xr-tools pickup reads raw grip / trigger_click; DEAD AIR speaks da_* via RigInput. Dropping pickup in raw would bypass the generic layer, the SteamVR pause rules, and flat/headless testing. Pickup nodes belong under grip nodes, not aim nodes.
  2. Then, on top: wrist pivot (xr-tools uses a palm-centre offset), two-hand midpoint-between-palms (xr-tools blends by vote — different kinematics), ranged tiers (tier 1 can ride the lerp driver; tier 2 ballistic arc is new), grip poses as data tables (issue #4, not editor pose resources), item-type / save bridging including inert-on-addon-removal, and a single documented physics layer map (currently scattered: pickable 3, handle 19, held 17, menu 21).

Use as-is from xr-tools (no rework): pickables, one-hand grab detection, throw (velocity averager, 5 samples x impulse factor), snap zones/holsters, interactables (levers/buttons/hinges/sliders), player-body pushing.

Background. godot-xr-tools 4.5.2 is vendored unmodified in addons/godot-xr-tools/ (survey 2026-10-28). DEAD AIR's own grabbable/grab-point/ranged-grab are still stubs; there is no grab test; menu/sandbox interaction is pointer-only. Order of work. 1. DAFunctionPickup adapter FIRST: xr-tools pickup reads raw grip / trigger_click; DEAD AIR speaks da_* via RigInput. Dropping pickup in raw would bypass the generic layer, the SteamVR pause rules, and flat/headless testing. Pickup nodes belong under grip nodes, not aim nodes. 2. Then, on top: wrist pivot (xr-tools uses a palm-centre offset), two-hand midpoint-between-palms (xr-tools blends by vote — different kinematics), ranged tiers (tier 1 can ride the lerp driver; tier 2 ballistic arc is new), grip poses as data tables (issue #4, not editor pose resources), item-type / save bridging including inert-on-addon-removal, and a single documented physics layer map (currently scattered: pickable 3, handle 19, held 17, menu 21). Use as-is from xr-tools (no rework): pickables, one-hand grab detection, throw (velocity averager, 5 samples x impulse factor), snap zones/holsters, interactables (levers/buttons/hinges/sliders), player-body pushing.
Author
Member

Update from craftanything (upstream branch, tip c64b8bd). The core of this issue lands in-branch:

  • Hand interaction driven by RigInput (generic da_* actions), not raw XR input: HandInteractor, Grabbable, GrabPoint, RangedGrab, Snapper, Volume, Inventory, WorldItem.
  • Grip rules from #15 implemented: one hand pivots at the wrist, two hands at the midpoint between the palms. Throw works off the hand's recent velocity estimate (GameRules throw multiplier).
  • Grip poses and markers are data: ItemSpec (grip_poses + markers, validated) shared by GenericItem and ItemDefinition.
  • Physics layers written down as PhysLayers (world 1, entity 2, item 11, trigger 12, player 20); xr-tools' own layers (3/17/19) are left alone.

One divergence to flag: this is a hand-rolled interactor, NOT the DAFunctionPickup adapter to xr-tools that this issue planned. The behaviour is there; the architecture choice needs blessing.

Still open: bridge grab simulation (#26) and headset verification of how it actually feels. Verified on the branch (lantern-vm, Godot 4.6.3): clean double import, full headless suite list PASS. Branch state only — not in main yet.

Update from `craftanything` (upstream branch, tip `c64b8bd`). The core of this issue lands in-branch: - Hand interaction driven by `RigInput` (generic `da_*` actions), not raw XR input: `HandInteractor`, `Grabbable`, `GrabPoint`, `RangedGrab`, `Snapper`, `Volume`, `Inventory`, `WorldItem`. - Grip rules from #15 implemented: one hand pivots at the wrist, two hands at the midpoint between the palms. Throw works off the hand's recent velocity estimate (`GameRules` throw multiplier). - Grip poses and markers are data: `ItemSpec` (`grip_poses` + `markers`, validated) shared by `GenericItem` and `ItemDefinition`. - Physics layers written down as `PhysLayers` (world 1, entity 2, item 11, trigger 12, player 20); xr-tools' own layers (3/17/19) are left alone. One divergence to flag: this is a hand-rolled interactor, NOT the `DAFunctionPickup` adapter to xr-tools that this issue planned. The behaviour is there; the architecture choice needs blessing. Still open: bridge grab simulation (#26) and headset verification of how it actually feels. Verified on the branch (lantern-vm, Godot 4.6.3): clean double import, full headless suite list PASS. Branch state only — not in main yet.
Author
Member

Closing: the core of this issue is on main via the craftanything merge (PR #30, 94bb04078) and the work since — HandInteractor, Grabbable, GrabPoint, RangedGrab, Snapper, Volume, Inventory, WorldItem, grip poses + markers as data (ItemSpec), and PhysLayers — as recorded in comment 837. Divergences from the plan, for the record:

  • The DAFunctionPickup adapter to xr-tools was not built; the interactor is hand-rolled instead. That architecture choice is ratified in practice by every merge since that builds on it (sandbox, containers, editor, the #43 hand spike).
  • The two-hand midpoint rule was superseded by #33's pivot revision: the primary grip is master, the secondary hand steers pitch/yaw only.
  • The tier-2 ballistic-arc ranged grab was not built. If it is still wanted, it needs a new issue.
  • Bridge grab simulation stays open separately as #26; headset feel verification is ongoing work, not this issue's scope.

— Lantern, closing on merith's go-ahead to close tracking issues already merged via another means.

Closing: the core of this issue is on main via the craftanything merge (PR #30, `94bb04078`) and the work since — `HandInteractor`, `Grabbable`, `GrabPoint`, `RangedGrab`, `Snapper`, `Volume`, `Inventory`, `WorldItem`, grip poses + markers as data (`ItemSpec`), and `PhysLayers` — as recorded in comment 837. Divergences from the plan, for the record: - The `DAFunctionPickup` adapter to xr-tools was not built; the interactor is hand-rolled instead. That architecture choice is ratified in practice by every merge since that builds on it (sandbox, containers, editor, the #43 hand spike). - The two-hand midpoint rule was superseded by #33's pivot revision: the primary grip is master, the secondary hand steers pitch/yaw only. - The tier-2 ballistic-arc ranged grab was not built. If it is still wanted, it needs a new issue. - Bridge grab simulation stays open separately as #26; headset feel verification is ongoing work, not this issue's scope. — Lantern, closing on merith's go-ahead to close tracking issues already merged via another means.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
dead-air/engine#25
No description provided.