前不久Apple在WWDC18为AR开发者宣布了一些激动人心的消息,其中包括ARKit 2。如今Unity已和Apple紧密合作,通过更新Unity ARKit 插件让我们的开发者即时访问这些全新功能。
在本文中,我们会介绍ARKit 2新功能的技术细节,告诉你如何通过Unity ARKit 插件使用这些功能。

请访问Bitbucket下载支持ARKit 2的Unity ARKit 插件:
https://bitbucket.org/Unity-Tech ... /src/arkit2.0_beta/

ARWorldMap
ARWorldMap是ARKit 2中一个非常实用的新功能,它能够实现持续性AR体验和共享式多人AR体验。

请在Unity ARKit插件目录下查看示例:Examples/ARKit2.0/UnityARWorldMap/UnityARWorldMap.unity

每个会话都会随着操作者四处移动并检测更多特征点时构建一个ARWorldMap。你可以通过C#从一个会话中获取当前ARWorldMap,将它保存到你的Application.persisentDataPath中。

你也可以在保存的位置载入一个已保存的ARWorldMap。这样即使你离开会话后再回来,虚拟对象仍会在相同的坐标空间出现。

ARWorldMap可以被序列化为一个字节数组,并使用WiFi、蓝牙或分享方式发送到另一个设备上。另一方面,它也能被反序列化,用来将设备重定位到与第一个设备相同的世界坐标映射,从而得到共享的多人游戏体验。

当拥有ARWorldMap后,不管是通过载入得到、还是从内存中获取、亦或是从设备接收,你的设备都能将其设为配置中的一个参数,然后使用该配置重置ARSession,从而共享坐标系统信息。

这样做会重置会话,并且随着你四处移动,应用会尝试将ARWorldMap中的特征点与你环境中所检测到的特征点相互匹配。当它们成功匹配后,会话将重定位你的设备坐标,将其与ARWorldMap中所保存的坐标匹配。

下面是一个更为完整的示例项目,名为SharedSpheres ,它使用了Unity的多人网络连线功能UNet来将ARWorldMap传输到另一设备,同步设备的坐标系统。

115706z66av65o516xk5o5.gif

ARReferenceObject和ARObjectAnchor
类似于ARKit 1.5中用于图像识别的ARReferenceImage和ARImageAnchor,我们现在使用ARReferenceObject和ARObjectAnchor 来进行对象识别。

这是乐高团队在WWDC 18的主题演讲上重点展示的功能,它将用于识别乐高的真实玩具组,并通过将虚拟玩具组覆盖在真实玩具组上方来增强它的效果。

UnityARObjectAnchor示例
如何在Unity中使用UnityARObjectAnchor,请查看插件中的场景Examples/ARKit2.0/UnityARObjectAnchor/UnityARObjectAnchor.unity。

这个示例假设你已经拥有描述识别对象的.arobject文件。你可以从下方介绍的UnityObjectScanner示例创建.arobject文件,也可以通过Apple的ARKit Object Scanner应用来创建,这二种方式都会得到与工作流中使用的相同文件格式。

类似ARReferenceImage,我们也会设置一个ARReferenceObjectsSetAsset,它包含对ARReferenceObjectAssets的引用。然后我们会给ARSession中的配置添加一个对ARReferenceObjectsSetAsset的引用,这样它就能在会话期间尝试检测那个集合中的ARReferenceObjects。这一切都可以在Unity编辑器中完成。

无论何时识别出一个对象,都会创建一个ARObjectAnchor,就如锚点一样,你可以订阅一个事件,当锚点被添加、更新或移除时进行事件触发。

当事件被触发时,你可以决定接下来要做的事,例如在该位置创建预制件。

115712q7feup57cscix5ze.gif

UnityObjectScanner示例
UnityObjectScanner是个更为完整的示例项目,它能使用一个边界对话框来进行对象的创建和对象检测。你可以在以下目录查看:
Examples/ARKit2.0/UnityARObjectScanner/UnityARObjectScanner.unity

你可以使用这个示例项目保存已扫描的.arobjects,然后使用iTunes文件分享功能将它们传输到你的Mac上。当你在Mac上得到这些文件后,你可以在把它们载入Unity项目前重命名这些文件。

