RayCastClosest — это метод библиотеки Oimo.js, предназначенный для определения ближайшей точки пересечения луча с телами в физическом мире. Он используется, когда важно найти первый объект, с которым сталкивается луч, например, для систем прицеливания, определения видимости или интерактивных столкновений.
В Oimo.js луч задается двумя точками: началом
(origin) и направлением (direction). Метод
RayCastClosest вычисляет пересечение с телами сцены и
возвращает информацию только о первом столкновении,
игнорируя все последующие.
Ключевые понятия:
OIMO.Vec3.Для создания луча необходимо сначала определить его начало и направление:
const origin = new OIMO.Vec3(0, 10, 0); // точка начала луча
const direction = new OIMO.Vec3(0, -1, 0); // направление вниз
const maxDistance = 100; // максимальная длина луча
Метод rayCastClosest вызывается через объект
world:
const result = world.rayCastClosest(origin, direction, maxDistance);
if(result) {
console.log("Тело:", result.body.name);
console.log("Точка пересечения:", result.hitPointWorld);
console.log("Нормаль поверхности:", result.hitNormalWorld);
console.log("Доля длины луча:", result.hitFraction);
}
Важно: метод возвращает объект с информацией о
столкновении или null, если пересечения нет.
Для оптимизации проверок и фильтрации объектов используется маска столкновений. Каждое тело в Oimo.js может принадлежать определенной группе:
box.collisionGroup = 1; // группа объекта
box.collisionMask = 1; // с какими группами взаимодействует
При вызове rayCastClosest можно учитывать эти значения, чтобы луч проверял только определенные типы тел:
const result = world.rayCastClosest(origin, direction, maxDistance, 1); // проверка только группы 1
Метод RayCastClosest внутри Oimo.js работает через итерацию всех тел в мире и проверку пересечения луча с каждым примитивом.
collisionMask и collisionGroup.box, sphere,
capsule).RayCastHit
содержит body, hitPointWorld,
hitNormalWorld, hitFraction.Эта стратегия гарантирует точное определение первого столкновения и минимизирует ненужные вычисления, особенно в сложных сценах с большим количеством тел.
const origin = new OIMO.Vec3(player.position.x, player.position.y, player.position.z);
const direction = new OIMO.Vec3(0, -1, 0);
const hit = world.rayCastClosest(origin, direction, 10);
if(hit) {
player.groundHeight = hit.hitPointWorld.y;
}
const cameraPosition = camera.getWorldPosition();
const rayDirection = camera.getWorldDirection();
const hit = world.rayCastClosest(cameraPosition, rayDirection, 100);
if(hit) {
console.log("Первое препятствие:", hit.body.name);
}
collisionMask, чтобы луч не проверял
невидимые объекты, что снижает нагрузку на физический движок.Метод RayCastClosest в Oimo.js обеспечивает быстрый и точный способ определения ближайшего столкновения луча с физическими объектами, позволяя эффективно реализовывать механики взаимодействия, навигации и обнаружения объектов в 3D-пространстве.