SceneKit - 让模型自适应真实环境光照的正确姿势
2018-09-11 本文已影响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