Raycaster

Этот класс предназначен для осуществления рейкастинга. Рейкастинг используется для пикинга объектов (определение объектов в 3Д-пространстве, над которыми находится курсор мыши), а также для других целей.

Пример

const raycaster = new v3d.Raycaster(); let pointer = null; function onPointerMove(event) { pointer = pointer || new v3d.Vector2(-1, -1); // рассчитываем позицию курсора в нормализованных координатах устройства // (-1 to +1) для обоих компонентов pointer.x = (event.offsetX / app.getWidth()) * 2 - 1; pointer.y = -(event.offsetY / app.getHeight()) * 2 + 1; } function pick() { // не используем позицию без инициализации if (!pointer) return; // обновляем луч на основе камеры и позиции курсора raycaster.setFromCamera(pointer, app.camera); // определяем объекты, пересекающие луч const intersects = raycaster.intersectObjects(app.scene.children); for (let i = 0; i < intersects.length; i++) { intersects[i].object.visible = false; } } app.container.addEventListener('pointermove', onPointerMove); app.renderCallbacks.push(pick);

Конструктор

Raycaster(origin : Vector3, direction : Vector3, near : Float, far : Float) {

Создает новый Raycaster-объект.

Свойства

.far : Float

Максимальная дальность луча. Это значение указывает расстояние, на котором объекты могут быть отброшены. Это значение не должно быть отрицательным и должно быть больше, чем свойство near.

.near : Float

Минимальная дальность луча. Это значение указывает расстояние, на котором объекты могут быть отброшены. Это значение не должно быть отрицательным и должно быть меньше, чем свойство far.

.camera : Camera

Камера, которую следует использовать при создании лучей для объектов, зависящих от вида, таких как объекты с билбордами, например Sprites. Это поле может быть задано вручную или устанавливается при вызове .setFromCamera(). По умолчанию имеет значение null.

.layers : Layers

Используется Raycaster для выборочного игнорирования 3Д-объектов при выполнении тестов пересечения. Следующий код гарантирует, что экземпляр Raycaster будет учитывать только 3Д-объекты на слое 1.

raycaster.layers.set(1); object.layers.enable(1);

.params : Object

Объект со следующими свойствами:

{ Mesh: { omitGeometry: false }, Line: { threshold: 1 }, LOD: {}, Points: { threshold: 1 }, Sprite: {}, checkVisibility: true }

Где threshold — это точность рейкастинга при пересечении объектов в мировых единицах. Указание omitGeometry=true позволяет направлять лучи только на ограничители мешей (а не на саму геометрию), что обеспечивает высокую производительность. Параметр checkVisiblity позволяет включать/отключать наведение лучей на невидимые объекты.

.ray : Ray

Луч используемый для рейкастинга.

Методы

.set(origin : Vector3, direction : Vector3)

Обновляет луч с новым началом и направлением. Обратите внимание, что этот метод только копирует значения из аргументов.

.setFromCamera(coords : Vector2, camera : Camera)

Обновляет луч с новым началом и направлением.

.intersectObject(object : Object3D, recursive : Boolean, optionalTarget : Array) → Array

Проверяет все пересечения между лучом и объектом с потомками или без них. Пересечения возвращаются отсортированными по расстоянию, сначала ближайшие. Возвращается массив пересечений...

[{ distance, point, face, faceIndex, object }, ...]

Raycaster делегирует метод raycast переданного объекта, когда оценивает, пересекает ли луч объект или нет. Это позволяет meshes реагировать на отбрасывание лучей иначе, чем lines и pointclouds.

Обратите внимание, что для мешей грани должны быть направлены к ориджину ray, чтобы быть обнаруженными; пересечения луча, проходящего через заднюю часть грани, не будут обнаружены. Чтобы направить луч на обе грани объекта, нужно установить свойство material side в v3d.DoubleSide.

.intersectObjects(objects : Array, recursive : Boolean, optionalTarget : Array) → Array

Проверяет все пересечения между лучом и объектами с потомками или без них. Пересечения возвращаются отсортированными по расстоянию, сначала возвращаются ближайшие. Пересечения имеют ту же форму, что и те, которые возвращает .intersectObject.

Пазлы

Пазл raycast может использоваться для осуществления рейкастинга без программирования.

Исходный файл

О том как получить исходный код этого модуля читайте тут.