Swift ARKit灯光估计不起作用

Swift ARKit灯光估计不起作用,swift,arkit,lightning,Swift,Arkit,Lightning,我正试图用ARKit实现Light assessment,但运气不好。我所做的是用 configuration.isLightEstimationEnabled = true 及 我还需要做些什么来让它工作吗?场景中没有其他灯光,只有autoenablesdfaultlighting。我使用的是iphone6s,它是否太旧而无法运行此功能?根据您实际需要实现以下功能可能会有所帮助 autoEnablesDefaultLighting是一个布尔值,用于确定SceneKit是否自动将灯光添加到场景

我正试图用
ARKit
实现
Light assessment
,但运气不好。我所做的是用

configuration.isLightEstimationEnabled = true


我还需要做些什么来让它工作吗?场景中没有其他灯光,只有
autoenablesdfaultlighting
。我使用的是
iphone6s
,它是否太旧而无法运行此功能?

根据您实际需要实现以下功能可能会有所帮助

autoEnablesDefaultLighting
是一个布尔值,用于确定SceneKit是否自动将灯光添加到场景中

默认情况下,这设置为
false
,表示:

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

另一方面,如果设置为
true

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

它位于摄像机的位置,并指向摄像机的方向

在他的优秀文章中指出的一个问题是:


灯光有一个变化的方向,所以当你绕着一个物体走的时候,它会改变 从你的角度来看,光线总是从你的角度发出 (就像你拿着手电筒)事实并非如此 通常,大多数场景都有静态照明,因此您的模型看起来 当你四处走动时,感觉很不自然

isLightEstimationEnabled
另一方面:

在每个ARFrame的lightEstimate属性中提供灯光估计 它能传递信息。 如果为AR场景渲染自己的覆盖图形,则可以使用 这些信息在着色算法中有助于生成这些图形 匹配由捕获的场景的真实世界照明条件 照相机。ARSCNView类自动使用此信息 配置SceneKit照明

这意味着,如果你把房间里的灯光调暗,并想在虚拟对象上应用这些照明条件,使其更逼真,这就是你想要使用的;因为有了这些信息,我们可以从每一帧中获取光照估计值,并修改场景中灯光的强度,以模拟真实世界本身的环境光强度

您可以通过以下设置获取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
//--------------------------
扩展视图控制器:ARSCNViewDelegate{
func渲染器(u渲染器:SCNSceneRenderer,updateAtime时间:TimeInterval){
guard let lightEstimate=self.augmentedRealityView.session.currentFrame?.lightEstimate else{return}
让ambientLightEstimate=lightEstimate.ambientIntensity
让ambientColorTemperature=lightEstimate.ambientColorTemperature
印刷品(
"""
当前灯光估计=\(环境灯光估计)
当前环境光色温估计值=\(环境色温)
""")
如果ambientLightEstimate<100{打印(“照明太暗”)}
}
}
然后,您需要对返回的值执行一些操作,并将它们应用到场景中

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

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

    }
}
//--------------------------
//MARK:-ARSCNViewDelegate
//--------------------------
扩展视图控制器:ARSCNViewDelegate{
func渲染器(u渲染器:SCNSceneRenderer,updateAtime时间:TimeInterval){
//1.获取当前灯光估计值
guard let lightEstimate=self.augmentedRealityView.session.currentFrame?.lightEstimate else{return}
//2.获得环境强度和色温
让ambientLightEstimate=lightEstimate.ambientIntensity
让ambientColorTemperature=lightEstimate.ambientColorTemperature
印刷品(
"""
当前灯光估计=\(环境灯光估计)
当前环境光色温估计值=\(环境色温)
""")
如果ambientLightEstimate<100{打印(“照明太暗”)}
//3.调整场景照明
sceneLight.intensity=环境光估计
sceneLight.temperature=环境色温
}
}
类ViewController:UIViewController{
//1.在显示摄影机提要的故事板中创建对ARSCNView的引用
@IBOUTLE弱var增强真实视图:ARSCNView!
@iButton:UIButton!
//2.创建我们的ARWorld跟踪配置
let configuration=ARWorldTrackingConfiguration()
//3.创建我们的会话
设augmentedRealitySession=ARSession()
//4.创造我们的光
var sceneLight:SCNLight!
//-----------------------
//MARK:-查看生命周期
//-----------------------
重写func viewDidLoad(){
//2.设置会话
设置会话()
//2.生成我们的场景
生成素()
super.viewDidLoad()
}
重写func didReceiveMemoryWarning(){super.didReceiveMemoryWarning()}
//-------------------------
//MARK:-场景生成
//-------------------------
///为场景创建SCNNode和灯光
func generateScene(){
//1.使用SCN空间几何图形创建SCN节点
设sphereNode=SCNNode()
让球墨法=SCNSphere(半径:0.2)
球墨测定法。firstMaterial?.diffuse.contents=UIColor.cyan
sphereNode.geometry=球化法
sphereNode.position=SCInvector3(0,0,-1.5)
//2.创建我们的灯光并对其进行定位
sceneLight=SCNLight()
sceneLight.type=.omni
让lightNode=SCNNode()
闪电
//--------------------------
// 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])

    }
}