Как использовать метод trackedRaycast (_: updateHandler :) в ARKit? - PullRequest
0 голосов
/ 19 февраля 2020

Повторяет запрос на приведение лучей с течением времени, чтобы уведомить вас об обновленных поверхностях в физической среде.

Как использовать эту забаву c в ARKit?

func trackedRaycast(_ query: ARRaycastQuery, 
              updateHandler: @escaping ([ARRaycastResult]) -> Void) -> ARTrackedRaycast?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

В документации Apple Developer говорится следующее о trackedRaycast():

trackedRaycast(_:updateHandler:) метод экземпляра со временем повторяет запрос приведения луча, чтобы уведомить вас об обновленных поверхностях в физическая среда. Отслеживание приведения к лучу оборачивает запрос приведения к лучу, который ARSession вызывает неоднократно, каждый раз вызывая обработчик обновлений, чтобы предоставить вам новые результаты. Когда вы будете готовы прекратить использование отслеживаемых лучей, позвоните stopTracking().

Итак, вот фрагмент кода, который вы можете использовать в своем проекте:

import RealityKit
import ARKit

@IBOutlet var arView: ARView!
let scene = try! Experience.loadScene()

let raycastQuery: ARRaycastQuery = .init(origin: [0,0,0],
                                      direction: [7,7,7],
                                       allowing: .estimatedPlane,
                                      alignment: .horizontal)

let repeatRaycast = self.arView.session.trackedRaycast(raycastQuery) { results in

    // Update Handler's content
    guard let result: ARRaycastResult = results.first
    else { return }

    let anchor = AnchorEntity(world: result.worldTransform)
    anchor.addChild(self.scene)

    self.arView.scene.anchors.append(anchor)
}

Затем Вы можете остановить отслеживание:

repeatRaycast?.stopTracking()
1 голос
/ 19 февраля 2020

Сначала определите запрос с чем-то вроде

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.

...