Этот класс предназначен для осуществления рейкастинга. Рейкастинг используется для пикинга объектов (определение объектов в 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);
0.Infinity (бесконечность).Создает новый Raycaster-объект.
Максимальная дальность луча. Это значение указывает расстояние, на котором объекты могут быть отброшены. Это значение не должно быть отрицательным и должно быть больше, чем свойство near.
Минимальная дальность луча. Это значение указывает расстояние, на котором объекты могут быть отброшены. Это значение не должно быть отрицательным и должно быть меньше, чем свойство far.
Камера, которую следует использовать при создании лучей для объектов, зависящих от вида, таких как объекты с билбордами, например Sprites. Это поле может быть задано вручную или устанавливается при вызове .setFromCamera(). По умолчанию имеет значение null.
Используется Raycaster для выборочного игнорирования 3Д-объектов при выполнении тестов пересечения. Следующий код гарантирует, что экземпляр Raycaster будет учитывать только 3Д-объекты на слое 1.
raycaster.layers.set(1);
object.layers.enable(1);
Объект со следующими свойствами:
{
Mesh: { omitGeometry: false },
Line: { threshold: 1 },
LOD: {},
Points: { threshold: 1 },
Sprite: {},
checkVisibility: true
}
Где threshold — это точность рейкастинга при пересечении объектов в мировых единицах. Указание omitGeometry=true позволяет направлять лучи только на ограничители мешей (а не на саму геометрию), что обеспечивает высокую производительность. Параметр checkVisiblity позволяет включать/отключать наведение лучей на невидимые объекты.
Луч используемый для рейкастинга.
Обновляет луч с новым началом и направлением. Обратите внимание, что этот метод только копирует значения из аргументов.
Обновляет луч с новым началом и направлением.
true, то проверяются также все потомки. В противном случае проверяется только пересечение с объектом. По умолчанию true.array.length = 0;).Проверяет все пересечения между лучом и объектом с потомками или без них. Пересечения возвращаются отсортированными по расстоянию, сначала ближайшие. Возвращается массив пересечений...
[{ distance, point, face, faceIndex, object }, ...]
Raycaster делегирует метод raycast переданного объекта, когда оценивает, пересекает ли луч объект или нет. Это позволяет meshes реагировать на отбрасывание лучей иначе, чем lines и pointclouds.
Обратите внимание, что для мешей грани должны быть направлены к ориджину ray, чтобы быть обнаруженными; пересечения луча, проходящего через заднюю часть грани, не будут обнаружены. Чтобы направить луч на обе грани объекта, нужно установить свойство material side в v3d.DoubleSide.
true, то также проверяются все потомки объектов. В противном случае проверяется только пересечение с объектами. По умолчанию true.array.length = 0;).Проверяет все пересечения между лучом и объектами с потомками или без них. Пересечения возвращаются отсортированными по расстоянию, сначала возвращаются ближайшие. Пересечения имеют ту же форму, что и те, которые возвращает .intersectObject.
Пазл raycast может использоваться для осуществления рейкастинга без программирования.
О том как получить исходный код этого модуля читайте тут.