Guide7 min read4 sections

Shared ragdolls — Marionette court

docs/RAGDOLLS.mdSource updated 2026-10-26
Markdown
On this page 4 sections

Marionette court introduces an original articulated beech mannequin with a teal vest and brass joints. Its eleven physical parts and ten joints form one shared assembly. This is the first playable ragdoll increment; the player collapse/get-up path is now available below, while final character art remains unfinished. Traveler practice now adds a physical skin binding, described below.

The posed shared mannequin
The posed shared mannequinExpand ↗

#Try it

Run npm run dev:editor, open the printed private URL and choose New world → Marionette court. Name the world, preview it, Save, then Apply. Open the shared playtest in separate browser profiles for two travelers.

Approach the mannequin and press E to tip it. The other traveler sees the same fall. Once it has fallen, approach and press E again to restore its standing pose. Make room around its original position first: scenery, other bodies and recently observed travelers can block the reset. Walking into it also applies the existing room-owned contact impulses. Reloading restores the current physical pose rather than starting another independent simulation.

Select a part and open Floating physics. Joint type chooses a one-axis hinge or a ball joint; the saved local pivots must meet. Density and friction use the existing Save/Undo/Redo workflow. The pelvis marks Reset this linked ragdoll together. Each connected ragdoll needs exactly one root and 3–16 bodies arranged as a tree, within the existing 32-body world budget. Adjacent connected parts do not collide with one another; other pairs still collide.

For a fresh persistent room, DW_ROOM_TEMPLATE=mannequin uses this scene with the existing Docker/PostgreSQL setup. Existing rooms keep their pinned world. This increment does not deploy or replace production content.

#Implementation and review notes

World format 34 and compiler ragdoll-world.34 add body-ball.1 joints and the ragdoll.1 root marker. Knees, elbows and the waist use limited hinges; shoulders, hips and neck use free spherical joints. A saved RagdollPose root component controls the complete assembly: its parts are kinematic while holding the authored pose, then become dynamic together on interaction/contact. Portable room frames carry the root's ragdollPosed flag; native restore checks that every part agrees with the root's body mode. Reset clears velocities and joint impulses and restores the kinematic standing pose. It is an explicit pose reset, not an animated get-up transition. Runtime poses and joints use the existing room snapshot, publication, ownership fencing and native recovery paths.

The pinned Rapier 0.21 build reports its spherical factory result as Generic. Recovery compares the result of the same factory, anchors, frames and body identities, while retaining the hinge limit checks. Native continuation checks cover the actual mixed-joint rig. Review generic-joint degree-of-freedom and motor state introspection during the final snapshot-contract audit; the public API does not expose every native field.

Thirteen focused native/link checks, two PostgreSQL recovery/fencing checks, type/import checks and the software-WebGPU shared browser journey pass. The browser run also packages the client and immutable engine. Standing/fallen and editor renders were reviewed. This does not qualify the remaining character work. Keep these items open:

  • Refine animation-to-physics and get-up transitions. Shared player collapse/get-up now exists separately from this authored practice prop.
  • Add anatomical cone/twist limits for shoulders, hips and neck; the current ball joints intentionally rotate freely. Review self-contact and joint tuning across different body proportions, high impacts and crowded interactions.
  • Qualify physical/mobile GPUs, long sessions, trusted browser movement, repeated live edits, portal/cargo crossings and separate-owner handoff. Existing room snapshots do not prove that full matrix.
  • Review reset behavior during simultaneous requests and stale/offline traveler presence. The current shared reset checks the acting traveler and latest room observations, not a distributed occupancy lock. Pose release currently handles player contact and explicit tip/push; qualifying impacts from other dynamic objects is open.
  • Refine assembly editing, selection, joint visual guides and narrow layouts. Finish the required character/environment/arrival art pass; the mannequin is a functional original prop, not approval of the existing player models.

#Physical traveler — early testing

Choose New world → Traveler practice, then Save → Apply. This uses the existing traveler model with fourteen skin joints following eleven hidden physical bodies. Both travelers see the same fall, reload retains the fallen pose, and E restores the standing figure through the existing checked reset. For a fresh persistent room use DW_ROOM_TEMPLATE=traveler-practice.

