请选择 进入手机版 | 继续访问电脑版

查看: 1271|回复: 1

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

[复制链接]

1061

主题

1747

帖子

2万

贡献

管理员

Rank: 9Rank: 9Rank: 9

积分
22725
QQ
发表于 2018-3-13 04:00:03 | 显示全部楼层 |阅读模式
Apple在2018年春季更新中宣布了增强现实的新功能,Unity的ARKit插件现已完全支持这些新功能。iOS 11中推出的 ARKit 为无数的 iPhone 和 iPad 用户带来出色的增强现实技术。Apple这次带来的ARKit 1.5,将为开发者提供多款工具,强化沉浸式增强现实体验,使其更逼真地融入现实世界。

00.png


使用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”。

01.png


新的平面检测功能也能检测垂直平面。下面这个例子展示了在同一设备中识别出的二种平面:

02.png


现在你可以把虚拟门窗放到墙壁上,还能挂上一些艺术作品来装饰墙壁。


平面边界和细节网格
ARKit不仅提供了平面中心和矩形范围,还提供了更详细的可视化平面边界,以及被检测平坦表面形状的细节网格。

这些功能是通过ARPlaneGeometry实现的,它被作为ARPlaneAnchor的一部分返回。进一步研究你会发现,它的结构类似文章《iPhone X上的ARKit 人脸跟踪》中出现的ARFaceGeometry。

你将会得到一个表示边界点的向量数组,与LineRenderer一起使用,可展现被检测平坦表面的边界。你还会得到一个顶点数组和这些顶点上的纹理坐标,还有用于表示表面形状的细节网格三角形的索引列表。

如果你想知道如何使用这些信息,请查看Assets/UnityARKitPlugin/Examples /ARKit1.5/UnityARPlaneMesh/UnityARPlaneMesh.scene。该场景的设置就像上述UnityARKitScene一样,但其中的GeneratePlanes游戏对象引用的是ARKitPlaneGeometry预制件而非debugPlanePrefab。

查看下检视窗口中的ARKitPlaneGeometry预制件:

03.png


这个新的预制件有一个LineRenderer和一个MeshRenderer,它会从ARPlaneAnchor接收关于ARPlaneGeometry边界和形状的信息,然后插入到那二个渲染器中。

查看以下ARKitPlaneMeshRender.cs的代码来了解这些步骤是如何完成的:
[C#] 纯文本查看 复制代码
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();

        }


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

04.png


图像锚点

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

打开Assets/UnityARKitPlugin/Examples/ARKit1.5/ UnityARImageAnchor/ UnityARImageAnchor.scene 进行操作。

在Unity中,我们需要设置参考图像和图像集,并允许我们的配置引用任意图像集进行检测。为了实现这一点,我们使用二种新的资源类型:ARReferenceImage和ARReferenceImagesSet。这些资源可以点击菜单Assets/Create/UnityARKitPlugin创建。

05.png


你可以为每个想要检测的图像分别创建一个ARReferenceImage资源,然后在其Image Texture字段填入实际图像集的引用,场景中被检测图像的物理大小,以及想要在引用图像时使用的名字。这里我们看一个场景文件夹中的示例资源:

06.png


在场景中为每一个需要检测的图像创建这样的资源。然后创建一个ARReferenceImagesSet集合,把所有需要的每个ARReferenceImage资源引用添加到其中。还应该输入一个资源组名字,我们将用这个名字来在AR配置中引用该图像集:

07.png


根据需要可以增加大小和增加更多参考图像。在场景中ARCameraManager游戏对象的属性检视窗口中,输入想要检测的ARReferenceImagesSet引用:

08.png


Detection Images字段中输入了ARImagesSet_UnityLogo。此配置现在将会查找包含在所引用的ARReferenceImagesSet中所有的ARReferenceImages图像。当图像集中的任一图像被检测到后,会得到相关事件,它们将添加、更新、移除与那个图像相关的ARImageAnchor对象。当特定ARReferenceImage被检测到时,我们会使用名为GenerateImageAnchor的脚本来将合适的预制件实例放上去。

