Product media placeholder
Replace this area with a screenshot or short walkthrough video during the media sweep.
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.
Inputs
| Port | Type | Description |
|---|---|---|
world | any | Wire to the sibling `physicsWorld.world` output. Loader resolves the connection at bind and registers all N bodies in this world. |
Outputs
| Port | Type | Description |
|---|---|---|
bodyIds | floatArray | Engine handles in document-order (matches the `querySelectorAll` order). Wire downstream into per-body consumers. |
count | float | Number of matched elements / spawned bodies. |
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
selector | elementSelector | "" | Multi-match CSS selector. Every element matched by `querySelectorAll` at bind time becomes its own body. |
mode | enum | "kinematic" | Kinematic: rigid obstacle whose pose tracks the element BCR each frame; ball impacts cannot move it but it correctly pushes balls when CSS displaces it. Dynamic: spring-tethered to the element BCR; ball impacts knock it; spring pulls it back. Patrick Heng-style letter wobble uses Dynamic. options kinematic, dynamic |
restitution | float | 0.5 | Bounce coefficient. 0 = no bounce, 1 = perfectly elastic. min 0; max 1; step 0.05 |
friction | float | 0.5 | Friction min 0; max 2; step 0.05 |
isSensor | bool | false | When true, generates collision events but does not push other bodies. |
stiffness | float | 80 | Dynamic mode only. Spring force per pixel of displacement from home. Higher = faster snap-back. min 0; step 5 |
damping | float | 8 | Dynamic mode only. Velocity-opposing damping. Higher = fewer wobble cycles before settling. min 0; step 0.5 |
density | float | 0.5 | Dynamic mode only. Mass per unit area. Lower = lighter / easier to knock. min 0.01; step 0.1 |
Use cases
- Per-letter physics — `splitText` produces N `.ft-split-char` elements; `physicsStaticBodyEach { selector: ".ft-split-char" }` gives one body per letter. When `cursorProximityWrite` shifts a letter via CSS transform, that letter's body tracks the new BCR — visual gaps become physical gaps and balls fall through them.
- Per-card colliders for a list layout where each card should bounce independently when knocked.
- Per-instance colliders downstream of `forEach`-expanded slides without authoring N nodes by hand.
Related nodes
Envelope
Use physicsStaticBodyEach as the node type inside a graph node envelope. Add id, optional params, optional connections, and optional activeWhen based on the guide context.
Generated source
Registry faster-motion-docs/node-registry.jsonCategory page /help/faster-motion/faster-motion-node-category-solvers/