Включить факел во время ARSession - PullRequest
0 голосов
/ 07 декабря 2018

Как я могу включить фонарик (факел) во время сеанса ARSession?

Стандартный код не работает, так как сразу после начала сеанса фонарик выключен.

Инициализация ARSession:

        let configuration = ARWorldTrackingConfiguration()
        self.sceneView.session.run(configuration, options: [.removeExistingAnchors])

Функция включения / выключения фонарика:

private func turnTorch(enabled: Bool) {
    guard let device = AVCaptureDevice.default(for: AVMediaType.video) else {
        return // Cant initiate avcapturedevice error
    }

    if device.hasTorch {
        do {
            try device.lockForConfiguration()

            if enabled {
                device.torchMode = .on
            } else {
                device.torchMode = .off
            }

            device.unlockForConfiguration()
        } catch {
            return //Torch could not be used, lock for configuration failed
        }

    } else {
        return // Torch not available error
    }
}

1 Ответ

0 голосов
/ 08 декабря 2018

Это потому, что вы пытаетесь включить фонарик (фонарик) за некоторое время до начала сеанса.Используя SceneKit, я попробовал этот подход и работал для меня нормально:

Сначала добавьте эту переменную в свой класс, чтобы знать, когда ваш фонарик (факел) включен или выключен:

var isTorchOn = false

Далее, внедрите метод ARSCNViewDelegate didRenderScene и, когда сессия будет готова, включите там фонарик.Поскольку этот делегат выполняется в каждом кадре, вам нужно использовать isTorchOn для запуска метода фонарика только один раз.

Также обратите внимание, что я добавил флаг isTorchOn внутри вашего метода turnTorch вобновите его значение.

Окончательный и упрощенный код:

class ViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var sceneView: ARSCNView!

    var isTorchOn = false

    private func turnTorch(enabled: Bool) {
        guard let device = AVCaptureDevice.default(for: AVMediaType.video) else {
            return // Cant initiate avcapturedevice error
        }

        if device.hasTorch {
            do {
                try device.lockForConfiguration()

                if enabled {
                    device.torchMode = .on
                } else {
                    device.torchMode = .off
                }
                self.isTorchOn = enabled // *** Add this line! ***

                device.unlockForConfiguration()
            } catch {
                return
            }

        } else {
            return
        }
    }

    func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
        if self.sceneView.session.currentFrame != nil {
            if !isTorchOn {
                turnTorch(enabled: true)
            }
        }
    }

    func sessionWasInterrupted(_ session: ARSession) {
        // Probably you would want to turn the torch off here.
    }

    func sessionInterruptionEnded(_ session: ARSession) {
        // Probably you would want to turn the torch on again here.
    }

}

Вы можете использовать тот же подход, если используете SpriteKit.

...