Метод rayCast и его сигнатура

Метод rayCast является одним из ключевых инструментов библиотеки Oimo.js для выполнения лучевых проверок пересечений с физическими телами в мире. Он используется для определения того, пересекает ли луч какое-либо тело, и получения информации о точке контакта, нормали поверхности и объекте столкновения.


Сигнатура метода

world.rayCast(origin, direction, maxDistance, callback)

Параметры:

  1. originOIMO.Vec3 Вектор начала луча. Определяет координаты в мировых единицах, откуда луч будет исходить.

  2. directionOIMO.Vec3 Вектор направления луча. Обычно нормализованный, задает направление движения луча в пространстве.

  3. maxDistancenumber Максимальная длина луча. Луч проверяется до указанного расстояния. Если пересечение находится дальше, оно игнорируется.

  4. callbackfunction(hit) Функция обратного вызова, вызываемая при обнаружении пересечения. Параметр hit содержит объект с информацией о столкновении:

{
  body: OIMO.RigidBody,   // тело, с которым произошло пересечение
  point: OIMO.Vec3,       // точка пересечения в мировых координатах
  normal: OIMO.Vec3,      // нормаль поверхности в точке пересечения
  fraction: number        // доля длины луча до точки пересечения (0-1)
}

Особенности работы

  • Метод не возвращает значения напрямую, вместо этого использует функцию обратного вызова для обработки результатов.
  • Луч проверяется по всем телам мира, но можно ограничить фильтрацию через пользовательские маски слоёв и групп, если это необходимо для оптимизации.
  • При наличии нескольких пересечений rayCast вызывает коллбек для каждого пересечения, что позволяет обработать все объекты на пути луча.

Примеры использования

  1. Проверка пересечения с первым объектом на пути луча
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 единиц.

  1. Использование нормали для физического эффекта
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 предоставляет гибкий инструмент для реализации разнообразных сценариев взаимодействия с физическим миром, от простых проверок пересечений до сложных систем физического воздействия на объекты. Его корректное использование требует внимания к нормализации направления, длине луча и обработке коллбека для точного и эффективного результата.