AREnvironmentProbeAnchor
(适用于 iOS 12.0+)是基于图像的照明技术的支柱。模型的 PBR 着色器可以反射周围环境的光线。原理很简单:来自源的 6 个方形图像进入着色材质的环境反射率通道。这六个来源(装备)具有以下方向:+x
/-x
, +y
/-y
, +z
/-z
。下图展示了装备的 6 个方向:
邻近的zFar
飞机看起来像Cube
,不是吗?
纹理的补丁将在相机扫描表面的特定位置可用。 ARKit 使用先进的机器学习算法来覆盖具有完整 360 度纹理的立方体。
AREnvironmentProbeAnchor
用于将该摄影装置定位在场景中的特定点。您所要做的就是在 AR 会话中启用环境纹理贴图生成。有两种选择:
ARWorldTrackingConfiguration.EnvironmentTexturing.manual
With manual
环境纹理,您可以通过创建来识别场景中需要光探针纹理贴图的点AREnvironmentProbeAnchor
对象并将它们添加到会话中。
ARWorldTrackingConfiguration.EnvironmentTexturing.automatic
With automatic
环境纹理,ARKit 会自动创建、定位 AREnvironmentProbeAnchor 对象并将其添加到会话中。
在这两种情况下,ARKit 都会在会话收集相机图像时自动生成环境纹理。使用委托方法,例如session(_:didUpdate:)
找出纹理何时可用,并从锚点访问它environmentTexture
财产。
如果您使用 ARSCNView 显示 AR 内容并且automaticallyUpdatesLighting
选项,SceneKit自动检索AREnvironmentProbeAnchor
纹理贴图并使用它们来照亮场景。
这是你的代码的方式ViewController.swift
可能看起来像:
sceneView.automaticallyUpdatesLighting = true
let torusNode = SCNNode(geometry: SCNTorus(ringRadius: 2, pipeRadius: 1.5))
sceneView.scene.rootNode.addChildNode(torusNode)
let reflectiveMaterial = SCNMaterial()
reflectiveMaterial.lightingModel = .physicallyBased
reflectiveMaterial.metalness.contents = 1.0
reflectiveMaterial.roughness.contents = 0
reflectiveMaterial.diffuse.contents = UIImage(named: "brushedMetal.png")
torusNode.geometry?.firstMaterial = [reflectiveMaterial]
let config = ARWorldTrackingConfiguration()
if #available(iOS 12.0, *) {
config.environmentTexturing = .automatic // magic happens here
}
sceneView.session.run(config)
然后使用一个session(...)
实例方法:
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
guard let envProbeAnchor = anchors.first as? AREnvironmentProbeAnchor
else { return }
print(envProbeAnchor.environmentTexture)
print(envProbeAnchor.extent)
}