这个示例项目有二个不同的模式:扫描模式和检测模式。对扫描模式而言,我们会使用ARKitObjectScanningSessionConfiguration,它会在场景中完成更为细致的探索,但它会使用更多的CPU和电量,所以在使用时应进行限制。

通过使用这个配置,你可以在扫描对象附近的平面上点击,产生一个红色方块覆盖对象。你也可以控制方块大小来让它只覆盖感兴趣目标。然后在方块周围扫描,从而尽可能多地在对象上获取特征点。然后你可以按下按钮创建一个ARReferenceObject。创建对象会保存到一个列表中。

115719yym7cf0sfctnr67n.gif

按下Detect按钮会进入检测模式,它的工作方式类似上面的对象锚点示例,但是会使用一个方法动态地添加ARReferenceObjects到检测对象列表中。

按下Save按钮会保存所有已扫描对象到设备上的文件夹中。它会保存这些对象为.arobjects文件,你可以使用iTunes的文件分享功能将它们传输到你的Mac上。当你在Mac上得到这些文件后,你可以在将它们载入Unity项目前重命名这些文件。

AREnvironmentProbeAnchor
AREnvironmentProbeAnchor是一种新的锚点,能够自动生成,也可以由你指定要在哪里创建。这个锚点将基于ARKit视频帧和世界跟踪数据在其周围区域创建并更新反射环境地图。它还会使用一个机器学习算法来进行估算,得到未看到部分场景的环境纹理,这个功能基于一个包含大量场景的机器学习训练模型实现。

在Unity中使用AREnvironmentProbeAnchor,请查看目录:Examples/ARKit2.0/UnityAREnvironmentTexture

在会话配置中有一个全新参数,用来控制这个功能,拥有以下三种可选的模式:
UnityAREnvironmentTexturingNone UnityAREnvironmentTexturingManual UnityAREnvironmentTexturingAutomatic。

UnityAREnvironmentTexturingManual模式下,你必须自行创建AREnvironmentProbeAnchor,但ARKit会更新从环境中采集的纹理。

如果你使用UnityAREnvironmentTexturingAutomatic模式,ARKit将根据从会话和在空间中的移动情况推算的数据,在程序化生成的空间间隔中创建AREnvironmentProbeAnchors。

这些示例都会生成一个包含ReflectionProbe组件的预制件,并由在AREnvironmentProbeAnchor中得到的环境纹理更新它。这个ReflectionProbe现在会参与标准Unity渲染管线,它将增强任意使用该功能的游戏对象。

115727ulo65i4503ptml5l.gif

图像追踪
参考图像的工作方式和ARKit 1.5中的一样,但现在它不仅能识别图像,ARKit还能让你追踪它们:当你移动参考图像时,与图像相关联的ARImageAnchor 会与图像一起移动,所以你可以移动锚定在这些移动图像上的内容。

在会话配置中还有一个额外参数,它能让你通过声明会话中要同时追踪的图像数量来实现图像追踪。已有的示例已经进行更新,能够使用这个新功能。

115735uzwaz7q3nz627r32.gif

面部追踪改进内容
ARKit 2还改进了iPhone X的面部追踪功能,带来一些全新功能。首先加入了一个额外的混合形状系数,名为TongueOut。它会根据ARKit 2面部追踪所感知到的舌头伸出距离,返回一个介于0.0和1.0之间的数值。在WWDC 18发布会上,Apple的动话表情展示了这个新功能,这个功能很受欢迎。

的改进内容还有凝视追踪功能。你会得到一个Transform,它将描述眼睛所朝的方向,还有正被观察对象的位置。

从示例中了解如何使用这个来自面部锚点的数据,请查看Examples/ARKit2.0/UnityTongueAndEyes/UnityTongueAndEyes.unity ,

下图将展示这个示例。
115742dtiwi3wdsiufu8ii.gif

小结
请从Bitbucket 下载Unity ARKit插件的最新版本,尝试构建示例项目到你的iOS设备上。然后使用我们提供的这个简单易用的工具来创建精彩的AR体验, 享受创作的快乐!更多Unity精彩内容尽在Unity官方中文论坛(Unitychina.cn) !
ARKIT锐亚教育

锐亚教育 锐亚科技 unity unity教程