Метод rayCast является одним из ключевых инструментов
библиотеки Oimo.js для выполнения лучевых проверок
пересечений с физическими телами в мире. Он используется для
определения того, пересекает ли луч какое-либо тело, и получения
информации о точке контакта, нормали поверхности и объекте
столкновения.
world.rayCast(origin, direction, maxDistance, callback)
Параметры:
origin — OIMO.Vec3
Вектор начала луча. Определяет координаты в мировых единицах, откуда луч
будет исходить.
direction — OIMO.Vec3
Вектор направления луча. Обычно нормализованный, задает направление
движения луча в пространстве.
maxDistance — number
Максимальная длина луча. Луч проверяется до указанного расстояния. Если
пересечение находится дальше, оно игнорируется.
callback —
function(hit) Функция обратного вызова, вызываемая при
обнаружении пересечения. Параметр hit содержит объект с
информацией о столкновении:
{
body: OIMO.RigidBody, // тело, с которым произошло пересечение
point: OIMO.Vec3, // точка пересечения в мировых координатах
normal: OIMO.Vec3, // нормаль поверхности в точке пересечения
fraction: number // доля длины луча до точки пересечения (0-1)
}
rayCast вызывает
коллбек для каждого пересечения, что позволяет
обработать все объекты на пути луча.let origin = new OIMO.Vec3(0, 5, 0);
let direction = new OIMO.Vec3(0, -1, 0);
let maxDistance = 10;
world.rayCast(origin, direction, maxDistance, (hit) => {
console.log("Пересечение с телом:", hit.body);
console.log("Точка контакта:", hit.point);
});
В данном примере луч направлен вниз от точки (0,5,0) и
проверяет пересечения с объектами на расстоянии до 10 единиц.
world.rayCast(origin, direction, maxDistance, (hit) => {
let impulseDirection = hit.normal.scale(5);
hit.body.applyImpulse(impulseDirection, hit.point);
});
Этот код позволяет создавать отталкивающий импульс от поверхности, с которой луч пересекается, используя нормаль точки контакта.
Нормализация направления: Вектор
direction следует нормализовать перед вызовом
rayCast, чтобы результат fraction был
корректно интерпретируем как доля длины луча.
Ограничение количества объектов: В больших
сценах рекомендуется использовать маски слоёв и фильтры
групп для снижения количества проверок, иначе каждый вызов
rayCast будет обходить все тела мира.
Кеширование векторов: Частое создание новых
объектов OIMO.Vec3 в цикле может привести к лишней нагрузке
на сборщик мусора. Оптимально переиспользовать векторы при повторных
вызовах лучей.
Обработка нескольких пересечений: Если
необходимо получить только ближайшее пересечение, внутри коллбека стоит
вести проверку минимального значения fraction.
Метод rayCast тесно интегрирован с системой тел и
столкновений Oimo.js:
С world.step(): Рекомендуется
вызывать rayCast после обновления физического мира для
получения актуальных данных о телах.
С RigidBody.applyImpulse():
Используется для мгновенного воздействия на объекты по результатам
пересечения луча.
С коллизиями и триггерами: Луч может обнаруживать объекты с включенными триггерными коллайдерами, что позволяет строить логические проверки без физического воздействия.
Лазерные сенсоры для игр и симуляций: Используя
rayCast, можно определить, есть ли препятствия на пути
движения объекта.
Система навигации: Проверка доступных путей для ИИ-персонажей с помощью лучей, чтобы избежать столкновений.
Детектирование поверхности: Определение типа поверхности по нормали (например, для эффекта скольжения или сцепления).
Метод rayCast в Oimo.js предоставляет гибкий
инструмент для реализации разнообразных сценариев
взаимодействия с физическим миром, от простых проверок пересечений до
сложных систем физического воздействия на объекты. Его корректное
использование требует внимания к нормализации направления, длине луча и
обработке коллбека для точного и эффективного результата.