Raycaster

Этот класс предназначен для помощи в работе с raycasting. Raycasting используется для для захвата мыши (определение объектов в 3d пространстве, над которыми находится мышь) среди прочего.

Пример

const raycaster = new v3d.Raycaster(); const mouse = new v3d.Vector2(); function onMouseMove(event) { // calculate mouse position in normalized device coordinates // (-1 to +1) for both components mouse.x = (event.clientX / window.innerWidth) * 2 - 1; mouse.y = - (event.clientY / window.innerHeight) * 2 + 1; } function render() { // update the picking ray with the camera and mouse position raycaster.setFromCamera(mouse, camera); // calculate objects intersecting the picking ray const intersects = raycaster.intersectObjects(scene.children); for (let i = 0; i < intersects.length; i++) { intersects[i].object.material.color.set(0xff0000); } renderer.render(scene, camera); } window.addEventListener('mousemove', onMouseMove, false); window.requestAnimationFrame(render);

Конструктор

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

origin — Вектор начала координат, из которого отбрасывается луч.
direction — Вектор направления, задающий направление луча. Должен быть нормализован.
near — Все возвращенные результаты находятся дальше, чем near. Near не может быть отрицательным. Значение по умолчанию 0.
far — Все возвращенные результаты ближе, чем far. Far не может быть меньше, чем near. Значение по умолчанию - Infinity(Бесконечность).

Это создает новый объект raycaster.

Свойства

.far : Float

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

.near : Float

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

.camera : Camera

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

.layers : Layers

Используется Raycaster для выборочного игнорирования 3D-объектов при выполнении тестов пересечения. Следующий пример кода гарантирует, что экземпляр Raycaster будет игнорировать только 3D-объекты на слое 1. raycaster.layers.set(1); object.layers.enable(1);

.params : Object

Объект со следующими свойствами: { Mesh: {}, Line: { threshold: 1 }, LOD: {}, Points: { threshold: 1 }, Sprite: {} } Где порог - точность лучей при пересечении объектов, в мировых единицах.

.ray : Ray

Ray используемый для передачи лучей.

Методы

.set(origin : Vector3, direction : Vector3) → null

origin — Вектор начала координат, из которого отбрасывается луч.
direction — Нормализованный вектор направления, задающий направление луча.

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

.setFromCamera(coords : Vector2, camera : Camera) → null

coords — 2D координаты мыши в нормализованных координатах устройства (NDC) --- компоненты X и Y должны быть в пределах от -1 до 1.
camera — камера, из которой должен исходить луч

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

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

object — Объект, который нужно проверить на пересечение с лучом.
recursive — Если true, то проверяются также все потомки. В противном случае проверяется только пересечение с объектом. По умолчанию - false.
optionalTarget — (необязательно) цель для установки результата. В противном случае создается новый Array. Если задан, то перед каждым вызовом необходимо очищать этот массив (т.е. array.length = 0;).

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

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

distance – расстояние между началом луча и точкой пересечения
point – точка пересечения, в мировых координатах
face – пересекаемая поверхность
faceIndex – индекс пересекаемой грани
object – пересекаемый объект
uv — U,V координаты в точке пересечения
uv2 — Второй набор координат U,V в точке пересечения
instanceId – Индексный номер экземпляра, в котором луч пересекает InstancedMesh

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

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

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

objects — Объекты для проверки пересечения с лучом.
recursive — Если true, то также проверяются все потомки объектов. В противном случае проверяется только пересечение с объектами. По умолчанию false.
optionalTarget — (необязательно) цель для установки результата. В противном случае создается новый Array. Если задан, то перед каждым вызовом необходимо очищать этот массив (т.е. array.length = 0;).

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

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

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