Notifications
Article
使用Unity ARKit插件进行ARKit 1.5开发
Published 7 months ago
548
0
Apple在2018年春季更新中宣布了增强现实的新功能,Unity的ARKit插件现已完全支持这些新功能。iOS 11中推出的 ARKit 为无数的 iPhone 和 iPad 用户带来出色的增强现实技术。Apple这次带来的ARKit 1.5,将为开发者提供多款工具,强化沉浸式增强现实体验,使其更逼真地融入现实世界。
使用Unity最新更新的ARKit插件,开发者们如今能完全利用ARKit 1.5的新功能,开发出新一代增强现实应用。除了水平平面外,新的插件还能识别垂直平面上的垂直对象,以更高的精度绘制不规则平面。还能查找和识别现实中2D图像的位置,将这些信息转换为AR体验,除此之外,还有重定位、视频格式、自动对焦和重置世界原点等一系列新功能。
最新版ARKit插件下载地址:
https://bitbucket.org/Unity-Technologies/unity-arkit-plugin
设置
配置要求
  • 支持ARKit的iOS设备,并安装有Apple提供的最新iOS 11.3 beta版。
  • Mac版本:macOS 10.13 (High Sierra)或更高版。
  • Unity版本:Unity 2017.1或更高版本。
  • Apple开发者网站最新的XCode 9.3 beta版,需要macOS 10.13。
  • Unity ARKit插件在Bitbucket上托管的最新版本“spring2018 update”分支。
操作步骤
  • 启动Unity 2017.1或更高版本。
  • 从Bitbucket的“unity-arkit-plugin”项目下载ARkit插件。
  • 载入示例场景或创建新场景。
  • 在Unity中构建场景,然后生成XCode项目。
  • 打开创建好的XCode项目,构建并在支持ARKit的设备上运行。
