Пикинг (picking) спрайтов в Babylon.js представляет собой процесс
определения, какой спрайт пользователь выбрал с помощью указателя мыши
или касания. В отличие от 3D-мешей, спрайты являются плоскими
изображениями, отрисовываемыми на сцене с помощью
SpriteManager. Они обладают упрощённой геометрией, что
делает их легкими для рендеринга, но требует особого подхода при
взаимодействии с ними.
Для работы со спрайтами сначала создается SpriteManager.
Он управляет группой спрайтов и обеспечивает их рендеринг:
const spriteManager = new BABYLON.SpriteManager(
"spriteManager", // имя менеджера
"textures/character.png", // путь к текстуре
100, // максимальное количество спрайтов
{ width: 64, height: 64 }, // размеры каждого спрайта
scene // сцена
);
Каждый спрайт создается через Sprite:
const sprite = new BABYLON.Sprite("hero", spriteManager);
sprite.position = new BABYLON.Vector3(0, 1, 0);
sprite.size = 2;
Ключевой момент: позиция спрайта определяется в 3D-пространстве, несмотря на то, что визуально он всегда ориентирован к камере (billboard).
Babylon.js поддерживает три типа пикинга для спрайтов:
scene.pickSpriteМетод scene.pickSprite позволяет определить, какой
спрайт был выбран:
const pointerX = scene.pointerX;
const pointerY = scene.pointerY;
const pickedSprite = scene.pickSprite(pointerX, pointerY, (sprite) => {
// Фильтр: учитываем только видимые спрайты
return sprite.isVisible;
}, false);
Параметры метода:
true, проверка
выполняется быстро, но с меньшей точностью.Результат — объект PickingInfo, содержащий:
hit — boolean, есть ли попадание.pickedSprite — ссылка на выбранный спрайт.distance — расстояние от камеры до спрайта.Хотя спрайты являются двухмерными, Babylon.js позволяет использовать луч для взаимодействия с ними. Для этого строится луч через курсор:
const ray = scene.createPickingRay(scene.pointerX, scene.pointerY, BABYLON.Matrix.Identity(), camera);
const pickedSprite = scene.pickWithRay(ray, (sprite) => sprite.isVisible);
Преимущество: можно использовать совместно с другими объектами сцены, например, мешами, и получать однотипные результаты для всех типов объектов.
Для упрощенного реагирования на клики можно использовать обработчики событий на уровне сцены:
scene.onPointerObservable.add((pointerInfo) => {
switch (pointerInfo.type) {
case BABYLON.PointerEventTypes.POINTERDOWN:
const sprite = scene.pickSprite(pointerInfo.event.clientX, pointerInfo.event.clientY);
if (sprite.hit) {
sprite.pickedSprite.playAnimation(0, 5, true, 100);
}
break;
}
});
Особенности:
size и position.playAnimation)
часто привязана к событиям пикинга.Для более сложной логики часто применяют фильтры и слои:
layerMask): дают возможность
ограничивать пикинг только определенными группами объектов.sprite.layerMask = 0x10000000;
const picked = scene.pickSprite(pointerX, pointerY, (s) => (s.layerMask & 0x10000000) !== 0);
Это удобно для игр, где интерфейс и игровые объекты существуют на одной сцене, но клики должны различаться.
fastCheck: true ускоряет обработку.width/height для пикинга,
чтобы улучшить точность попадания.Пикинг спрайтов в Babylon.js сочетает простоту управления плоскими
изображениями и мощь стандартных 3D-пикеров. Методы
pickSprite и pickWithRay обеспечивают гибкость
для игр и визуальных приложений, а фильтры и слои позволяют создавать
сложные интерактивные сцены. Правильная настройка размеров спрайтов,
ориентации и фильтров гарантирует точное и отзывчивое взаимодействие
пользователя со сценой.