В библиотеке Three.js Plane и Ray
представляют фундаментальные математические объекты для работы с
геометрией в трёхмерном пространстве. Их использование позволяет
выполнять пересечения, отсечения, проекции и другие вычисления,
необходимые для построения сложных сцен, систем коллизий и
взаимодействия с объектами.
Плоскость (THREE.Plane) описывается
нормалью и константой, задающими уравнение плоскости в виде:
[ + d = 0]
где:
const normal = new THREE.Vector3(0, 1, 0); // нормаль к плоскости
const constant = -5; // смещение вдоль нормали
const plane = new THREE.Plane(normal, constant);
THREE.Line3). Если
пересечения нет, возвращает undefined.Проекция точки на плоскость:
const point = new THREE.Vector3(10, 20, 30);
const projectedPoint = new THREE.Vector3();
plane.projectPoint(point, projectedPoint);
console.log(projectedPoint); // точка на плоскости
Проверка стороны плоскости:
const distance = plane.distanceToPoint(point);
if (distance > 0) {
console.log("Точка находится перед плоскостью");
} else if (distance < 0) {
console.log("Точка находится за плоскостью");
} else {
console.log("Точка лежит на плоскости");
}
Луч (THREE.Ray) представляет собой
прямую, исходящую из точки и распространяющуюся в направлении заданного
вектора. Формальное представление:
[ (t) = .origin} + t .direction}, t ]
где:
origin — начальная точка луча,direction — нормализованный вектор направления,t — параметр, определяющий положение на луче.const origin = new THREE.Vector3(0, 0, 0);
const direction = new THREE.Vector3(1, 0, 0).normalize();
const ray = new THREE.Ray(origin, direction);
t.null, если
пересечения нет.THREE.Sphere).Поиск пересечения с плоскостью:
const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), -5);
const intersectionPoint = new THREE.Vector3();
if (ray.intersectPlane(plane, intersectionPoint)) {
console.log("Точка пересечения:", intersectionPoint);
} else {
console.log("Пересечение отсутствует");
}
Нахождение ближайшей точки к произвольной точке:
const point = new THREE.Vector3(3, 7, 2);
const closest = new THREE.Vector3();
ray.closestPointToPoint(point, closest);
console.log("Ближайшая точка на луче:", closest);
Комбинация плоскости и луча позволяет реализовать ключевые операции:
const ray = new THREE.Ray(new THREE.Vector3(0, 10, 0), new THREE.Vector3(0, -1, 0));
const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0);
const intersect = new THREE.Vector3();
if (ray.intersectPlane(plane, intersect)) {
console.log("Луч пересекает плоскость в точке:", intersect);
}
direction.normalize()), иначе методы пересечения будут
работать некорректно.Plane.setFromNormalAndCoplanarPoint()
удобнее, чем вручную вычислять константу плоскости, особенно при
динамически меняющихся объектах.target для оптимизации памяти и производительности.distanceToPoint и
closestPointToPoint полезны для реализации столкновений,
ограничения движения или проверки видимости объектов.Plane и Ray в Three.js — базовые
инструменты для работы с геометрией, пересечениями и навигацией по
3D-пространству. Их правильное использование обеспечивает точные расчёты
при визуализации, анимации и взаимодействии с объектами, формируя основу
для построения сложных 3D-сцен и игровых механик.