使用Unity开发HoloLens应用

时间:2023-12-14 15:56:50

https://developer.microsoft.com/en-us/windows/holographic/install_the_tools

导读:开发者们在陆续收到HoloLens开发者版的同时,也都着手了HoloLens应用的开发工作。本文作者从空间映射、场景匹配、自然交互等核心特性开始,以实践详解了如何使用Unity引擎开发一个简单的HoloLens应用,并对自己的开发经验进行总结和分享。

  HoloLens概述

  经历数个月的期待与等待,笔者终于拿到了预订的HoloLens开发者版本套件。作为市面上第一款发售的AR/MR设备,HoloLens开发者版本具有很多独特的黑科技。今天,我们就来了解HoloLens的开发特性(参见图1应用场景)。

  使用Unity开发HoloLens应用

  图1 Hololens应用场景

  空间映射

  借助微软特殊定制的全息处理单元(HPU),HoloLens实现了对周边环境的快速扫描和空间匹配。这保证了HoloLens能够准确地在真实世界表面放置或展现全息图形内容,确保了核心的AR体验。

  场景匹配

  HoloLens设备能存储并识别环境信息,恢复和保持不同场景中的全息图像对象。当你离开当前房间再回来时,会发现原有放置的全息图像均会在正确的位置出现。

  自然交互

  HoloLens主要交互方式为凝视(Gaze)、语音(Voice Command)和手势(Gesture),这构成了HoloLens的基本输入要素。同时传统的键盘鼠标等设备也被支持,自然的交互方式更贴近人类习惯,提高了交互效率。

  通用应用

  HoloLens平台的操作系统为Windows Holograpic,同样基于Windows 10定制。所以Windows 10 UWP通用应用程序可以顺利地在HoloLens上运行。这不仅降低了研发和迁移成本,也让开发效率大幅提升。

  当然,说了很多HoloLens的特性和优点后,开发者版本也存在一些亟待解决的问题,比如视野较窄、凝视体验不佳、抗光线干扰弱和重量续航等。但瑕不掩瑜,HoloLens带来了真正的混合现实体验,拥有着强烈的冲击感,未来将大有作为。

  开发一个HoloLens应用

  在了解HoloLens设备后,我们来试着开发一个简单的HoloLens应用,当然你也可以开发一个传统的UWP应用。这里我们则采用Unity引擎来构建应用,使用Unity开发是官方推荐的做法。

  开始之前

  确保正确配置了开发环境,需安装以下工具和SDK:

  Visual Studio 2015 Update 1及以上版本;Windows 10 SDK 10586及以上版本;HoloLens模拟器,如图2;Unity HoloLens技术预览版。

  以上工具和SDK均可在微软官方网址获取,详细教程可以访问:https://developer.microsoft.com/en-us/windows/holographic/install_the_tools。

  使用Unity开发HoloLens应用

  图2 HoloLens模拟器

  集成HoloToolkit-Unity项目

  在创建了标准Unity项目之后,我们需要集成微软官方提供的HoloToolkit-Unity项目。HoloToolkit-Unity是微软官方的开源项目,用于帮助开发者快速开发HoloLens应用,能够快速为项目集成基本输入、空间映射和场景匹配等特性。以下是此项目的结构和内容分析,如图3。

  Input目录

  GazeManager.cs用于快速集成凝视射线特性;GestureManager.cs用于快速集成手势识别特性;KeywordManager.cs用于快速集成语音命令特性;CursorManager.cs用于快速集成可视化凝视组件。

  Sharing目录

  Sharing Prefab组件用于快速集成场景共享特性。

  SpatialMapping目录

  SurfacePlane Prefab组件用于描述和渲染真实世界表面;SpatialMapping Prefab组件用于快速集成空间映射特性;RemoteMapping Prefab组件用于快速集成远程空间映射信息导入特性;

  SpatialSound目录

  UAudioManager.cs用于快速集成空间声音特性。

  Utilities目录

  Billboard.cs用于实现跟随用户视线特性;Tagalong.cs用于实现跟随用户移动特性;Main Camera Prefab组件用于快速集成HoloLens标准主摄像机。

  使用Unity开发HoloLens应用

  构建场景

  新建空白场景后,我们需要删除原有的Main Camera对象,同时从HoloToolkit目录中拖拽一个Main Camera Prefab组件到场景中,如图4,这样就集成了满足HoloLens需求的基本主摄像机。对于HoloLens,将主摄像机渲染背景设为纯色,颜色设为RGBA(0,0,0,0)。因为任何纯黑的颜色将会被HoloLens渲染为透明,以达到不遮挡现实世界的目的。此外,HoloLens建议摄像机视角近距离为0.85,这个距离最符合真实人眼的体验。同时主摄像机位置必须重置为世界零点,即xyz(0,0,0),任何全息图像将会以此为原点在周边世界中绘制出来。

  使用Unity开发HoloLens应用

  图4 设置主摄像头

  然后点击“Create Empty”创建一个空游戏对象,并将其命名为Input,如图5。为Input对象添加核心脚本组件,分别为GazeManager.cs、GestureManager.cs、HandsManager.cs和KeywordManager.cs。这样就集成了以上命令三大核心特性,对于凝视射线、手势识别和语音命令功能,均建议使用单例来进行管理,这样可以避免功能混乱。同时为凝视设置可视化的指针,可以提高用户的交互体验和效率。

  使用Unity开发HoloLens应用

  图5 集成输入组件

  接下来集成可视化凝视组件,从HoloToolkit目录下拖拽CursorWithFeedback Prefab组件到场景中,如图6。这样当凝视在全息对象时,其表面会出现可视化凝视组件。当用户手势被识别到时,会出现一个蓝色的手掌图像,能够贴心地告诉用户可以操作了。

  使用Unity开发HoloLens应用

  图6 集成凝视组件

  创建一个Cube对象和一个新的C#脚本,命名为HoloTest.cs。Cube作为我们的全息图像主体,将它的Transform参数设为如图7所示。这样Cube的位置方便我们近距离观察其实际变化情况,你也可以根据自己偏好来放置它。

  使用Unity开发HoloLens应用

  图7 设置Cube的Transform参数

  HoloTest.cs脚本的功能为随机更换对象的材质颜色,遵循GestureManager.cs中预设的OnSelect消息名称,HoloTest.cs脚本中将会在OnSelect方法中实现此功能代码如下:

  publicvoidOnSelect() { //随机变换物体颜色gameObject.GetComponent<MeshRenderer>().material.color = newColor(Random.Range(0, 255) / 255f, Random.Range(0, 255) / 255f, Random.Range(0, 255) / 255f); }

  进入Input组件检视选项卡,为KeywordManager.cs组件配置语音命令。图8语音命令触发时将会执行相应的组件行为。本例中,当我说出“test”时,机会即会Cube的OnSelect方法,来随机改变Cube颜色。

  使用Unity开发HoloLens应用

  图8 设定语音关键词行为

  编译项目

  为了满足HoloLens的需求,我们需要在Player Settings里面开启Virtual Reality Support,并在下拉列表中选中Windows Holographic,如图9。只有这样HoloLens才会将此应用渲染为3D应用,这一点十分关键。

  使用Unity开发HoloLens应用

  图9 添加HoloLens支持

  同时从工具栏Edit→Project Settings→Quality选项卡中,将UWP平台默认画质设为Fastest,如图10。这是为了降低性能开销,官方推荐帧率为60fps。

  使用Unity开发HoloLens应用

  图10 设定默认画质

  如图11,Build Settings视图中选择目标平台为Windows Store,SDK为Universal 10,点击Build按钮开始编译UWP项目。

  使用Unity开发HoloLens应用

  图11 编译Unity项目

  部署调试应用

  使用Visual Studio打开编译后的UWP项目,在Debug选项上设置如图12所示。

  使用Unity开发HoloLens应用

  图12 设置Debug选项

  连接HoloLens到PC,完成Build和Deploy后,我们在HoloLens中打开此应用。实际效果如图13所示。当我使用手势点击Cube时,它会随机变化颜色;而当我说出语音命令“test”时,Cube仍会正常的变换颜色,这完全符合我们的预期。

  使用Unity开发HoloLens应用

  图13 实际效果图

  HoloLens开发总结

  使用Unity引擎开发HoloLens应用是非常容易的事情,大部分流程与开发UWP项目并无不同。但仍有不少需要注意的雷区和特殊要求,以下就是部分要注意的部分:

  Main Camera一定要按照官方要求配置,背景纯色且RGBA值为(0,0,0,0),这样才能避免遮挡现实内容;Gaze凝视特性需要我们使用Raycast来实现,注意处理射线未命中目标情形,默认凝视最远距离为15米,若是未击中物体,使用时可能会出现空引用异常;

  3 . 手势识别、拍照和语音命令等均需使用Windows特有API,空间映射和场景匹配需要使用HoloLens特有API;其他很多细节上的体验,例如可视化凝视组件、目标区域可视化指引组件等,使用它们来给用户提示,可以帮助用户理解应用操作方法,提高使用体验。

  最后,AR/MR技术独特的交互体验与开发特性,代表了未来自然交互的发展方向,相较于目前成熟的VR技术,它们具有更光明的发展前景和更广阔的用途。无论是微软还是Magic Leap,它们无疑会是未来市场的引领者,而目前也是我们学习的黄金阶段,能够迎头赶上这波浪潮,对于相关从业者具有重要的意义。

  作者简介:

  张昌伟,全栈工程师,微软最有价值专家。专注于iOS和.NET平台开发技术,首批AR开发者,目前全职从事HoloLens开发。