SPL × UTSPAN 2026 Data Challenge
Summary
A data challenge run by the Sports Performance Lab (SPL) at Maple Leaf Sports & Entertainment (MLSE) and UTSPAN: given only 3D motion capture of a shooter's body, predict where the free throw lands at the rim, without ever seeing the ball. Our team, the Metric Mustangs, placed top 3 and presented at the Ontario Universities Sports Analytics Coalition conference in March 2026.
My role
My main contribution was the writeup and presentation: turning the team's findings into our paper and presenting them at the conference. Early on I also explored a deep-learning approach, though the final submission went a different direction.

The only input: 69 body keypoints per frame. The model never sees the ball. Animation by a teammate.
team.summary()- host
- SPL (MLSE) × UTSPAN
- team
- Metric Mustangs
- members
- Luke Blommesteyn, Nathan Feng, Yuvraj Sharma (Western)
- result
- Top 3 · 0.00689 MSE
- presented
- OUSAC conference, March 2026
- input
- 240 frames × 69 keypoints in 3D, 5 shooters
- predict
- entry angle, depth, left/right

Presenting our findings at the OUSAC conference.
At the conference
As one of the top 3 teams, we were invited to present our approach at the Ontario Universities Sports Analytics Coalition conference in March 2026.
My part of the talk was the third stage, low-rank ensemble model selection. We had 10 minutes to present, then 3 minutes of questions from judges from SPL.
The idea behind that stage: we trained many model variants, and each leaned on different body signals. Coordination timing mattered most for entry angle, wrist speed for left/right, and the whole arm for depth. Their disagreements weren't random, though. Just 7 directions explained 89% of the differences between them, so we could search for the best blend in that small space instead of across every prediction. That took our score from 0.0073 to 0.00689.
shots.plot_release_poses()
The Final Pipeline
- Measure the body at the moment of release, such as wrist speed, elbow angle and arm geometry, and predict from those (0.0080 MSE).
- Calibrate each prediction toward that shooter's own habits (0.0073).
- Blend many model variants along the 7 directions where they disagree (0.00689).

The key finding
The cameras record at 60 FPS, so the exact moment of release is only known to within ~8 ms. About half of the shot-to-shot variation comes from the final wrist snap, which body keypoints can't see. Together, that puts a floor of about 0.005–0.006 MSE that no model can beat. We were close to it.
shots.plot_variance_sources()Half the variation is the wrist snap, which the cameras can't see. Only a fifth is predictable from body motion. Values from our team writeup.
pipeline.plot_scores()Each stage closed part of the gap to the floor that no model can beat.