PickingInfo: mesh, pickedPoint, normal, faceId

Babylon.js предоставляет мощные инструменты для работы с трехмерной графикой, включая функционал выбора объектов (picking). Одна из ключевых структур для получения информации о выбранных объектах — это объект PickingInfo. Он хранит данные о выбранном меше, точке пересечения, нормале и идентификаторе грани, что позволяет получать подробную информацию о том, как именно был выбран объект в сцене.

Структура объекта PickingInfo

PickingInfo — это объект, который создается при выборе объекта с помощью методов библиотеки Babylon.js, таких как scene.pick(), scene.pickWithRay() или scene.pickPicking(). Этот объект содержит несколько важных свойств, которые помогают точнее понять, что произошло в момент выбора.

Свойства объекта PickingInfo:
  1. mesh Свойство mesh представляет собой объект Mesh, который был выбран. Если в момент выбора был затронут не меш, а, например, точка на невидимой плоскости или еще что-то, то это свойство может быть null. Это свойство важно для дальнейшей работы с выбранным объектом, так как позволяет взаимодействовать с его свойствами, трансформациями и другими данными.

    Пример:

    if (pickInfo.mesh) {
        console.log("Выбран меш:", pickInfo.mesh.name);
    }
  2. pickedPoint Это свойство возвращает объект Vector3, который описывает точку на поверхности меша, где был произведен выбор. Точка определяется относительно мировых координат сцены. Этот параметр полезен, если необходимо точно знать, где именно пользователь щелкнул по объекту.

    Пример:

    if (pickInfo.pickedPoint) {
        console.log("Точка пересечения:", pickInfo.pickedPoint);
    }
  3. normal Свойство normal — это объект Vector3, который представляет собой нормаль поверхности в точке пересечения. Нормаль позволяет понять ориентацию поверхности в момент выбора и может быть использована для различных расчетов, например, для вычисления отражений или освещения.

    Пример:

    if (pickInfo.normal) {
        console.log("Нормаль поверхности:", pickInfo.normal);
    }
  4. faceId Свойство faceId представляет собой уникальный идентификатор грани (или треугольника), на которой был выполнен выбор. Это свойство полезно, если необходимо определить, какой именно треугольник в сетке меша был выбран. Важно помнить, что меши, как правило, состоят из множества треугольников, и faceId поможет отличить их.

    Пример:

    if (pickInfo.faceId !== undefined) {
        console.log("Идентификатор грани:", pickInfo.faceId);
    }

Пример использования PickingInfo

Рассмотрим пример, где используется объект PickingInfo для получения информации о выбранном объекте на сцене. В этом примере создается простая сцена с мешем, и реализована логика для выбора объекта с помощью мыши.

// Создаем сцену и камеру
var scene = new BABYLON.Scene(engine);
var camera = new BABYLON.ArcRotateCamera("camera", Math.PI / 2, Math.PI / 2, 10, BABYLON.Vector3.Zero(), scene);
camera.attachControl(canvas, true);

// Создаем меш
var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", {diameter: 2}, scene);

// Обработчик для выбора объекта
scene.onPointerP ick = function (evt, pickInfo) {
    if (pickInfo && pickInfo.hit) {
        // Печать информации о выбранном объекте
        console.log("Меш:", pickInfo.mesh.name);
        console.log("Точка пересечения:", pickInfo.pickedPoint);
        console.log("Нормаль:", pickInfo.normal);
        console.log("Идентификатор грани:", pickInfo.faceId);
    }
};

// Запуск сцены
engine.runRenderLoop(function () {
    scene.render();
});

В данном примере, при щелчке на объекте, будет выведена информация о выбранном меше, точке пересечения, нормали и идентификаторе грани.

Применение PickingInfo

Использование объекта PickingInfo в Babylon.js важно в различных сценариях, например:

  • Интерактивность: при реализации взаимодействия с объектами сцены (например, при выборе объектов для изменений или перемещения).
  • Обработчики столкновений: при нахождении точек пересечения с объектами для реализации более сложных физичных взаимодействий.
  • Реализация прицеливания: если требуется определить, на каком объекте находится прицел, или определить точку пересечения для отрисовки прицела.

PickingInfo позволяет не только получить базовую информацию о пересечении, но и значительно расширяет возможности взаимодействия с объектами в 3D-сценах, делая их более динамичными и удобными для пользователей.