Select traveler-skin → Physical skeleton… to inspect or change which body moves each joint. Preview and Save use ordinary saved undo. Bind every skin joint to a part of the same ragdoll assembly. The model must be independent, without collision or animation/movement behaviors; physical bodies supply the collision. Position the skin over the standing skeleton before binding it. Its physical parts remain selectable by name in the object list under Floating physics.

World format 35 (physical-skin-world.35) stores the mapping in ragdollSkin. The compiled RagdollSkin component retains the authored body rest poses. The renderer applies each body’s rigid movement to its bound joint’s model rest pose; body dimensions do not scale the skeleton. Incremental body updates invalidate the dependent skin, using the same palette renderer as animated characters.

Review after implementation is complete:

  • Replace/refine the unapproved traveler art, skin weights, clothing deformation, contact shapes and anatomical constraints. This is functional character physics, not the final character art pass. The interaction still calls the figure a mannequin; refine that copy alongside the final character interaction design.
  • Add smoother animation blending to player collapse/get-up. The authored prop reset remains immediate and returns to its authored location; players recover near their fallen body instead.
  • Qualify arbitrary imported rigs, rotated/scaled placements, full-assembly duplication/prefab reference remapping, live rebindings, and portal/cargo travel. Invalid references are rejected; assembly-copy ergonomics are not finished.
  • Run the full persistent/trusted/hardware/fault matrix in final qualification. This increment’s smoke coverage is the software-GPU editor/two-player journey (saved binding edit/undo, tip, reload, reset), source/pose validation and incremental projection/checkpoint restoration. It does not claim the broader matrix passed.

#Player collapse and get-up — early testing

In the player, press R or click Collapse. The same button becomes Get up. The binding is editable under Controls. The owned character motor releases an eleven-body humanoid with ten joints, disables its walking capsule, and shares the physical skin pose with the other travelers. Movement stays disabled while down. Press R again to look for supported, clear standing space near the fallen pelvis. A low ceiling or other scenery can block getting up; clear that space before retrying. This does not send the player back to the original spawn.

The focused software-WebGPU journey covers two browser profiles, Worker and main-thread rendering, collapse, visible fallen avatar, local reload and get-up. Four native checks cover native checkpoint continuation, canonical and portable saves, physical-avatar projection, blocked clearance, held-input suppression, trusted input, prediction reconciliation and durable-pose admission. Type/import checks and browser client/engine packaging pass. The fallen-avatar render was reviewed. No full hardware, database failover or long-session matrix was run for this increment.

Character checkpoint format 6 retains native articulated bindings and the input edge. Portable motor state carries body poses and velocities. Presentation format 19 and remote actor component version 6 carry a bounded humanoid pose. Durable presence admission reconstructs that pose at rest; exact ongoing native velocity continuation requires the native checkpoint. The standard traveler rig binds its fourteen joints to the eleven physical parts. Local saves retain the fallen state.

Review later:

  • Blend from the current animated pose into physics, animate getting up, improve the collapsed first-person view and nameplate placement, and finish the required character art/skin-weight/clothing pass. The current transitions are immediate.
  • Add anatomical cone/twist limits and review native joint anchors, axes, limits, motor parameters and collider policies in the final snapshot-contract audit.
  • Qualify player-player contact, simultaneous recovery occupancy, vehicle release, terrain edits, water, portal travel and network-owner handoff while collapsed. Clearance currently checks the local physics scene, not a distributed lock on space occupied by other players. Other players are still presentation peers.
  • Generalize the built-in humanoid profile for different body proportions and imported rigs. Automatic impact-triggered collapse and fully canonical ECS limb entities are still open; current articulated state lives in the motor's native checkpoint and published player state.
  • Run the persistent trusted browser/database restart and device/performance matrix in final qualification. Presence restore resumes at rest, and local pause retains the existing behavior of pausing that player's owned simulation.

Owned player joints now include bounded neck, shoulder and hip swing/twist; see owned cone/twist limits. Use a new owned test release to get the new pinned solver. Press R to collapse, reload to restore the fallen pose, then press R to recover. Final anatomy and character art still need their planned review.

End of Ragdolls