Ray в Cannon.js представляет собой луч, который используется для обнаружения пересечений с телами в физическом мире. Основная цель луча — проверка коллизий и получение информации о том, с какими объектами он пересекается, на каком расстоянии и в какой точке. Ray используется для реализации таких функций, как лазерные указки, детекторы столкновений и сенсоры объектов.
Объект луча создаётся с помощью конструктора
CANNON.Ray:
const ray = new CANNON.Ray(from, to);
CANNON.Vec3).CANNON.Vec3).Луч может быть настроен для различных целей:
ray.skipBackfaces = true; // игнорирование обратных граней
ray.collisionFilterMask = 1; // маска для фильтрации тел по группам
ray.collisionFilterGroup = 1; // группа, к которой принадлежит луч
ray.mode = CANNON.Ray.ALL; // режим проверки пересечений
mode может принимать значения:
CANNON.Ray.ANY — возвращает первое пересечение.CANNON.Ray.CLOSEST — возвращает ближайшее
пересечение.CANNON.Ray.ALL — возвращает все пересечения.1. intersectBodies Метод проверяет пересечение луча с массивом тел:
ray.intersectBodies(bodies, resultCallback);
CANNON.Body.RaycastResult.2. intersectBody Проверяет пересечение с одним телом:
ray.intersectBody(body, resultCallback);
3. intersectWorld Проверяет пересечение с телами в мире Cannon.js:
ray.intersectWorld(world, options);
CANNON.World.mode,
skipBackfaces, collisionFilterMask,
collisionFilterGroup.Объект RaycastResult содержит полную информацию о
пересечении луча с телом:
const result = new CANNON.RaycastResult();
Основные свойства RaycastResult:
CANNON.Body), с которым
произошло пересечение.CANNON.Shape), с
которой произошло пересечение.CANNON.Vec3).CANNON.Vec3), направленная от поверхности к
источнику луча.Пример использования:
const result = new CANNON.RaycastResult();
ray.intersectWorld(world, {
mode: CANNON.Ray.CLOSEST,
result: result
});
if (result.hasHit) {
console.log("Тело:", result.body.id);
console.log("Точка пересечения:", result.hitPointWorld);
console.log("Нормаль:", result.hitNormalWorld);
}
Ray.ALL с массивом тел, но фильтровать
по группам и маскам, чтобы снизить нагрузку.hitNormalWorld), чтобы правильно
вычислять реакции на столкновения.from и to. Для бесконечного
луча можно масштабировать to по направлению векторного
направления.Ray.ALL результат можно хранить в массиве
RaycastResult, чтобы анализировать все точки пересечения и
выбирать необходимую для логики игры или симуляции.const from = new CANNON.Vec3(player.position.x, player.position.y, player.position.z);
const to = new CANNON.Vec3(player.position.x, player.position.y - 10, player.position.z);
const ray = new CANNON.Ray(from, to);
const result = new CANNON.RaycastResult();
ray.intersectWorld(world, { mode: CANNON.Ray.CLOSEST, result: result });
if (result.hasHit) {
player.onGro und = true;
player.groundNormal = result.hitNormalWorld.clone();
}
const ray = new CANNON.Ray(shooter.position, target.position);
ray.mode = CANNON.Ray.ANY;
ray.intersectWorld(world, { result: result });
if (result.hasHit) {
applyDamage(result.body, damage);
}
Box, Sphere,
ConvexPolyhedron, Trimesh), учитывая их
трансформации.Ray и RaycastResult образуют мощный инструмент для анализа сцены и реализации сложной физической логики, позволяя получать точные точки пересечения, вычислять нормали и корректно реагировать на коллизии. Их правильное использование обеспечивает реалистичные взаимодействия в 3D-пространстве.