Попадания и координаты
target.hit содержит физическую точку: x_mm, y_mm. Начало координат — снизу слева.
Нормализация
HTML5 SDK добавляет nx и ny: миллиметры делятся на width_mm и height_mm из manifest, затем ограничиваются диапазоном 0…1. Исходные x_mm и y_mm остаются доступными. Идентификатор shot_id нужен для защиты игровой механики от повторного начисления. source и demo сохраняют происхождение события.
Canvas и WebGL
Canvas использует верхний левый угол, поэтому Y преобразуется как 1−ny. Функция toCanvasPoint принимает явный viewport в логических единицах отрисовки. CSS-размер, canvas.width и devicePixelRatio — разные величины; выберите одну систему единиц для viewport и рисования. Для WebGL NDC: X=2nx−1, Y=2ny−1.
Активная область
Если изображение занимает только часть физической мишени, сначала преобразуйте физическую нормализованную точку относительно этой области и отвергните попадания в поля. Простая передача узкого viewport в toCanvasPoint сама по себе эту обрезку не выполняет.
Ограничения измерения
Событие означает зарегистрированный удар по полотну. SDK не знает о выстреле мимо полотна и не определяет стрелка по акустической координате. Не называйте число событий общим количеством нажатий на спуск.
Пример кода
Фрагмент интеграции: переменные игрового проекта задаются приложением. Полный запускаемый пример — в Playground.
const point = toCanvasPoint(hit, {width: canvas.width, height: canvas.height});
const ndc = {x: hit.nx * 2 - 1, y: hit.ny * 2 - 1};