如何在ARKit中使用环境贴图?

时间:2018-06-08 23:55:29

标签: swift augmented-reality arkit ios12

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

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

2 个答案:

答案 0 :(得分:1)

AREnvironmentProbeAnchor(适用于iOS 12及更高版本)是基于图像的照明技术的锚点。场景中3D模型的着色器可以反射来自周围环境的光(当然,取决于该着色器中表面的类型,因此请将其作为反射铬)。原理很简单:来自6个照相机的6个方形图像进入着色材料的环境反射率通道。这六个摄像头(装备)具有以下方向:+x / -x+y / -y+z / -z。这个操作ARKit绝对免费。下图显示了钻机的6个方向:

enter image description here

相邻相机' zFar个飞机看起来像 Cube ,不是吗?

六台相机'截头锥是这个Cube的体积。

enter image description here

纹理贴片将在相机扫描表面的确定位置提供。或者,您可以使用先进的机器学习算法(它更健壮,更容易用户)覆盖具有完整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]

if #available(iOS 12.0, *) {
    let configuration = ARWorldTrackingConfiguration()
    configuration.environmentTexturing = .automatic      // WHERE A MAGIC HAPPENS
    sceneView.session.run(configuration)
} else {
    let configuration = ARWorldTrackingConfiguration()
    sceneView.session.run(configuration)
}

func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
    print(anchors)
}

那就是它。希望这会有所帮助。

<强> P.S。 3D中的任何相机不仅可以用作照片/摄像机,还可以用作投影仪(用于在物体上投影纹理)。

答案 1 :(得分:1)

在您的AR项目中实现环境纹理非常简单。

  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)