Notifications
Article
HoloLens 2开发初窥
Published 19 days ago
29
0
Microsoft MR Dev Day, HoloLens2上手
在五月初举行的MR Dev Days上,微软不仅正式公开了大量的开发内容,还开放了HoloLens 2开发动手实验室,我们有幸在数小时内快速构建了一个引擎拆解应用,效果如下:
这么简单就能做出来这样的应用?在MRTK 2的帮助下真的不难,但首先你需要了解HoloLens 2的一些开发基础知识,在本篇文章中我们就来介绍从混合现实开发者搭建开发环境角度的新特性。

开发环境

操作系统及SDK
开发HoloLens2应用的电脑必须安装有Windows SDK 18362以上版本,也就是要安装“Windows 10 May 2019”或者说1903的SDK。Windows本身需要是1809以上,也可以升级到1903(如果没有推送,可以加入Insider Preview选择Fast Track,有风险)。
开发工具
开发工具首选还是Unity。完善的工具链,C#的开发环境,天生的跨平台特性,丰富的第三方插件,都使得Unity成为最方便好用的开发载体。至少要升级到2018.3以上的版本。因为目前Unity2019版本还不够稳定,所以在较长时间之内,都将建议使用Unity2018进行开发。
Unreal引擎也已经官方支持HoloLens 2,但暂时SDK还没有被放出。Unreal引擎能够打造非常高质量的3D内容,在一些场景下HoloLens 2可产生更好画面效果。本来这次Build大会上的HoloLens 2 demo就是使用这套Unreal SDK制作的整套的登月火箭展示,效果相当不错,可惜由于一些不稳定因素当场演示失败。
比较硬核的开发者还可以选择使用原生DirectX开发,如果水平高的话效率会高很多,这样做的大多是一些拥有自研3D引擎的公司。OpenXR的runtime支持也已经加入,但还比较早期。
由于HoloLens2仍然运行的是UWP程序,所以不管你使用任何环境,最终还是需要Visual Studio 2017进行打包发布。
MRTK v2
要方便地开发HoloLens2应用,最关键的是MRTK v2。MRTK提供了一整套在MR设备上操作、交互及协同的框架,在HoloLens一代的年代,我们还可以不使用MRTK自行开发,但到了HoloLens2的时代,我们几乎已经能绕不开MRTK v2了(或者说,绕开它的成本很高,且毫无意义。后文会再详细讨论MRTK v2)。也许你之前的应用就是用MRTK v1开发的,如果是这样,官方提供了教程,可以将MRTK v1开发的应用迁移到MRTK v2。
HoloLens 2 或 模拟器
有HoloLens 2当然要用HoloLens 2啦!
没有HoloLens2设备的话,我们也可以使用模拟器进行开发。如要安装HoloLens2模拟器,需要将操作系统升级到1809版本或以上。

编译架构

HoloLens2已经进化到ARM架构,因此在Visual Studio中,发布平台要选择ARM。Unity 2018.3版本尚不能支持ARM64,所以目前发布的平台只是ARM32。如果要使用ARM64,需要等待Unity 2019稳定。

开发套件(MRTK v2)

MRTK v2相比老版本做了大量的进化,不客气地说,MRTK v2绝对是目前MR开发最强大的套件,没有之一。MRTK v2的代码进行了大量重构,横跨了AR/VR/MR(统称XR),同时,由于增加了对OpenVR的支持,MRTK v2的覆盖面变得更加广泛,可以直接支持HTC Vive和Oculus Rift等VR设备,拥有强大的输入兼容性。经过重构的Input模块,使得所有设备的不同输入方式可以被包容在一起,开发者可以用相对统一的思路,来处理各种不同设备的输入方式。
重构也使得MRTK v2有了更清晰的模块化结构,更灵活的配置性和更好的扩展性。基于MRTKPackage结构进行的开发,使得它的扩展性得到了空前的提升。从下面的package结构图可窥一斑。
使用方面,除了很多组件变得更加清晰好用之外,还引入了大量的配置文件,可以方便地设置MR中的各种核心功能,还可以创建自己的配置以便切换。
最后,从MRTK v2的路线图来看,目前发布的只是RC1版本,而开发团队显然有更大的野心,在后面的规划中还有更多的内容,让我们拭目以待。