垂直平面
新功能中,最受关注的一个是垂直平面功能。在旧版ARKit发布时,ARKit只支持检测水平平面,众多开发者们对垂直平面检测功能呼声高涨。这次更新后,Apple将回应这些呼声,提供垂直平面检测功能。
在Unity的UnityARPlaneDetection枚举中,你可以看到这个额外条目。我们还加入了另一个条目,用于同时检测垂直和水平平面。在ARPlaneAnchorAlignment枚举中,还加入了一个名为“vertical”的条目,用来识别每个检测到的平面锚点的方向。
无需新示例,你只要稍微修改一下原始的“Assets/UnityARKitPlugin/Examples/UnityARKitScene /UnityARKitScene.scene”中的UnityCameraManager.cs,就能依照自己的配置来同时检测水平和垂直平面。
在场景层级窗口中,选择ARCameraManager游戏对象,然后在检视窗口选择”Horizontal And Vertical”。
新的平面检测功能也能检测垂直平面。下面这个例子展示了在同一设备中识别出的二种平面:
现在你可以把虚拟门窗放到墙壁上,还能挂上一些艺术作品来装饰墙壁。
平面边界和细节网格
ARKit不仅提供了平面中心和矩形范围,还提供了更详细的可视化平面边界,以及被检测平坦表面形状的细节网格。
这些功能是通过ARPlaneGeometry实现的,它被作为ARPlaneAnchor的一部分返回。进一步研究你会发现,它的结构类似文章《iPhone X上的ARKit 人脸跟踪》中出现的ARFaceGeometry。
你将会得到一个表示边界点的向量数组,与LineRenderer一起使用,可展现被检测平坦表面的边界。你还会得到一个顶点数组和这些顶点上的纹理坐标,还有用于表示表面形状的细节网格三角形的索引列表。
如果你想知道如何使用这些信息,请查看Assets/UnityARKitPlugin/Examples /ARKit1.5/UnityARPlaneMesh/UnityARPlaneMesh.scene。该场景的设置就像上述UnityARKitScene一样,但其中的GeneratePlanes游戏对象引用的是ARKitPlaneGeometry预制件而非debugPlanePrefab。
查看下检视窗口中的ARKitPlaneGeometry预制件:
这个新的预制件有一个LineRenderer和一个MeshRenderer,它会从ARPlaneAnchor接收关于ARPlaneGeometry边界和形状的信息,然后插入到这二个渲染器中。
查看以下ARKitPlaneMeshRender.cs的代码来了解这些步骤是如何完成的:
public void UpdateMesh(ARPlaneAnchor arPlaneAnchor) { planeMesh.vertices = arPlaneAnchor.planeGeometry.vertices; planeMesh.uv = arPlaneAnchor.planeGeometry.textureCoordinates; planeMesh.triangles = arPlaneAnchor.planeGeometry.triangleIndices; lineRenderer.positionCount = arPlaneAnchor.planeGeometry.boundaryVertexCount; lineRenderer.SetPositions (arPlaneAnchor.planeGeometry.boundaryVertices); planeMesh.RecalculateBounds(); planeMesh.RecalculateNormals(); }
现在将上述场景构建到设备中,将其对准形状奇特的平坦表面,确认它们的真实形状是否能显示出来:
图像锚点
图像锚点是本次更新中最重要和最复杂的新功能。它允许你检测场景中的特定图像或标记。在特点位置创建锚点,用于描述位置信息、大小和标记方向。
打开Assets/UnityARKitPlugin/Examples/ARKit1.5/ UnityARImageAnchor/ UnityARImageAnchor.scene 进行操作。
在Unity中,我们需要设置参考图像和图像集,并允许我们的配置引用任意图像集进行检测。为了实现这一点,我们使用二种新的资源类型:ARReferenceImage和ARReferenceImagesSet。这些资源可以点击菜单Assets/Create/UnityARKitPlugin创建。
你可以为每个想要检测的图像分别创建一个ARReferenceImage资源,然后在其Image Texture字段填入实际图像集的引用,场景中被检测图像的物理大小,以及想要在引用图像时使用的名字。这里我们看一个场景文件夹中的示例资源:
在场景中为每一个需要检测的图像创建这样的资源。然后创建一个ARReferenceImagesSet集合,把所有需要的每个ARReferenceImage资源引用添加到其中。还应该输入一个资源组名字,我们将用这个名字来在AR配置中引用该图像集:
根据需要可以增加大小和增加更多参考图像。在场景中ARCameraManager游戏对象的属性检视窗口中,输入想要检测的ARReferenceImagesSet引用:
Detection Images字段中输入了ARImagesSet_UnityLogo。此配置现在将会查找包含在所引用的ARReferenceImagesSet中所有的ARReferenceImages图像。当图像集中的任一图像被检测到后,会得到相关事件,它们将添加、更新、移除与那个图像相关的ARImageAnchor对象。当特定ARReferenceImage被检测到时,我们会使用名为GenerateImageAnchor的脚本来将合适的预制件实例放上去。
请查看GenerateImageAnchor.cs代码,来了解我们如何使用ARImageAnchor事件和每个锚点引用的ARReferenceImage:
void Start () { UnityARSessionNativeInterface.ARImageAnchorAddedEvent += AddImageAnchor; UnityARSessionNativeInterface.ARImageAnchorUpdatedEvent += UpadteImageAnchor; UnityARSessionNativeInterface.ARImageAnchorRemovedEvent += RemoveImageAnchor; } void AddImageAnchor(ARImageAnchor arImageAnchor) { Debug.Log ("image anchor added"); if (arImageAnchor.referenceImageName == referenceImage.imageName) { Vector3 position = UnityARMatrixOps.GetPosition (arImageAnchor.transform); Quaternion rotation = UnityARMatrixOps.GetRotation (arImageAnchor.transform); imageAnchorGO = Instantiate<GameObject> (prefabToGenerate, position, rotation); } }
现在将这个场景构建到XCode。查看XCode项目,你会发现每个ARReferenceImageSet都会显示为一个AR资源组,名为你在对应资源中所使用的名字:
如果你想知道这是如何在场景中应用的,打印出场景文件夹中的参考图像png文件的拷贝,确保其大小和标记物理大小属性值一致。然后在设备上运行场景,移动到你想要放置标记拷贝的位置。你会看到一个坐标轴预制件游戏对象的实例出现在标记处。
重定位
在此之前,如果接到电话或是把ARKit应用切换到后台时,会丢失世界跟踪信息,所有对象也会丢失原有位置, 通过本次更新,ARKit会在应用中断后保留原有世界跟踪信息,只要没离开原有位置太远就能恢复使用。有了这个新功能,我们可以设置一个跟踪状态原因来指定ARKit在中断后重新定位所需时间:ARTrackingStateReason枚举现在有一个名为ARTrackingStateReasonRelocalizing的条目。
此功能是可选择的,要是你不想使用这个新功能,可以将UnityARSessionNativeInterface.ARSessionShouldAttemptRelocalization设置为false。
打开场景Assets/UnityARKitPlugin/Examples/ARKit1.5/UnityARKitRelocalize/ UnityARKitRelocalize.scene可查看这项功能的实现方式。这个场景能够在二种模式间转换,可以在ARKit重新定位时查看跟踪状态和跟踪状态原因。请查看RelocalizationControl.cs代码来了解该项功能是如何实现的。
自动对焦
对ARKit来说,摄像机之前被设定为无限对焦。现在你可以在ARKit摄像机选择无限对焦或自动对焦。默认情况下,要是设备已经更新了ARKit的最新版本,摄像机会被设为自动对焦。要想修改对焦模式,可以在启动ARKit前,在设置中修改我们新引入的布尔值enableAutoFocus。
打开Assets/UnityARKitPlugin/Examples/UnityARKitScene/UnityARKitScene.scene,然后查看ARCameraManager游戏对象,现在该对象有个“Enable Auto Focus”选项,这个属性会传到ARKitWorldTrackingSession配置中(请查看UnityARCameraManager.cs):
构建并运行场景,可以通过启用或禁用该选项来了解这二种模式的不同之处。
视频格式
开发者们的另一个需求,是提高ARKit应用上显示视频的分辨率。这次更新为AR应用提供了更高分辨率视频,你要根据实际使用设备来选择其它视频格式。
如果你想要枚举设备所支持的视频格式,可以调用静态方法UnityARVideoFormat.SupportedVideoFormats(),它会返回一个UnityARVideoFormats列表,列表中包含宽度、高度和每秒帧数。每个UnityARVideoFormat还包含了一个IntPtr,能用在ARKitWorldTrackingSessionConfiguration 的videoFormat字段,从而以该视频格式初始化你的会话。默认情况下,它会在设备上使用最高分辨率。
打开Assets/UnityARKitPlugin/Examples/ARKit1.5/UnityARVideoFormats/ UnityARVideoFormats.scene 来查看如何使用这个功能。构建并运行在设备上,可以看到一组按钮,分别对应该设备上可用的各种视频格式。选择其中一个按钮,便可用包含所选视频格式的新配置来重置会话。
设置世界原点
现在还加入了一个新功能设置世界原点。它可以使你重新设置AR会话的世界坐标系位置和方向。当一个AR会话开始后,设备的原始位置和方向会用作ARKit世界跟踪的世界坐标系统原点。如果你会想要基于某个现实世界参考点,重置世界坐标系。你就可以使用UnityARSessionNativeInterface.GetARSessionNativeInterface().SetWorldOrigin(),传入一个Unity变换,用于设定新世界坐标系的原点。
请打开
Assets/UnityARKitPlugin/Examples/ARKit1.5/UnityARSetWorldOrigin/ UnityARSetWorldOrigin.scene,构建并尝试这个功能。点击按钮“Set World Origin”会将世界坐标系重置为当前设备的世界变换位置。你也许会注意到,所有已有的锚点都会相对世界起始点更新到新的位置,但没有锚定的虚拟对象则处于相对设备原有世界坐标系的原始位置。
点击测试结果类型
为了支持垂直平面和平面细节几何,我们相应地在ARHitTestResultType枚举中增加了二个条目。它们是ARHitTestResultTypeEstimatedVerticalPlane 和ARHitTestResultTypeExistingPlaneUsingGeometry。请在ARHitTestResultType.cs代码中查看它们的描述。
小结
以上便是新版ARKit中一些有趣的新功能。要想了解更多关于这些功能的信息,请查阅Apple的ARKit文档。请使用简单易用的Unity ARKit插件,通过这些新功能来改善你的ARKit应用。注意,这个更新仍处于Beta测试状态,所以你需要等到该更新正式发布后才能将更新后的应用提交到AppStore上。如果你有任何反馈,欢迎提交到Unity Connect平台!

Unity China
316
Comments