[Unity] 使用Unity ARKit插件进行ARKit 1.5开发

查看:456 |回复:0 | 2019-11-14 09:57:56

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 kanisen 于 2019-11-14 10:02 编辑

A082B71B95B3FA0CFBF1F64A0943AEDD.jpg



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的代码来了解这些步骤是如何完成的:

  1. public void UpdateMesh(ARPlaneAnchor arPlaneAnchor)
  2.         {
  3.                planeMesh.vertices = arPlaneAnchor.planeGeometry.vertices;
  4.                planeMesh.uv = arPlaneAnchor.planeGeometry.textureCoordinates;
  5.                planeMesh.triangles = arPlaneAnchor.planeGeometry.triangleIndices;

  6.                lineRenderer.positionCount = arPlaneAnchor.planeGeometry.boundaryVertexCount;
  7.                lineRenderer.SetPositions (arPlaneAnchor.planeGeometry.boundaryVertices);
  8.                planeMesh.RecalculateBounds();
  9.                planeMesh.RecalculateNormals();

  10.         }
点击此处复制文本



现在将上述场景构建到设备中,将其对准形状奇特的平坦表面,确认它们的真实形状是否能显示出来:



图像锚点

图像锚点是本次更新中最重要和最复杂的新功能。它允许你检测场景中的特定图像或标记。在特点位置创建锚点,用于描述位置信息、大小和标记方向。

打开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:

  1. void Start () {
  2.                UnityARSessionNativeInterface.ARImageAnchorAddedEvent += AddImageAnchor;
  3.                UnityARSessionNativeInterface.ARImageAnchorUpdatedEvent += UpadteImageAnchor;
  4.                UnityARSessionNativeInterface.ARImageAnchorRemovedEvent += RemoveImageAnchor;

  5.         }

  6.         void AddImageAnchor(ARImageAnchor arImageAnchor)
  7.         {
  8.                Debug.Log ("image anchor added");
  9.                if (arImageAnchor.referenceImageName == referenceImage.imageName) {
  10.                        Vector3 position = UnityARMatrixOps.GetPosition (arImageAnchor.transform);
  11.                        Quaternion rotation = UnityARMatrixOps.GetRotation (arImageAnchor.transform);

  12.                        imageAnchorGO = Instantiate<GameObject> (prefabToGenerate, position, rotation);
  13.                }
  14.         }
点击此处复制文本



现在将这个场景构建到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应用。





评分

参与人数 2元素币 +10 活跃度 +20 展开 理由
胖纸Jeremy + 8
源支始 + 10 + 12

查看全部评分

2019-11-14 09:57:56  
 赞 赞 0

使用道具 登录

0个回答,把该问题分享到群,邀请大神一起回答。

CG 游戏行业专业问题

手机游戏引擎手游引擎Unity3D技术
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表