Case study
BMO Goalkeeper Shootout
A live soccer-shootout activation: a real ball, a stadium LED wall and a sensor-driven MetaHuman goalkeeper that reads each shot and reacts in real time — built on Unreal Engine 5.7.
The brief
A kicker, a wall and a keeper that feels alive.
Commersive Solutions set out to build an experiential soccer activation for BMO: a kicker takes three or four real shots at a physical LED wall, a sensor stack tracks each shot, and a MetaHuman goalkeeper renders live on the wall and reacts — with the score and per-shot result reading to the crowd in real time, in English or French.
The bar was “plausible, not perfect.” The keeper doesn’t need to play like a championship goalkeeper on every shot — it needs to read correctly to a casual bystander standing five metres away, on every single shot. Our remit was the real-time Unreal side: everything downstream of the sensor packet arriving over the wire, from the keeper’s decision-making to the on-screen HUD to the show-day build. Phương, my assistant, worked alongside me throughout.
What we built
One real-time loop, from sensor packet to crowd reaction.
- Sensor-driven goalkeeper. An OSC-over-UDP input pipeline consumes a live stream of kick, ball-tracking, prediction and impact events from the client’s sensor stack, driving the keeper’s reaction frame by frame.
- Two-phase reaction model. The keeper anticipates on the kick — shifting weight toward the early ball samples — then commits to a matching reaction when the shot prediction locks, so it never reads as flat-footed in the moment between kick and dive.
- Zone-based reaction selection with live pose arbitration. A 3×3 zone grid picks the reaction; an additive offset and a clamped-IK pass reach toward the exact predicted point. Goal-versus-save is resolved against the keeper’s actual live pose at the moment of impact, so the verdict always matches what the audience just watched.
- Difficulty-aware, child-friendly behaviour. A shot classifier splits fast, medium and slow shots into different responses so a kid’s slow roller gets a calm walk-and-collect instead of a comedic full dive, with an Easy / Normal toggle and a per-difficulty reaction play-rate.
- Session flow & embedded HTML HUD. A hard-coded state machine runs the whole session — warm-up, countdown, shooting, result, end-of-session — behind a three-button operator panel. The timer, per-shot indicator strip, result text and impact marker render as an embedded HTML/CSS overlay bridged into Unreal.
- Scene & impact visuals. A camera-locked stadium backdrop, turf and goal framing in front of it and net deformation driven off the impact point — plus a localisation framework carrying English and French copy.
The keeper
Reading the shot, moving into the save.
The keeper is the headline of the experience — it anticipates on the kick, commits to a reaction when the shot prediction locks and falls back to an idle while it waits. These are early tests of the reaction and the keeper’s movement, with the animation still being refined.
Timing & impact
Where the ball lands, and how fast.
Two slow-motion debug passes: one measures the loop end to end with a millisecond timer overlaid; the other fires a shot at a UV grid — square cells and coordinates — so the reported impact point can be checked against where the ball actually lands.
Behind the build
The bugs that come with real-time character work.
Driving a MetaHuman live off a sensor stream means chasing the failure modes that only surface in motion — the keeper freezing mid-pose, or a garment dropping to its bind pose with a missing material. Captured here as part of the diagnostic pass that fed the fixes.
On site
The booth, on location.
The BMO Goal Challenge on-site — the booth being set up, and running with visitors.
Stack