Сначала определите запрос с чем-то вроде
let bounds = sceneView.bounds
let screenCenter = CGPoint(x: bounds.midX, y: bounds.midY)
let query = sceneView.raycastQuery(from: screenCenter, allowing: .estimatedPlane, alignment: .horizontal)
Затем запустите trackedRaycast с обработчиком обновления:
let trackedRaycast = sceneView.castTrackedRay(for: query, updateHandler: { results in
guard let result = results.first else { return }
// Do something with results
// Maybe adjust a relevent node's position
someNode.simdWorldPosition = result.worldTransform.position
})
Затем, если в какой-то момент вам не нужно его отслеживать / обновив позицию больше, вы можете остановить выполнение updateHandler
: trackedRaycast?.stopTracking()
Обратите внимание, что если нормальный raycast потерпит неудачу либо из-за ограничений запроса, либо из-за проблемы сцены, то trackedRaycast также завершится неудачно, и ваш trackedRaycast
объект будет nil
.