Если вы используете ARKit, вы можете реализовать 3 различных метода приведения лучей :
Этот метод экземпляра проверяет один раз наличие пересечений между лучом (лучом, который вы создаете из интересующей вас точки экрана) и реальными поверхностями.
- raycastQuery (from: позволить: alignment:)
Этот метод экземпляра создает запрос raycast, исходящий из точки на виде, выровненной по центру поля зрения камеры.
- trackedRaycast (_: updateHandler:)
Этот метод экземпляра со временем повторяет запрос raycast, чтобы уведомить вас об обновленных поверхностях в физической среде.
Но, как я вижу, вам нужно реализовать метод, который создает луч из одного 3d-объекта, который должен попасть в другой 3d-объект в сцене. В этом случае вам нужно реализовать метод экземпляра RealityKit, который можно использовать внутри сцены ARView:
raycast(from:to:query:mask:relativeTo:)
Этот метод выполняет convex ray cast
для всей геометрии сцены для луч между двумя конечными точками .
func raycast(from startPosition: SIMD3<Float>,
to endPosition: SIMD3<Float>,
query: CollisionCastQueryType = .all,
mask: CollisionGroup = .all,
relativeTo referenceEntity: Entity? = nil) -> [CollisionCastHit]
В реальном коде это может выглядеть так:
import RealityKit
let raycasts: [CollisionCastHit] = arView.scene.raycast(from: [2, 2, 2],
to: [9, 9, 9],
query: .all,
mask: .all,
relativeTo: nil)
guard let rayCast: CollisionCastHit = raycasts.first
else { return }
print(rayCast.entity.name)
print(rayCast.distance)
Но помните!
Метод игнорирует объекты, у которых отсутствует CollisionComponent . Итак, перед использованием вышеупомянутого метода вам нужно назначить форму столкновения для будущей модели попадания.