RDK Workbench

RDK Workbench three.js r128 · structure from motion

A random-dot kinematogram. Dots on the object's surface ride along with it while background dots stay put, and the dot density is matched everywhere, so any single frame is featureless noise. The shape exists only in the motion.

Starting…

Things to try

  • Freeze. The shape vanishes the instant motion stops. Step through scenes while frozen to confirm there's nothing to see.
  • Lower coherence until the shape breaks up. Note where it goes for you, then try again with a different dot size.
  • Shorten lifetime to 2 or 3 frames. Each dot moves for only a moment, yet the shape holds.
  • Message: drag Lift to 0, then Thickness to 0. The text weakens with the first and disappears with the second.
  • Dot count or dot scale? At Lift 0, compare 1 px at 3% with 2 px at 12%. Both give the same dots per pixel. Then try 2 px with Sub-pixel on, or at 2× speed.

Keys: Space freeze, R reveal, F full screen, N and P step through scenes.

Pipeline

  1. Each mesh is sampled once with area-weighted random points, stored as triangle and barycentric pairs, so the dots stay attached when the mesh deforms.
  2. The meshes draw depth only, which hides dots on far surfaces. Surface dots then draw on top, and background dots draw behind at the far plane.
  3. Everything runs in vertex shaders. There's no readback, so frame cost is mostly the CPU update for deforming meshes.

Density matching

p = D · a · cos θ · (f / z)²

A surface sample of area a at distance z, tilted θ from the view, covers that many screen pixels, so it is kept with probability p. That cancels foreshortening and perspective and leaves D dots per pixel everywhere.

Without this, grazing surfaces pack their dots densely and the outline shows in a still frame.