美文网首页
SceneKit - 让模型自适应真实环境光照的正确姿势

SceneKit - 让模型自适应真实环境光照的正确姿势

作者: 酷走天涯 | 来源:发表于2018-09-11 09:18 被阅读158次

    本节学习目标

    1.如何检测到真实环境中光照的亮度值
    2.如何让游戏场景中的光照匹配这个真实光照

    效果如下


    gif6.gif

    我们认识一下ARSCNViewDelegate 它是继承SCNSceneRendererDelegate, ARSessionObserver

    那我们本节的第一个问题 如何检测到真实环境的光照值呢,就是在SCNSceneRendererDelegate 这个协议里

    func session(_ session: ARSession, didUpdate frame: ARFrame) {
           // 环境光照的强度  强度低于2000
          frame.lightEstimate?.ambientIntensity
          // 环境色温?取值在6000左右
          frame.lightEstimate?.ambientColorTemperature
    }
    

    名词解释

    环境色温:色温是指绝对黑体从绝对温度(-273℃)开始加温后所呈现的颜色

    以上真实环境光照的值需要根据实际项目的需要进行测量,下面问题来了怎么开启环境光照评估呢?

        // 第一步 设置代理
         sceneView.delegate = self  
        let configuration = ARWorldTrackingConfiguration()
        // 第二 开启光照评估
        configuration.isLightEstimationEnabled = true
        sceneView.session.run(configuration)
    

    完成上面两步就能检测到真实的光源了信息

    下面我们开始第二问题 .如何让游戏场景中的光照匹配这个真实光照

    首先先关闭自动更新灯光选项,不启用默认的灯光

     sceneView.automaticallyUpdatesLighting = false
     sceneView.autoenablesDefaultLighting = false
    

    第二步 自定义灯光 亲测环境光类型没有效果,我们改用方向光代替,上下各加一个方向光

        // 方向朝下的方向光
        directional1.light = SCNLight()
        directional1.light?.type = .ambient
        directional1.light?.intensity = 65
        directional1.light?.zNear = 0
        directional1.position = SCNVector3Make(0, 0, 30)
        directional1.rotation = SCNVector4Make(-1, 0, 0, Float.pi/2.0);
        sceneView.scene.rootNode.addChildNode(directional1)
        // 方向朝上的方向光
        directional2.light = SCNLight()
        directional2.light?.type = .directional
        directional2.light?.zNear = 0
        directional2.position = SCNVector3Make(0, 0, 30)
        directional2.rotation = SCNVector4Make(1, 0, 0, Float.pi/2.0);
        sceneView.scene.rootNode.addChildNode(directional2)
    

    下面就是根据真实的环境光修改场景中这两个灯光值

        self.directional1.light?.intensity = (frame.lightEstimate?.ambientIntensity)!
        self.directional1.light?.temperature =  (frame.lightEstimate?.ambientColorTemperature)!
        self.directional2.light?.intensity = (frame.lightEstimate?.ambientIntensity)!
        self.directional2.light?.temperature =  (frame.lightEstimate?.ambientColorTemperature)!
    

    分享最前沿的技术,助你成功!

    我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3i4a1yo68wsg0

    相关文章

      网友评论

          本文标题:SceneKit - 让模型自适应真实环境光照的正确姿势

          本文链接:https://www.haomeiwen.com/subject/ncdnbxtx.html