Product media placeholder
Replace this area with a screenshot or short walkthrough video during the media sweep.
Iterative solvers: value accumulation, mesh relaxation, distance constraint solving, rigid body physics (Planck.js/Box2D), and physics body readout.
Category key solversGenerated public nodes 16Registry source faster-motion-docs/node-registry.json
Nodes
| Node | Type | Context | Description |
|---|---|---|---|
| Constraint Solver | constraintSolver | shared | Multi-pass distance constraint solving. Maintains rest lengths between connected points. |
| Mesh Solver | meshSolver | shared | Iterative mesh relaxation. Averages vertex positions toward neighbors. |
| Physics Apply Force | physicsApplyForce | shared | F367 step 5 v2 — pulse-triggered continuous force on a body. On the rising edge of `trigger` (last frame ≤ 0, this frame > 0), the engine queues `force` for the next world step. Force in px/s². Held HIGH does NOT continuously apply — only the rising edge fires once. For continuous force, drive `trigger` with a `cycleClock` or rapid pulse train. |
| Physics Apply Impulse | physicsApplyImpulse | shared | F367 step 5 v2 — pulse-triggered instantaneous impulse on a body. Same shape as `physicsApplyForce` but applies an instantaneous velocity delta (Δv = impulse/mass) instead of a continuous force across one step. Use for explosions, kicks, projectiles — anything that should change a body's velocity discontinuously. |
| Physics Body | physicsBody | shared | One rigid body in the wired physicsWorld. Dynamic (default) or kinematic (param). Pose, velocity, and awake state are exposed as typed output ports — wire to `domPropertyWrite` for DOM consumers, to STN inputs for canvas consumers, or to `physicsBodyTransform` for fan-out to multiple consumers. |
| Physics Body Enable | physicsBodyEnable | shared | Pure sink (no outputs) that toggles a body's solidness via `bodySetEnabled`. Wire any 0..1 signal into `enabled` to make the body intangible while the signal is below 0.5. Pattern: `physicsCollisionPulse → pulseTween → expression(1 − progress) → physicsBodyEnable.enabled` makes a static body act as a "trampoline that breaks after one bounce" — the bouncing body falls back through the body for the duration of the pulseTween, then the body becomes solid again. A separate sink node (rather than an `enabled` input on `physicsStaticBody`) keeps the scheduler's dependency graph acyclic when the gating signal is derived from collisions on the same body. |
| Physics Body Lookup | physicsBodyLookup | shared | Body-id-as-input pose source. Takes a `bodyId` input that may change every frame (typically wired from `physicsCollisionPulse.otherBodyId` or `physicsMouseDrag.pickedBodyId`), reads the live body pose from the engine, and publishes pose + velocity outputs. `x`/`y` are converted to viewport pixels using the world's frame element so consumers like `cursorProximityWrite` and `domVariablesWrite` can use them directly. `frameX`/`frameY` expose the raw frame-local pose for graph nodes operating in physics coords. |
| Physics Body Stagger | physicsBodyStagger | shared | Runtime-fanout compound — one node = N physicsBody instances + N DOM transform writes. Resolves N elements at bind time from a plain CSS selector and creates one body per element with shared params. Per-element radius via `shape.radiusFromCSS: "--bd"` reads each element's CSS variable (same convention `staggerAnimate` uses). Saves ~3N nodes for ball-drop / scatter patterns. For per-element heterogeneity beyond size (different bodyKind / restitution per element), drop down to primitive `physicsBody` + `domPoseWrite` pairs. |
| Physics Body Teleport | physicsBodyTeleport | shared | Pure sink. On the rising edge of `trigger`, calls bodySetPose on the wired body — instantaneous position write, not solver-mediated. Optional companion bodySetVelocity. Use for "bounce once + fall through" without a global solidness gate (each contact teleports the colliding body past the obstacle, leaving the obstacle solid for everyone else), portal-style entry/exit, or reset-to-spawn on state change. |
| Physics Collision Pulse | physicsCollisionPulse | shared | F367 step 5 v2 — fires a one-frame `pulse: 1.0` on the frame a tracked body collides with another body. Filters by `bodyId` (required) and optionally `withBodyId` (specific second-body); set the `event` param to `start` (contact-begin) or `end` (separate). Composes 1:1 with `pulseTween`, state-machine triggers, and `expression` math for "ball lands → squash" or "two bodies meet → spawn". |
| Physics Force Field | physicsForceField | shared | F379 — continuous force field acting on a fleet of bodies each frame, computed from each body's distance to a moving (or static) field centre. Replaces JS-spring CSS effects (e.g. `cursorProximityWrite`) when targets are physics-bound elements: keeps everything inside ONE physics simulation, so cursor pushes and ball impacts compose cleanly through the engine instead of fighting at the CSS layer. |
| Physics Joint | physicsJoint | shared | F367 step 5 v2 — one constraint between two bodies. Backed by the engine's impulse-joint set. Four kinds: `distance` (rope-like, fixed length between anchors), `revolute` (pin joint, free rotation around anchor), `prismatic` (slider along axis), `weld` (fully fixed pose). Wire `bodyA` / `bodyB` from `physicsBody.id` outputs OR from indexed entries of `physicsBodyStagger.bodyIds` to address bodies inside a stagger. |
| Physics Mouse Drag | physicsMouseDrag | shared | Pointer-driven drag-to-throw. On `pointerdown` within `selector`, picks a body (either `bodyId` directly or by hit-testing `pickedBodyIds` against `pickElementsSelector`). The body stays DYNAMIC throughout the drag — the engine applies a per-substep force `F = stiffness × clamp(cursor − body, maxStretch) − damping × body_velocity` toward the cursor. Static walls stop the dragged body via the engine's normal contact resolution; the spring just pushes harder when the cursor goes past a wall. `pointermove` updates the cursor target; `pointerup` releases and exposes residual velocity (computed from the user's last ~80ms of pointer motion, applied to the body so flick-to-throw lands cleanly). |
| Physics Static Body | physicsStaticBody | shared | Immovable static collider — walls, floors, arc-shaped bowls, sensor trigger zones. No pose outputs (it never moves), only an `id: float` for joints + event listeners. The `arc` shape is parameterised as a circular segment of N edge-chain segments, used for the dental ball-drop cup brim. **F381 P2.2 — `shape.kind: 'fromGeometry'`** reads vertex data from a wired `glyphGeometry` / `shapeGeometry` / `softMesh` source via the `vertices` + `subpathStarts` + `ringSubpathCounts` typed input ports. One closed polyline body is created per OUTER ring (hole subpaths are skipped — balls land on top of an "o", not inside its counter). For multi-glyph text, this means N rigid colliders are created with `id` reporting the first one (sentinel; use `physicsStaticBodyEach` or `physicsBodyLookup` to enumerate). Pair with the SAME geometry source feeding a `softMesh` so visible mesh + collider stay aligned by construction. |
| Physics Static Body (per element) | physicsStaticBodyEach | shared | Multi-element static collider. Selector matches N DOM elements via `querySelectorAll`; spawns one static body per match, each tracking its element's live BCR. Per-frame translation-only resampling (translation-invariant — the engine preserves contact pairs across pose changes). Use when N elements share the same physics tuning but each needs its own body — per-letter colliders driven by `splitText`, per-card colliders in a forEach layout, etc. |
| Physics World | physicsWorld | canvas | One rigid-body simulation world. Wire `gravity` from a `constantVec2` (or set the param), gate `paused` from a scroll-trigger threshold, and the world ticks every frame in play mode (skipped in seek). Bodies, static bodies, joints, and event listeners register with this world via their `world` connection — only ONE `physicsWorld` per scene. Lazy-loads the physics WASM module on first bind; scenes without any physicsWorld pay zero overhead. F236-compliant (reads ambient deltaTime; never an input port for time). |