ARKit 2.0 添加了一个名为 AREnvironmentProbeAnchor 的新类。阅读它的说明,似乎 ARKit 可以自动收集环境纹理(立方体贴图?)。我相信我们现在可以创建一些反映真实环境的虚拟对象。
但我仍然不清楚这是如何工作的,尤其是环境纹理是如何生成的。有没有人有简单的示例代码来演示这个很酷的功能?
ARKit 2.0 添加了一个名为 AREnvironmentProbeAnchor 的新类。阅读它的说明,似乎 ARKit 可以自动收集环境纹理(立方体贴图?)。我相信我们现在可以创建一些反映真实环境的虚拟对象。
但我仍然不清楚这是如何工作的,尤其是环境纹理是如何生成的。有没有人有简单的示例代码来演示这个很酷的功能?
AREnvironmentProbeAnchor
(适用于 iOS 12 及更高版本)是基于图像的照明技术的锚。场景中 3D 模型的着色器可以反射周围环境的光(当然,取决于该着色器中表面的类型,所以让它成为反射铬)。原理很简单:来自 6 个照相机的 6 个正方形图像进入着色材料的 env 反射率通道。这六个摄像头(一个装备)具有以下方向:+x
/ -x
、+y
/ -y
、+z
/ -z
。此操作 ARKit 为您提供完全免费的服务。下图说明了钻机的 6 个方向:
相邻相机的zFar
平面看起来像一个Cube
,不是吗?
而六个摄像头的平截头体就是这个体积Cube
。
纹理的补丁将在您的相机扫描表面的特定位置可用。或者您可以使用先进的机器学习算法(它对用户来说更强大和更容易)来覆盖具有完整 360 度纹理的立方体。
AREnvironmentProbeAnchor
用于将此照片装备定位到场景中的特定点。您需要为 AR 会话启用纹理贴图生成。有两种选择:
ARWorldTrackingConfiguration.EnvironmentTexturing.manual
使用环境纹理,您可以通过创建对象并将其添加到会话中来manual
识别场景中需要光探测纹理贴图的点。AREnvironmentProbeAnchor
ARWorldTrackingConfiguration.EnvironmentTexturing.automatic
通过automatic
环境纹理,ARKit 会自动创建、定位和添加 AREnvironmentProbeAnchor 对象到会话中。
在这两种情况下,ARKit 都会在会话收集相机图像时自动生成环境纹理。使用委托方法,例如
session(_:didUpdate:)
找出纹理何时可用,并从锚的environmentTexture
属性访问它。如果您使用 ARSCNView 和该
automaticallyUpdatesLighting
选项显示 AR 内容,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 configuration = ARWorldTrackingConfiguration()
if #available(iOS 12.0, *) {
configuration.environmentTexturing = .automatic // WHERE A MAGIC HAPPENS
}
sceneView.session.run(configuration)
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
print(anchors)
}
而已。希望这可以帮助。
PS 任何 3D 相机不仅可以充当照片/摄像机,还可以充当投影仪(用于在物体上投影纹理)。
在你的 AR 项目中实现 environmentTexturing 非常简单。
将您的跟踪配置上的 environmentTexturing 属性设置为自动(ARKit 从您的相机获取视频源以自动创建纹理贴图。您移动相机的次数越多,纹理贴图就越准确。机器学习用于填写空白)
configuration.environmentTexturing = .automatic
环境纹理需要基于物理的材料才能工作。创建一个简单的闪亮球体来测试反射
let sphere = SCNSphere(radius: 0.1)
sphere.firstMaterial?.diffuse.contents = UIColor.white
sphere.firstMaterial?.lightingModel = .physicallyBased
sphere.firstMaterial?.metalness.intensity = 1.0
sphere.firstMaterial?.roughness.intensity = 0.0
let sphereNode = SCNNode(geometry: sphere)
sceneView.scene.rootNode.addChildNode(sphereNode)