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