4

ARKit 2.0 添加了一个名为 AREnvironmentProbeAnchor 的新类。阅读它的说明,似乎 ARKit 可以自动收集环境纹理(立方体贴图?)。我相信我们现在可以创建一些反映真实环境的虚拟对象。

但我仍然不清楚这是如何工作的,尤其是环境纹理是如何生成的。有没有人有简单的示例代码来演示这个很酷的功能?

4

2 回答 2

2

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 相机不仅可以充当照片/摄像机,还可以充当投影仪(用于在物体上投影纹理)。

于 2018-06-09T09:19:08.010 回答
1

在你的 AR 项目中实现 environmentTexturing 非常简单。

  1. 将您的跟踪配置上的 environmentTexturing 属性设置为自动(ARKit 从您的相机获取视频源以自动创建纹理贴图。您移动相机的次数越多,纹理贴图就越准确。机器学习用于填写空白)

    configuration.environmentTexturing = .automatic
    
  2. 环境纹理需要基于物理的材料才能工作。创建一个简单的闪亮球体来测试反射

    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)
    
于 2018-08-29T03:59:03.573 回答