ARKit, обнаружение, когда отслеживание доступно - PullRequest
0 голосов
/ 17 мая 2018

Я ищу способ определить, когда пространственное отслеживание «работает / не работает» в ARKit, т.е. когда у ARKit достаточно визуальной информации для запуска трехмерного пространственного отслеживания.

В других приложениях, которые я пробовал, пользователю предлагается осмотреться с телефоном / камерой, чтобы возобновить отслеживание пространства, если ARKit не получает достаточно информации с камеры.Я даже видел приложения с индикатором выполнения, показывающим, сколько еще пользователю необходимо переместить устройство, чтобы возобновить отслеживание.

Был бы хороший способ определить, доступно ли отслеживание, чтобы проверить, сколько rawFeaturePoints текущий кадр ARSessions имеет?Например, если текущий кадр имеет более 100, скажем, rawFeaturePoints, мы можем предположить, что пространственное отслеживание работает.

Будет ли это хорошим подходом, или в ARKit есть встроенная функциональность или лучший способ определить, работает ли пространственное отслеживание, о чем я не знаю?

1 Ответ

0 голосов
/ 17 мая 2018

Вы можете использовать характерные точки, но я думаю, что это, вероятно, излишне, так как подобное может быть хорошим началом:

Используя currentFrame из ARSession, вы можете получить текущее состояние отслеживанияпримерно так:

//------------------------------------------------
//MARK: ARSession Extension To Log Tracking States
//------------------------------------------------

extension ARSession{

    /// Returns The Status Of The Current ARSession
    ///
    /// - Returns: String
    func sessionStatus() -> String? {

        //1. Get The Current Frame
        guard let frame = self.currentFrame else { return nil }

        var status = "Preparing Device.."

        //1. Return The Current Tracking State & Lighting Conditions
        switch frame.camera.trackingState {

        case .normal:                                                   status = ""
        case .notAvailable:                                             status = "Tracking Unavailable"
        case .limited(.excessiveMotion):                                status = "Please Slow Your Movement"
        case .limited(.insufficientFeatures):                           status = "Try To Point At A Flat Surface"
        case .limited(.initializing):                                   status = "Initializing"
        case .limited(.relocalizing):                                   status = "Relocalizing"

        }

        guard let lightEstimate = frame.lightEstimate?.ambientIntensity else { return nil }

        if lightEstimate < 100 { status = "Lighting Is Too Dark" }

        return status

    }

}

Который вы бы назвали что-то вроде этого в обратном вызове ARSCNViewDelegate:

 func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {

      DispatchQueue.main.async {

            //1. Update The Tracking Status
            print(self.augmentedRealitySession.sessionStatus())

      }
 }

Также есть и другие функции обратного вызова делегата, которые вы можете использовать, например:

func session(_ session: ARSession, didFailWithError error: Error) {

    print("The ARSession Failed")
}

func sessionWasInterrupted(_ session: ARSession) {

    print("ARSession Was Interupted")
}

Эти Рекомендации ARKit также предоставляют полезную информацию о том, как обрабатывать эти состояния: Руководства Apple

Если вы действительно хотите отслеживать число featurePointsоднако вы можете сделать что-то вроде этого:

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {

    guard let currentFrame = self.augmentedRealitySession.currentFrame,
    let featurePointCount = currentFrame.rawFeaturePoints?.points.count else { return }

    print("Number Of Feature Points In Current Session = \(featurePointCount)")


}

И если вы хотите увидеть пример, вы можете посмотреть здесь: Пример характерных моментов

Надеюсь, это поможет...

...