ARKit灯光估算不起作用

时间:2018-07-15 19:06:18

标签: swift arkit lightning

我正在尝试用Light Estimation实现ARKit,但是没有运气。我所做的是使用

运行session
configuration.isLightEstimationEnabled = true

arSceneView.scene                        = SCNScene()
arSceneView.autoenablesDefaultLighting   = true
arSceneView.automaticallyUpdatesLighting = true

我还需要做其他事情才能使它工作吗?场景中没有其他灯光,只有autoenablesDefaultLighting。我正在使用iPhone 6s,可以运行该功能太老了吗?

1 个答案:

答案 0 :(得分:4)

根据实际需要实现以下目标可能会有所帮助。

autoEnablesDefaultLighting是一个布尔值,它确定SceneKit是否自动向场景添加灯光。

默认情况下,此设置为false,这意味着:

  

SceneKit用于渲染场景的唯一光源是那些   包含在场景图中。

另一方面,将其设置为true

  

SceneKit自动添加和放置全向光源   渲染不包含灯光或仅包含环境的场景时   灯。

此位置位于相机的位置并指向相机的方向。

Mark Daws在他的精彩文章中提到的一个问题是:

  

灯光的方向不断变化,因此当您绕着物体行走时   总是看起来像光从您的角度来看   (例如您正手持火把),情况并非如此   通常,大多数场景都有静态照明,因此您的模型看起来   当您四处走动时不自然。

isLightEstimationEnabled

  

在每个ARFrame的lightEstimate属性中提供光线估计   它提供。   如果为AR场景渲染自己的叠加层图形,则可以使用   着色算法中的此信息可帮助制作这些图形   匹配现实世界中由场景捕获的照明条件   相机。 ARSCNView类自动使用此信息来   配置SceneKit照明。

这意味着,例如,如果您将房间中的灯光调暗,并且想要将这些照明条件应用于虚拟对象以使其更加逼真,那就是您要使用的;因为有了这些信息,我们可以从每一帧中获取lightEstimate并修改场景中的灯光强度以模仿现实世界本身的环境光强度。

您可以通过设置以下内容来获取LightingEstimate的详细信息:

configuration.isLightEstimationEnabled = true

然后使用以下回调:

//--------------------------
// MARK: - ARSCNViewDelegate
//--------------------------

extension ViewController: ARSCNViewDelegate{

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

        guard let lightEstimate = self.augmentedRealityView.session.currentFrame?.lightEstimate else { return }

        let ambientLightEstimate = lightEstimate.ambientIntensity

        let ambientColourTemperature = lightEstimate.ambientColorTemperature


        print(
            """
            Current Light Estimate = \(ambientLightEstimate)
            Current Ambient Light Colour Temperature Estimate = \(ambientColourTemperature)
            """)


        if ambientLightEstimate < 100 { print("Lighting Is Too Dark") }

    }
}

然后,您需要对返回的值进行处理,并将其应用到sceneLights。

将其付诸实践,因此一个非常基本的示例可能看起来像这样:

//--------------------------
// MARK: - ARSCNViewDelegate
//--------------------------

extension ViewController: ARSCNViewDelegate{

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

        //1. Get The Current Light Estimate
        guard let lightEstimate = self.augmentedRealityView.session.currentFrame?.lightEstimate else { return }

        //2. Get The Ambient Intensity & Colour Temperatures
        let ambientLightEstimate = lightEstimate.ambientIntensity

        let ambientColourTemperature = lightEstimate.ambientColorTemperature

        print(
            """
            Current Light Estimate = \(ambientLightEstimate)
            Current Ambient Light Colour Temperature Estimate = \(ambientColourTemperature)
            """)

        if ambientLightEstimate < 100 { print("Lighting Is Too Dark") }

        //3. Adjust The Scene Lighting
        sceneLight.intensity = ambientLightEstimate
        sceneLight.temperature = ambientColourTemperature
    }
}

class ViewController: UIViewController {

    //1. Create A Reference To Our ARSCNView In Our Storyboard Which Displays The Camera Feed
    @IBOutlet weak var augmentedRealityView: ARSCNView!
    @IBOutlet weak var takeSnapshotButton: UIButton!

    //2. Create Our ARWorld Tracking Configuration
    let configuration = ARWorldTrackingConfiguration()

    //3. Create Our Session
    let augmentedRealitySession = ARSession()

    //4. Create Our Light
    var sceneLight: SCNLight!

    //-----------------------
    // MARK: - View LifeCycle
    //-----------------------

    override func viewDidLoad() {

        //2. Setup The ARSession
        setupARSession()

        //2. Generate Our Scene
        generateScene()

        super.viewDidLoad()

    }

    override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() }

    //-------------------------
    // MARK: - Scene Generation
    //-------------------------

    /// Creates An SCNNode & Light For Our Scene
    func generateScene(){

        //1. Create An SCNNode With An SCNSphere Geometry
        let sphereNode = SCNNode()
        let sphereGeometry = SCNSphere(radius: 0.2)
        sphereGeometry.firstMaterial?.diffuse.contents = UIColor.cyan
        sphereNode.geometry = sphereGeometry
        sphereNode.position = SCNVector3(0, 0, -1.5)

        //2. Create Our Light & Position It
        sceneLight = SCNLight()
        sceneLight.type = .omni

        let lightNode = SCNNode()
        lightNode.light = sceneLight
        lightNode.position = SCNVector3(0,0,2)

        //3. Add The Node & Light To Out Scene
        self.augmentedRealityView.scene.rootNode.addChildNode(sphereNode)
        self.augmentedRealityView.scene.rootNode.addChildNode(lightNode)

    }

    //-----------------
    //MARK: - ARSession
    //-----------------

    /// Sets Up The ARSession
    func setupARSession(){

        //1. Set The AR Session
        augmentedRealityView.session = augmentedRealitySession
        augmentedRealityView.delegate = self
        configuration.isLightEstimationEnabled = true
        augmentedRealityView.automaticallyUpdatesLighting = false
        augmentedRealityView.autoenablesDefaultLighting = false
        augmentedRealityView.session.run(configuration, options:[.resetTracking, .removeExistingAnchors])

    }
}

希望有帮助...