根据您实现以下目标的实际需要,可能会有所帮助。
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") }
}
}
然后你需要对返回的值做一些事情并将它们应用到你的场景灯。
因此,将其付诸实践,一个非常基本的示例可能如下所示:
//--------------------------
// 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])
}
}
希望能帮助到你...