- research/nimso-project-tx.md: chronological per-video notes 2017-2026, topic synthesis, VR Messs scope, proportions & calibration (Winter/Drillis-Contini/Dempster tables verified), open unknowns - research/sources/nimso-transcripts/: yt-dlp auto-caption transcripts + dated index (re-pullable) - research/vr-physics-rig-hexabody.md: BIMOS/HexaBody/Boneworks reference, Box3D native joint mapping (spherical/motor/prismatic/distance), superseded-as-target note - AGENTS/HANDOFF research pointers Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
15 KiB
Research: the Nimso / Boneworks-family physics player rig (2026-10-02)
Read nimso-project-tx.md first — the exhaustive transcript study of Project TX (the design VR Messs
is copying). This file keeps the Boneworks/BIMOS reference (useful for room-scale reconciliation and joint
values) and the Box3D joint mapping (§4). The BIMOS locoball rig is NOT the target design: Project TX has no
ball/capsule — the player is a muscle-driven ragdoll (§6–7 below and the TX doc).
Goal (owner): copy Nimso's VR physics character controller as closely as possible. [S] = sourced, [I] = inference. Read before touching the player body / locomotion.
1. What Nimso has published (primary sources)
- [S] Nimso's internals are NOT documented anywhere public — no source, no write-up. The technique lives in
his YouTube videos (
youtube.com/@NimsoStudios) and itch pages/comments. - [S] Walk-O-Motion comments (developer replies, https://nimsostudios.itch.io/walk-o-motion-vr-with-physics/comments):
- "Half your body is a spring joint that acts as your legs" — you slide over low ledges by crouching.
- "I didn't program climbing, or pole vaulting, or rope swinging" — "side effects of physically attached hands"; "all I did was make your hands attach things correctly to your character body".
- "there is no top speed" (jogging harder = faster); jumps are "literally just tiptoeing quickly"; "you can use the analogue to move in air slightly"; joints "stabilised and slightly weakened … to be much more realistic".
- [S] Hybrid Presence devlog (2019): "purely Physics based motion" → "a slight lag … between the VR Tracking and applying motion"; a smoothing attempt made it worse, so it was reverted to direct motion; physics rate raised to 90 Hz (https://nimsostudios.itch.io/hybrid-experimental/devlog).
- [S] HYBRID Test Chamber (https://nimsostudios.itch.io/hybrid-test-chamber-tech-demo): stick = direction, starts slow; sway in place = faster walk; jog in place ("natural bounce frequency") = run; two-handed items blend primary-hand rotation with secondary-hand position; "Shoulder Logic hasn't been implemented yet".
- [S] Hybrid Locomotion 2 is "the backend VR Rig and Locomotion system behind … ProjectTX"; modes Hybrid (walk-in-place + stick direction), Accessibility (seated), Exploration (playspace-averaged steering).
- [S] Later work (Spatial Syntax article): fully physics-based body + hands, "interaction retargeting between characters of very different sizes and strengths"; arm muscles can't lift the full body weight one-handed and strength depends strongly on arm angle.
- [I] Everything public places Nimso in the Boneworks "hexabody" family: a physics body whose lower half is a spring "leg", hands jointed to that body (forces flow both ways), physics-native locomotion. His differentiators are the locomotion input layer (sway/jog detection), muscle-angle strength, proportions retargeting, and later full active-ragdoll legs (Project TX). Those need the video extractions.
2. The family's documented structure
- [S] Boneworks player = 6 rigidbodies; Bonelab added arms + chest (11); Marrow 2 = 18 bodies, legs added, ball removed (Brandon Laatsch, https://x.com/BrandonJLa/status/2009741997897044046).
- [S] Boneworks: movement input goes through "a highly frictionized rigidbody sphere"; collision only on hands, head and foot-ball (https://boneworks.fandom.com/wiki/1Marrow_Interaction_Engine).
- [S] HexaBody (commercial Boneworks clone, https://cloudwalker2020.github.io/HurricaneVR-Docs/manual/hexabody/hexabody.html): rolling locoball; crouch/jump by raising/lowering the lower ball/knee; "inverse forces applied to the player via the Hand rigidbodies"; fender collider slightly larger than the ball stops wall-climbing; fixed-height body with Eye Height calibration (sit mode = raise camera; stand mode = scale the tracking space).
3. BIMOS — the open-source reference implementation (MIT, https://github.com/KadenZombie8/BIMOS)
Verified by reading the source and the [BIMOS] Player Rig.prefab joint data (2026-10-02):
| Body | Mass | Joint (to) | Config |
|---|---|---|---|
| LocomotionSphere | 20 kg (5 kg mid-jump) | — | rolled by SETTING angularVelocity = (moveDir rotated 90° about up) × WalkSpeed 7.5 (Run 15); maxAngularVelocity ∞; high-friction material when grounded (slope ≤ 50°), low when not; anti-roll force on slopes |
| Fender | 5 kg | Fender→Sphere | linear locked, angular free (ball joint) — bumper around the ball |
| Pelvis | 40 kg | Pelvis→Fender | ONLY Y free, limited 0.65 m; Y drive spring 80 000, damper 10 000, max 10 000 N; target = −FenderPelvisOffset (crouch: 0.2–0.55, tiptoe 0.65) = the spring legs |
| Head | 1 kg | Head→Pelvis | only Y free; Y drive spring 5e7 (rigid); target = pelvis.y − camera.y each tick |
| HeadCollider | 1 kg | same as Head | |
| Hands | 2 kg each | Hand→Head | linear LIMITED 0.67 m (reach sphere), XYZ drive spring 10 000 / damper 500 / max 5000 N; angular free with slerp drive 300 / 10 / max 100; targetPosition = controller target − head position, targetRotation = controller rotation |
- Rig layer ignores self-collision. Physics at 144 Hz (
Time.fixedDeltaTime = 1/144). - The XR rig is PARENTED TO THE PELVIS — the camera rides the physics body.
- Room-scale (
RoomScaleMovement): each fixed step,delta = camera.xz − rig.xz;MovePositionevery body (sphere, fender, pelvis, head, and hands if grounded) bydelta; then subtractdeltafrom the camera offset. Real walking becomes physical body motion, so walls stop it; the camera follows wherever the body ended up. Vertical: head joint target from camera height; camera offset y from the leg compression. - Turning: rotate the controller rig about the pelvis (snap 45° default / smooth).
- Jump: anticipation crouches the leg spring, release softens the spring by crouch depth
(
41000/crouch − 26000) → the legs push off; legs retract/extend in air; sphere mass dropped to 5 kg in air. - Scale:
rig.localScale = 1.65 / HeadsetStandingHeight— fixed-size character, scaled tracking.
4. Mapping to Godot 4.7 + Box3D (our fork)
- [S] Box3D natively has every joint the rig needs (
.vendor/godot-box3d/box3d/include/box3d/):b3PrismaticJoint(spring hertz/damping, target translation, limits, motor) = leg/head sliders;b3MotorJoint(linear/angular springs with max force/torque, retargetable viab3Joint_SetLocalFrameA/B) = hand drives;b3DistanceJoint(length range) = 0.67 m reach sphere;b3SphericalJoint(cone/twist limits, target-rotation spring, torque motor) = ball/fender and later shoulders/wrists. - [S] The wrapper exposes only pin/hinge/slider (slider ignores springs)/cone-twist(→weld, our patch);
Generic6DOFJoint3Dis a hard error. Godot'sGeneric6DOFJoint3Dhas per-axis linear/angular springs (stiffness, damping, equilibrium point), limits and motor force limits — the ConfigurableJoint analog — and Jolt implements it, so mapping it in the fork keeps gameplay code on standard nodes (Jolt fallback). - [S] Wrapper supports axis locks (→ b3 motion locks),
cast_motion,intersect_ray,get_rest_info. - [I] Unity drive (spring k, damper c) ↔ Box3D (hertz, ζ): hertz = √(k/m)/2π, ζ = c / (2√(k·m)) using the driven body's effective mass. BIMOS legs (k 80 000, c 10 000, ~45 kg) ≈ 6.7 Hz, ζ ≈ 2.6; hands (k 10 000, c 500, 2 kg) ≈ 11 Hz, ζ ≈ 1.8. Box3D clamps spring hertz to ≤ ¼ of the substep rate (stable).
5. Implications for VR Messs
- Our current body is the inverse of the family design: bodies chase world-space targets and the camera is kinematic; nothing transmits hand forces into the body. The family design makes the body the player and the hands jointed to it — that single change is what makes walls, climbing, push-offs emerge.
- Our arm segments, grab welds, NaN hardening and spike harness carry over; PhysicsHands' world chase and PhysicsTorso's head-chase get replaced by joint drives on the rig.
6. Project TX itself — from Nimso's own video transcripts (2026-10-02)
Method: yt-dlp --skip-download --write-auto-subs over the 85 physics/TX/Hybrid videos of
@NimsoStudios → 80 auto-caption transcripts (~184k words; scratchpad, not committed — re-pull with the
same command). Auto-captions are noisy; quotes below are his words, lightly de-garbled. NOTE: a Google-AI
summary the owner relayed claimed Nimso wrote BIMOS — false (BIMOS is KadenZombie8's A-level project);
AI summaries of his channel blend sources, prefer transcripts.
- [S] No locoball, no capsule — the player IS a ragdoll. "right now the entire player system is a full rag doll — no Collision exists outside of the rag doll" (3-DOF FULL TILT, D4SfYp2e1oI). The whole character can rotate ("full tilt") — designed in from day one because every system must handle it.
- [S] No IK. "IK-Less Control" (9IDhcrzJtY4): the arm is a physics joint chain with bone/muscle limits; the hand is driven to the tracked point and the elbow lands where the joints put it — "when my elbow touches the wall my hand is exactly where I want it". Elbow steered by "a simple calculation" from hand twist. Joint limits replace IK constraints.
- [S] Three layers (New Physics New Control 9f7Bq_R_wHs; Scalable VR Body yPsCuuNM3lM):
- True Body — from head + 2 controllers + the user's measured profile: "derived elbow positions, logical shoulder control", chest position + rotation, hip position "with a little bit of velocity and acceleration control on the hip". "not true IK — just a bit of extra trigonometry to decide where the elbow is based on the shoulder and the hand".
- Scaled Body — True Body retargeted to the avatar's proportions/profile (Mario, Bowser…), scaling from the shoulder so full stretch stays full stretch; avatar bones mapped via a profile system, offsets auto-generated.
- Ragdoll — generated "with a single button" from the avatar profile; colliders custom-modelled anatomical shapes; "the spine is holding itself in its angular, the elbows are holding themselves in the angular" (joint angular drives to the scaled pose) + hands driven to tracked points. Interpolated for rendering; everything runs in FixedUpdate.
- [S] Strength is emergent from the joint drives: a weight held far out can't be lifted, close to the body it can, over the shoulder/overhead it can be held one-handed; "the elbow is no longer pushing up … on the hand because of the wrist strength" when extended; leaning on a wall works until the arm extends.
- [S] NPCs use the identical ragdoll fed by animation/AI instead of tracking; stumble/balance; "tension controls" (loose when idle) planned (Muscle based Ragdoll g84iUSVoQUI).
- [S] Locomotion = a separate "ground control" system; at the rewrite the ragdoll legs "just don't have collision at the moment — I'm doing some clever work on the ground"; slopes beyond some angle can't be climbed with no special-casing; small steps are stepped over. Camera is itself a physics collider ("climb on the camera"). Movement direction is "hybrid": hand-directed, falling back to head-directed when hand rotation is "illogical" (sword swings).
- [S] Feel goal: "it should never feel like a rag doll"; hands "super nice and soft"; differs from Bonelab by tuning — "more damped in certain areas, slightly weaker and stronger in certain areas".
- [S] Joint stability trick (tutorial nArwDeA2Ko4): welded objects merged into ONE compound rigidbody with a corrected centre of mass instead of fixed joints — kills light-on-heavy wobble.
- [S] Procedural legs, zero animation (New Adaptive Leg System i7F4V9K6SlU): gait is not a 50/50 step timer — at speed both feet leave the ground (flight phase), stepping rate stays lazy while stride/lift change; adapts to moving ground, crouch, swimming kicks, any avatar. Hip is flexible ("hip kicks out") → crawling through tiny gaps. "there's no physics capsule or anything like that, there's no character controller object … it's just all a ragdoll and the actual collisions happen on the character body" → leaning over tables works because the collision is at the real hip/spine/chest.
- [S] Tracking is a guide, never the final pose: only the HMD camera is 1:1; hands/hips/feet are derived targets the physics tries to reach ("you have to use the tracking as a guide system"). Even full-body tracking wouldn't change that. Works without controllers (hand tracking) — the derivation is the system.
- [S] Ground/leg force exists and scales with mass: on-screen ground force ~1100 N standing, ~5000 N spike on jump; Master Chief 430 kg, Kirby 30 kg; "it changes the mass of the character … which means the grounding has to be stronger as well, so the leg strength is stronger"; "full physics on the ground detection"; "not as simple as just having a ground system that simply goes down". Per-avatar leg strength → jump height (Mario high, Grunt low), per-avatar speed.
- [S] Avatar adaptation (ADVANCED BODY ADAPTATION WGgPrne7Ctk): user metrics → any character; arms scaled from a chest centre line at the shoulder point (not Bonelab's hand-pull scaling) so hands meet when real hands meet; per-character POSE profiles (Eggman crouches by pushing the hip out, not folding the belly); colliders match the avatar; jump by body motion (no button) in exploration mode.
- [I] What remains unpublished: the exact ground-control force law (support spring on the pelvis from ground detection is the obvious reading), joint drive gains/torque budgets, the elbow "simple calculation", gait math. These are tuning/derivation details to rebuild, not architecture.
7. Architecture to build (Project-TX-faithful, Box3D)
- True Body (C#, every physics tick): head + 2 controllers + user profile → target pose for every bone (chest pos/rot incl. crouch lean, shoulders, trig elbows steered by hand twist, hip with velocity/acceleration lag). Our BodyRig/PhysicsArms IK + torso-yaw math is the seed.
- Scaled Body: retarget to the avatar profile (placeholder boxes first; real characters later).
- Ragdoll player: pelvis, spine/chest, head (collider, camera reference), upper arms, forearms, hands, thighs, shins, feet. Joints: spherical (cone/twist limits) for shoulders/hips/wrists/neck/spine, revolute for elbows/knees. Muscles = per-joint angular PD via torque-capped joint motors toward the True-Body local rotations (hierarchical budgets) — strength emerges. Hands additionally pulled to the tracked targets with a force-capped drive (guide only). No capsule, no ball.
- Ground control: ground detection under the feet/pelvis → support force on the pelvis (leg strength ∝ mass), horizontal movement force with acceleration limits from stick / room-scale; procedural leg targets.
- Camera: HMD stays 1:1 relative to the head body; the play space follows the ragdoll (room-scale deltas
become body motion, BIMOS-style), so walls stop both stick and real walking.
Box3D needs from the fork: spherical joint with cone/twist limits + torque-capped motor (
b3SphericalJoint), revolute motor (already mapped via HingeJoint3D), a force-capped target drive (b3MotorJoint).