0

我正在尝试用 实施Light EstimationARKit但没有运气。我所做的是session

configuration.isLightEstimationEnabled = true

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

我还需要做些什么才能使其正常工作吗?场景中没有其他灯光,只是autoenablesDefaultLighting。我正在使用iPhone 6s,运行此功能是否太旧?

4

1 回答 1

7

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

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") }

    }
}

然后你需要对返回的值做一些事情并将它们应用到你的场景灯。

因此,将其付诸实践,一个非常基本的示例可能如下所示:

//--------------------------
// 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])

    }
}

希望能帮助到你...

于 2018-07-16T01:15:30.523 回答