Этот класс предназначен для помощи в работе с 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);
origin — Вектор начала координат, из которого отбрасывается луч.
direction — Вектор направления, задающий направление луча. Должен быть нормализован.
near — Все возвращенные результаты находятся дальше, чем near. Near не может быть отрицательным. Значение по умолчанию 0.
far — Все возвращенные результаты ближе, чем far. Far не может быть меньше, чем near. Значение по умолчанию - Infinity(Бесконечность).
Это создает новый объект raycaster.
Коэффициент дальности луча. Это значение указывает, какие объекты могут быть отброшены на основании расстояния. Это значение не должно быть отрицательным и должно быть больше, чем свойство near.
Коэффициент близости райкастера. Это значение указывает, какие объекты могут быть отброшены на основании расстояния. Это значение не должно быть отрицательным и должно быть меньше, чем свойство far.
Камера, которую следует использовать при создании лучей для объектов, зависящих от вида, таких как объекты с билбордами, например Sprites. Это поле может быть задано вручную или устанавливается при вызове команды "setFromCamera". По умолчанию имеет значение null.
Используется Raycaster для выборочного игнорирования 3D-объектов при выполнении тестов пересечения. Следующий пример кода гарантирует, что экземпляр Raycaster будет игнорировать только 3D-объекты на слое 1.
raycaster.layers.set(1);
object.layers.enable(1);
Объект со следующими свойствами:
{
Mesh: {},
Line: { threshold: 1 },
LOD: {},
Points: { threshold: 1 },
Sprite: {}
}
Где порог - точность лучей при пересечении объектов, в мировых единицах.
Ray используемый для передачи лучей.
origin — Вектор начала координат, из которого отбрасывается луч.
direction — Нормализованный вектор направления, задающий направление луча.
Обновляет луч с новым началом и направлением. Обратите внимание, что этот метод только копирует значения из аргументов.
coords — 2D координаты мыши в нормализованных координатах устройства (NDC) --- компоненты X и Y должны быть в пределах от -1 до 1.
camera — камера, из которой должен исходить луч
Обновляет луч с новым началом и направлением.
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.
objects — Объекты для проверки пересечения с лучом.
recursive — Если true, то также проверяются все потомки объектов. В противном случае проверяется только пересечение с объектами. По умолчанию false.
optionalTarget — (необязательно) цель для установки результата. В противном случае создается новый Array. Если задан, то перед каждым вызовом необходимо очищать этот массив (т.е. array.length = 0;).
Проверяет все пересечения между лучом и объектами с потомками или без них. Пересечения возвращаются отсортированными по расстоянию, сначала возвращаются ближайшие. Пересечения имеют ту же форму, что и те, которые возвращает .intersectObject.
О том как получить исходный код этого модуля читайте тут.