我正在尝试用Light Estimation
实现ARKit
,但是没有运气。我所做的是使用
session
configuration.isLightEstimationEnabled = true
和
arSceneView.scene = SCNScene()
arSceneView.autoenablesDefaultLighting = true
arSceneView.automaticallyUpdatesLighting = true
我还需要做其他事情才能使它工作吗?场景中没有其他灯光,只有autoenablesDefaultLighting
。我正在使用iPhone 6s
,可以运行该功能太老了吗?
答案 0 :(得分:4)
根据实际需要实现以下目标可能会有所帮助。
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") }
}
}
然后,您需要对返回的值进行处理,并将其应用到sceneLights。
将其付诸实践,因此一个非常基本的示例可能看起来像这样:
//--------------------------
// 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])
}
}
希望有帮助...