Intangible Interaction — Professor Yeseul Song
Dimmy the Cube: Development Journal
A photophobic 100mm cube that lives in an illuminated wooden arena, fleeing light and resting in the dark.
Concept
Dimmy is a small cube that wants to avoid light. It lives inside a 3×3 foot wooden enclosure lined with a NeoPixel LED strip — one white LED every inch along the inner perimeter. The arena's four corner sensors plus eight inner-wall ultrasonic sensors continuously map the light distribution across the space. Every five seconds Dimmy reads those sensor inputs, and if one side of the arena is brighter than the others, it rolls away — two flips at a time — toward the darker corner.
When the light is even — or absent — Dimmy settles. After about a second and a half of stillness it begins to breathe: a slow, deep 8-second scale cycle. Occasionally it emits a brief warm firefly glow, as if thinking. The moment light becomes directional again, both effects vanish and Dimmy tenses up, waiting for its next decision window.
Interactive Simulation
Move your mouse across the canvas to illuminate the arena. The LEDs brighten near the cursor. Dimmy will read the sensor array every 5 seconds and roll away from the light source. Keep the mouse still or off the canvas and watch Dimmy settle into its breathing state.
Top-down simulation. Mouse = light source. Cyan markers = ultrasonic sensors.
The Arena
The physical enclosure is a 3×3 foot wooden box with 0.5-inch thick walls. Each foot is represented as 120 pixels in the simulation, giving a 360×360 px interior surrounded by a 120 px border — the physical gap around the box. The wood colour is a mid-toned brown; the outer border represents the table or shelf surface the arena sits on.
| Parameter | Physical | Simulation |
|---|---|---|
| Arena interior | 3 ft × 3 ft | 360 × 360 px |
| Scale | 1 foot | 120 px |
| Wall thickness | 0.5 inch | 5 px |
| Cube size | 100 mm | ~39 px |
| LED spacing | 1 inch | 10 px |
| Total LEDs | 144 | 144 |
LED Strip
A NeoPixel strip runs clockwise around the inside perimeter of the enclosure — one addressable white LED every inch, 144 total. In the simulation each LED's brightness is driven by the distance from the mouse cursor, with a smooth falloff between 1 inch (full) and 10 inches (off). Two layered glow ellipses at 40 px and 20 px diameter give the warm pooling effect of real diffused LEDs on a wooden surface.
Sensor Array
Twelve ultrasonic sensors are arranged in two groups:
- 4 corner sensors — mounted just outside the frame at each corner, facing vertically upward.
- 8 inner-wall sensors — one per foot along each internal wall face (at the 1 ft and 2 ft marks), also facing upward.
In the simulation each sensor is drawn as a small housing disc with two concentric rings — a top-down view of an upward-facing transducer. A transparent cyan activation circle grows in radius and opacity as the light source approaches, visualising the sensor's reading.
The decision logic averages LED brightness across each of the four walls (N / S / E / W). If the maximum wall reading minus the minimum is below 0.05, the light is considered even and Dimmy stays put. Otherwise it scores each movement direction by the brightness of the opposite wall and picks the best two-flip route away from the light.
Cube Behaviour
Dimmy moves by rolling — pivoting over one edge at a time. Each flip is one cube-width (100 mm). The standard move is two flips in the chosen direction; if two flips would leave the arena, Dimmy takes one flip instead. If blocked on all sides it waits for the next five-second window.
The top-down rolling animation is a genuine projection: as the cube tips over its pivot edge the visible footprint collapses to a line at the midpoint, then expands on the far side — recreating what you would actually see looking straight down at a rolling cube.
Idle State — Breathing & Firefly Glow
Three conditions must all be true before Dimmy enters its comfortable idle state:
- No active flip animation.
- No inter-flip pause (the brief gap between the two flips of a move pair).
- Wall light readings are balanced — no directional threat.
Once all three hold, a comfort factor ramps from 0 to 1 over ~1.5 seconds. The cube breathes — scaling ±20% over an 8-second sinusoidal cycle — with amplitude proportional to the comfort factor, so it eases in rather than popping on. At comfort > 0.5 a firefly schedule opens: random warm-yellow glow pulses every 1.8–6 seconds, each decaying exponentially over ~30 frames. The instant any condition fails the comfort factor drops to zero, both effects vanish, and the glow is zeroed.
Next Steps
The simulation is a design and logic testbed. Physical build goals:
- Construct the 3×3 ft wooden enclosure with routed LED channel on inner perimeter.
- Wire 144 WS2812B LEDs driven by an ESP32 or Raspberry Pi.
- Mount 12 HC-SR04 ultrasonic sensors (4 corners external, 8 inner-wall).
- Design a motorised rolling mechanism inside the 100mm cube housing.
- Implement real-time sensor fusion and the same decision logic in firmware.