All writing

Interaction design · Spatial computing

Finding a Wall

Choosing a readable place for a hint in an unfamiliar room, then keeping it stable.

A wall seems an obvious place for a hint. The game still has to choose one.

In Blackbox for Vision Pro, we wanted some clues to appear in the player's own room instead of on a floating interface. I built a system that used the available room data to find suitable walls and place the text.

A detected surface is only a candidate

The fact that a surface exists does not make it useful. It might be too small, outside the player's view or facing an awkward direction. I considered the size, visibility, orientation and view when choosing a placement.

Those are practical requirements for this clue. The goal was not to identify a wall in the abstract; it was to find somewhere the player could comfortably read what we were placing.

Do not keep changing your mind

A system can select a good wall and still feel unstable. Small changes in the player's position or view can make another candidate look slightly better.

I gave the chosen wall some persistence. It should not lose its hint every time a competing score improved a little. The system needed a useful distinction between finding a better option and the current option becoming unsuitable.

This is easy to miss when looking at one screenshot. It becomes obvious when a hint moves between surfaces as someone turns their head.

Make the decision visible

The development view exposed the candidate walls and the chosen placement. I could inspect what the system was considering and tune it while standing in the room.

During development I needed the surfaces and decisions to be explicit. The player only needed to see a hint in a plausible place.

A small piece of spatial interaction

The hint is not the largest effect in Blackbox. It is a useful example of the work that makes an experience feel aware of its surroundings: choose a location for a reason, account for the user's view and avoid unnecessary changes once something works.