Files

6.2 KiB

Research: grabbing/picking up physics objects in VR (for physics-hands rigs)

Third research pass for VR Messs, after script-level grab welds (PD force weld, then rigid-follow-with-yield) proved unstable: launched objects, hand drift, limit cycles. Label: [S] = sourced, [I] = inference. Companion to vr-arm-ik.md / vr-arm-ik-deep.md.

Sources verified (primary where possible)

Taxonomy

Approach (who uses it) Stability Weight feel Two hands Cost in Box3D
Freeze + kinematic drive (xr-tools, XRIT Kinematic) High (boring-safe) None real; faked via clamps Blend two drivers; source-verified Low
Velocity-tracking hold (XRIT VelocityTracking, VRIF Velocity) Medium — lag/jitter documented Good (real mass resists) Weak; lag reported Low — but this was our unstable design
Joint hand→object, force-limited hand (Boneworks, B&S, VRIF Physics Joint, H3VR [I]) High IF the solver owns the coupling Best: hand lags under load, the hand's force budget does the work Second joint to the same body (B&S model), or single-hand-only (VRIF) Medium
Rigid weld/parenting (Alyx-style) High but fake Tuned by illusions Cut by Valve for good reason High (needs 6DOF)
  1. [S-backed] Position coupling: PinJoint3D hand→object at the grab point. Stop setting object velocity — velocity override + reaction force = two controllers fighting one integrator (the limit cycle we hit). Let the engine's joint solver own both bodies (ODE/force-limit literature; matches Boneworks/B&S/VRIF). One authority, no fight.
  2. [I] Rotation: clamped angular spring on the held object toward the hand's grip orientation (angular-velocity chase toward the basis delta, capped ~20 rad/s), owned by the PRIMARY hand only. With only Pin/Hinge/Slider, the pin gives position for free; the clamped spring supplies rigid-grip feel without 6DOF.
  3. [S] Weight feel = the existing hand force budget. Don't clamp object mass; heavy objects drag the hand through the joint (Boneworks tug-of-war). Optionally scale the rotational spring by mass (nose-heavy guns).
  4. [S] Grip break: Godot joints have no break force — monitor the joint anchor separation; sustained error over N ticks = grip ripped away (same effect as VRIF Break Distance, manually).
  5. [S] Two hands: BOTH hands PinJoint to the same object (B&S twoHandedRequireSamePhysicbody model). Primary hand owns the rotation spring; secondary adds position only. Do NOT connect the hands through the object — Valve cut that.
  6. [S] Fallback if Box3D's pin joint proves too soft/unstable: the xr-tools pattern — freeze the held body, drive it kinematically to the hand each tick, restore velocity on release, blend second-hand drivers. Zero instability, weight feel becomes theater.

Note: our physics hands already chase with forces, so the joint approach slots straight in — the hand body IS the Boneworks setup; only the grab coupling was wrong.