09.png


请查看GenerateImageAnchor.cs代码,来了解我们如何使用ARImageAnchor事件和每个锚点引用的ARReferenceImage:
[C#] 纯文本查看 复制代码
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资源组,名为你在对应资源中所使用的名字:

10.png


如果你想知道这是如何在场景中应用的,打印出场景文件夹中的参考图像png文件的拷贝,确保其大小和标记物理大小属性值一致。然后在设备上运行场景,移动到你想要放置标记拷贝的位置。你会看到一个坐标轴预制件游戏对象的实例出现在标记处。

11.png


重定位
在此之前,如果接到电话或是把ARKit应用切换到后台时,会丢失世界跟踪信息,所有对象也会丢失原有位置, 通过本次更新,ARKit会在应用中断后保留原有世界跟踪信息,只要没离开原有位置太远就能恢复使用。有了这个新功能,我们可以设置一个跟踪状态原因来指定ARKit在中断后重新定位所需时间:ARTrackingStateReason枚举现在有一个名为ARTrackingStateReasonRelocalizing的条目。

此功能是选择的,要是你不想使用这个新功能,可以将UnityARSessionNativeInterface.ARSessionShouldAttemptRelocalization设置为false。

打开场景Assets/UnityARKitPlugin/Examples/ARKit1.5/UnityARKitRelocalize/ UnityARKitRelocalize.scene可查看这项功能的实现方式。这个场景能够在二种模式间转换,可以在ARKit重新定位时查看跟踪状态和跟踪状态原因。请查看RelocalizationControl.cs代码来了解该项功能是如何实现的。

https://v.qq.com/x/page/w0557o3kjbv.html
  
自动对焦
对ARKit来说,摄像机之前被设定为无限对焦。现在你可以在ARKit摄像机选择无限对焦或自动对焦。默认情况下,要是设备已经更新了ARKit的最新版本,摄像机会被设为自动对焦。要想修改对焦模式,可以在启动ARKit前,在设置中修改我们新引入的布尔值enableAutoFocus。

打开Assets/UnityARKitPlugin/Examples/UnityARKitScene/UnityARKitScene.scene,然后查看ARCameraManager游戏对象,现在该对象有个“Enable Auto Focus”选项,这个属性会传到ARKitWorldTrackingSession配置中(请查看UnityARCameraManager.cs):

12.png


构建并运行场景,可以通过启用或禁用该选项来了解这二种模式的不同之处。

视频格式
开发者们的另一个需求,是提高ARKit应用上显示视频的分辨率。这次更新为AR应用提供了更高分辨率视频,你要根据实际使用设备来选择其它视频格式。

如果你想要枚举设备所支持的视频格式,可以调用静态方法UnityARVideoFormat.SupportedVideoFormats(),它会返回一个UnityARVideoFormats列表,列表中包含宽度、高度和每秒帧数。每个UnityARVideoFormat还包含了一个IntPtr,能用在ARKitWorldTrackingSessionConfiguration 的videoFormat字段,从而以该视频格式初始化你的会话。默认情况下,它会在设备上使用最高分辨率。

打开Assets/UnityARKitPlugin/Examples/ARKit1.5/UnityARVideoFormats/ UnityARVideoFormats.scene 来查看如何使用这个功能。构建并运行在设备上,可以看到一组按钮,分别对应该设备上可用的各种视频格式。选择其中一个按钮,便可用包含所选视频格式的新配置来重置会话。

13.png


设置世界原点
现在还加入了一个新功能设置世界原点。它可以使你重新设置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中文官方论坛(Unitychina.cn)!

0

主题

1

帖子

15

贡献

初级UU族—1级

Rank: 1

积分
15
发表于 2018-3-13 04:32:27 | 显示全部楼层
llllllll;
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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