自然手势

HoloLens 2给人印象最深刻的特性,就是可以用最自然的方式,让双手和虚拟物体交互了。通过我们此前提到的Azure Kinect深度摄像头实时抓取高分辨率深度数据,HoloLens 2通过机器学习能够近实时捕捉手部的最多25个关节,效果接近Leap Motion,这也就意味着我们可以掌控整个手部的动作(有趣的是,在MR Dev Day上微软的官方推荐也是用Leap Motion来对这种操作进行简单模拟)。手部位置的追踪和基础的手势已经内置在MRTK v2之中,只要使用默认的配置制作的应用,伸出双手,我们就能看到有一双虚拟的手完整的套在你的手上,并随着你的手实时运动。
使用默认的设置,我们就可以随意的用手抓取近处的虚拟物体,如果物体较远,还可以用手部伸出的射线来像光标一样选取。我们可以用手触摸物体,用手抓,用手指捏,可以按、可以推、可以拨动UI。如果你只是简单的想尝试所有这些,甚至不用写一行代码就可以实现。当然了,如果要实现真正可用的功能,还是需要用代码把这些功能整理到你的应用之中。
值得一提的是,MRTK v2中提供了一个能够让人体验全部HoloLens2输入方式和UI的示例场景,上手时,可以优先考虑用它来进行初次体验。

视线追踪

视线追踪也是这次设备带来的重要新功能,设备可以追踪使用者的眼睛所观察的方向,可以真正做到一个眼神就知道你要做什么。通过MRTK v2提供的功能,我们能获取使用者当前眼镜所注视的位置,可以用视线来选取物体,滚动文本,甚至可以统计使用者视线聚焦的位置情况,以便更好的分析使用者的操作习惯。
但是,由于视线移动非常灵活,过度使用视线追踪有可能会造成使用者的困扰,产生大量违背使用者意图的误操作,因此官方建议只在合适的地方尝试使用视线追踪,并多加测试。

共享空间锚

做过多人协同的MR应用的开发者都知道,空间不能共享是一件多么痛苦的事情。当我们有多台MR设备需要在一个共同场景中同步时,由于每一台设备对空间的理解都不相同,我们往往需要逐个调整每一台设备中的空间锚,才能让这些设备中看到的画面看起来在同一个位置。
微软在HoloLens 1阶段曾经设计了一套API,能将空间信息序列化,并通过网络传输给其他HoloLens,让其他设备的空间与这台设备共享。然而当时的这一套机制实用性却不强。一方面,空间信息序列化后过于庞大,经常达到上百MB的容量,网络传输困难;另一方面,其他设备下载空间信息后,有很大概率无法和自身识别的空间进行匹配,导致经常不能使用。随着HoloLens 2的到来,微软也发布了新Azure Spatial Mapping。
Azure Spatial Mapping可以让不同的MR设备之间共享空间认知,不止HoloLens之间分享,还可以涵盖ARKit和ARCore。与之前不同,这次是直接将空间信息通过简单的REST API上传Azure,由Azure管理并存储,其他端则是从Azure下载。我们在Redmond进行了简单的测试,上传下载的速度还是很快的,比之前应该是做了大幅的优化。世纪互联版Azure据说也要上线该服务,尚不清楚国内版性能会怎么样。
另外,Azure Spatial Mapping还提供了一些附加的功能,例如可以累加式地添加空间锚,不必在一次运行时完全添加,可以在以后打开程序时再次添加;例如还可以在空间锚之间创建联系,帮助使用者进行寻路,获取距离当前空间锚最近的空间锚,等等。
有了Azure Spatial Mapping,我们就可以很容易地在不同的MR设备之间共享空间锚信息,多设备协同时的前期调校工作会变得更加简便。唯一的问题在于,我们必须而且当然要连上Azure公有云才能访问此服务,在纯内网环境中就无法使用了,这时候还是需要自己写相应的映射服务。
无菌@浩哥
CTO - Programmer
3
Comments