前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SceneKit - 让模型自适应真实环境光照的正确姿势

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

作者头像
酷走天涯
发布2018-09-14 15:23:30
1.1K0
发布2018-09-14 15:23:30
举报

本节学习目标

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

效果如下

gif6.gif

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

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

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

名词解释

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

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

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

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

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

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

代码语言:javascript
复制
 sceneView.automaticallyUpdatesLighting = false
 sceneView.autoenablesDefaultLighting = false

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

代码语言:javascript
复制
    // 方向朝下的方向光
    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)

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

代码语言:javascript
复制
    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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本节学习目标
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档