2017 年 2 月

第 32 卷,第 2 期

此文章由机器翻译。

HoloLens - 从虚拟现实转向混合现实

通过Tim Kulp

虚拟现实 (VR) 现在,是所有讨论,开发人员都在竞相能够生成内容。即将推出,混合的现实 (MR) 开始 spark 开发人员的想像,使我们不得不重新考虑如何能与现实世界交互的数字世界。作为 MR 提升驱动力,将需要使 VR 应用到新的平台。在本文中,我将探讨如何更新 VR 应用程序以在 HoloLens MR — 而不必重新编写整件事情。

在 9 月期的 MSDN 杂志 》 中,我构建了名为 Contoso 旅行 VR 应用程序 (msdn.com/magazine/mt763231)。Contoso 旅行部门,以确定其员工位置出差到世界各地使用 VR 映射允许此应用程序。应用程序的思路是使用不只是一组在地图上的插针界面为用户提供的沉浸式体验。在应用中,每个便携由头像表明此人的差旅目标和时间表示。我使用对此检测要知道,当用户在头像查找并,则不允许用户选择一个对话框窗口以显示便携的详细信息的头像。

在入门之前

本文假定您已经做完部分 HoloLens 开发过程中,如 Adam Tuliper 年 11 月 MSDN 杂志 》 文章的阅读 (msdn.com/magazine/mt788624) 或 HoloLens academy 教程 (bit.ly/2gzYYr6)。具体而言,本文将着重介绍如何使用对此、 手势和语音,因此您可能希望如我不打算深入提供该内容的详细信息,请查看这些文章。本文还假定您已阅读我年 9 月的文章,因为它是此处要介绍的起始点。

若要开始,从 GitHub 下载 vr_travel 的代码 (bit.ly/2fXiqy2)。这是从启动中这篇文章的基本代码。

虚拟现实 vs。混合的现实

构建任意平台的应用程序,时,一定要了解该平台的独特之并接受它为该特定平台提供值。例如,如果有一个 Web 应用程序和移动应用程序之间没有区别,为什么会您真的要选择一种? 关键是提供基于每个平台的不同功能的值。对于 VR,密钥强度是用户仅遇到他们可以看到的耳机。其他国家或地区逐渐消退的老将如交付给用户的内容是现实生活中。这允许创建令人惊叹的世界联系起来,不能存在于现实生活中,或阻止分散注意力从除了应用程序的内容。VR 将用户的其他位置。使用它来找出您的体验中的用户。从业务应用程序的角度来看,这可能是由用户完成的所有活动将都限于该中心的操作平台呼叫中心方案。

先生,与此相反,是包括世界上合并虚拟世界中与现实世界,若要创建的总体体验。成功 MR 使用虚拟内容扩展现实生活中。如果您希望用户能够同时仍能够体验他们在您的世界中起作用,请使用先生。例如,在办公室中,先生可用显示也始终会出现,如连接到 Outlook 或表示为全息联系人卡片的联系人现代 Rolodex 台历的内容。当用户在执行类似编写软件的真实监视器上进行操作时,这些全息可以出现。工程师可以使用全息查看全息正从事设计在其计算机上的模型时的模型的表示形式。机构工作人员可以扩充其工作区而不干扰的物理工作。

为 Contoso 出差,我希望用户能够看到其出差的员工所在的任何时候。在支持上的一张全息图非常适合于此用户无法像 (如预订旅途中),在显示器上的其他工作时将显示速览的一端,对其中的人员在任何时间。旅行预订系统很复杂,不是您想要重新生成 VR,但扩充了 MR 映射的出差的员工的现有系统中是一个完美的解决方案,用于启用一眼的更新而无需占用用户的物理工作区。

为混合实际情况做好准备

HoloLens 开发通常涉及大量相同的任务,例如检测对此、 手势和语音,无论哪种类型的应用程序正在构建。幸运的是,Microsoft 已构建了一个将帮助您跳转到 HoloLens 开发的代码库。HoloToolkit (bit.ly/2bO8XrT) 提供了一个很好的起点。下载 HoloToolkit,并按照说明进行操作以将其转换为 Unity 包,您可以导入 HoloLens 项目的 GitHub 上 (bit.ly/2ftiOrY)。

与 HoloToolkit 准备就绪以 Unity 包的形式打开 vr_travel 代码库并导入 HoloToolkit 包是使用资产 |导入包 |自定义软件包。导航到您已经保存了 HoloToolkit 程序包并选择用于导入。Unity 将显示导入包对话框,显示所有包的不同元素。对于本文中我导入除示例项目的所有内容。如果您想要包括在项目中,随意,因为它们提供的示例代码,可能很有用。单击准备好进行 HoloToolkit 包请求到 vr_travel 项目时导入。导入完成后,您会注意到在项目视图称为 HoloToolkit,还使您可以访问 Unity 中,例如,自动将应用的设置应用到场景或项目来运行 HoloLens 对应用程序的一些有用 HoloLens 特定功能的菜单栏上的新 HoloToolkit 项的新文件夹 (请参阅图 1)。

HoloToolkit 菜单
图 1 HoloToolkit 菜单

即使正在更新应用程序以作为 HoloLens 的应用程序,可能想要保留您的世界的 VR 版本。若要维护 VR 世界,另存主要场景新场景使用文件 |保存场景,并调用新的场景 main_mr。  这种方式,您可以维护工作所做的 VR 世界在生成新的 MR 世界。此外,将代码更改为组件,如便携模板或旅行管理器中,如 VR 应用程序将更新以及新 MR 应用。

现在,您将项目配置为可通过转到 HoloToolkit HoloLens 项目 |配置 |应用 HoloLens 项目设置。这将更新您的生成及其他项目设置以 HoloLens 准备应用程序。通过配置应用程序为 HoloLens 项目,相机将自动配置为在 HoloLens 上工作。您可能想要从此处的唯一更改是将设置为黑色的背景,而不是使用 skybox 纹理 Skybox。在 HoloLens,以外的任何值纯黑不呈现为虚拟对象。例如,可用于黑色背景进行后台透明的从而实际显示出来。

使用删除 skybox 和配置的项目,就剩下与图面出差的员工将出现在 void 中浮动。位置照相机传送到一个位置,你可以在其中查看世界里,但请记住,在应用程序中 HoloLens 相机表示设备的位置。规划基于用户的体验,可启动,并且考虑照相机移动整个环境的方式的位置的照相机。VR 应用程序中播放机被约束为控制器使它们以执行操作。对于 HoloLens 应用,您必须思考的方式 HoloLens 可以移动到世界各地并相应地进行规划,可为用户提供最佳体验。

与就地摄像机,就可以在 HoloLens 中进行测试。转到文件 |生成将作为主要场景中添加 main_mr 场景的设置。单击添加打开的场景,以添加 main_mr,然后取消选中主要场景中,从而从生成的场景的列表中删除。这允许您生成的目的为了 HoloLens 的场景。您可以从这里,构建,但是相反,让我们使用 HoloToolkit 生成窗口。打开 HoloToolkit |生成窗口 (请参阅图 2),它允许您自定义 HoloLens 应用程序的生成和部署。

HoloToolkit 生成窗口
图 2 HoloToolkit 生成窗口

使用默认设置,然后单击生成 Visual Studio SLN。这将创建一个在 Visual Studio 中打开,并将部署到 HoloLens 设备的解决方案。完成部署到 HoloLens 仿真程序或设备后,您会注意到,您可以看到的平台和一个巨大的负载的旅客按钮,但您不能实际执行任何操作。让我们做一些更改以允许用户加载出差的员工。如果您需要构建你的项目的帮助,请查看"全息 100"上 HoloAcademy (bit.ly/2bxVOoe) 或"全息 101",以便部署到设备 (bit.ly/2bhqsiV)。

添加对此和笔势

在上一篇文章中创建虚拟现实世界过的一些交互功能,因此,让我们重新生成的。第一个 interactable 添加到 VR 项目已按钮以加载出差的员工。让我们为 HoloLens 用户使其奏效。若要开始,创建名为的新空游戏对象管理器。(注意: 我将合并所有我"经理"为单个对象以使我有一个中心位置来添加对此管理器,手势 Manager 等组件,依此类推。此集中使得可以轻松地查找经理场景变得复杂,以及它简化了管理器组件之间的访问权限。)

所选的管理器中,单击添加组件并对此管理器搜索。这样,在相机上以提供对此信息向应用程序,以便可以检测何时用户的视图的对象发生了冲突。对此 MR 工作方式非常类似为 VR 设置对此的代码。照相机投影 raycast,然后检测是否该 raycast 符号与 interactable 对象发生冲突。对此管理器组件是在 HoloToolkit 预构建,并可以对管理器对象作为组件添加。

虚拟和混合现实开发的关键用户界面元素旨在提供有关哪些用户当前正在考虑可视反馈。若要执行此操作,你需要一个游标,并且 HoloToolkit 具有一个已准备好使用。在项目文件夹中,转到 HoloToolkit |输入 |预设 |光标。此预设拖到层次结构。这将添加到跟踪位置查找用户,帮助用户以不会丢失,因为它们看起来在场景周围的场景的游标。

您可以有响应按下的某个按钮之前,您需要知道用户看它。该按钮是不会对 raycast 反应,因为它不在其上具有一个碰撞体 Unity 画布按钮。将盒状碰撞体添加到 btnLoad 对象中,通过单击 btnLoad 中层次结构,然后添加组件。选择物理 |框中的碰撞体,然后单击编辑碰撞体。这允许您调整大小为按钮,碰撞体。将 X 小数位数等于按钮的宽度和 Y 小数位数设置为按钮的高度。本文中我我一直在用户界面非常简单,但有很的多怎样才能为 HoloLens 创建丰富的 UI。签出 Surya Buchwald 篇文章中,"为 HoloLens 缩放 UI"(bit.ly/2gpfGue),有关如何设置了一个可扩展的用户界面,设计团队可以控制而无需进行开发。

按钮现在已准备好对此做出反应。这就需要添加 OnGazeEnterEvent 和 OnGazeLeaveEvent,对不在按钮查找用户时,以及当用户离开查找告知该应用程序。要执行此操作,请单击 btnLoad 再次在层次结构,然后添加组件。搜索 OnGazeEnterEvent 并将其添加。然后,执行相同的 OnGazeLeaveEvent。一旦这些添加到 btnLoad 时,你可以添加一些事件。在检查器中,单击加号以向 OnGazeEnterEvent 添加事件。将 EventSystem 对象从层次结构拖到对象字段。这将为 EventSystem 加载函数。在函数列表中,选择 EventSystem |SetSelectedGameObject。此环境内的游戏对象具有焦点的控件。将 btnLoad 拖动到的参数对象。此代码块显示在对此用户的进入 btnLoad,触发器事件系统,可将 btnLoad 设置为所选的游戏对象,将按钮的可视状态更改为,突出显示颜色。

在 OnGazeLeave 事件中,添加一样 OnGazeEnter 事件具有相同的所有参数,但而不是使用 btnLoad SetSelectedGameObject,该参数的层次结构中创建新的 GameObject 事件称为取消选定并设置,若要为参数。这将使处于未选中状态的所选的对象事件系统中对此用户的离开按钮时。处于未选中状态是一个占位符对象,并不执行任何操作,但当用户将查看从一个对象时接收焦点。通过使用该游戏对象,您可以设置该游戏对象选择或取消选中使用 Unity 编辑器中,而不编写代码。图 3显示 btnLoad 的最终配置将如下所示使用此事件。

配置 btnLoad
图 3 配置 btnLoad

应用程序现在可以跟踪用户正在并向用户提供反馈。现在让我们将连接无线点击选择按钮的功能。单击主相机沿层次结构;同样,单击检查器和手势管理器搜索中添加组件。将手势管理器添加到主摄影机。手势管理器允许应用程序可以知道用户的手均满足时,识别正在使用的手势并相应地做出响应手势。

若要使游戏对象响应手势,您将 OnSelectEvent 组件添加到游戏对象。单击 btnLoad,然后选择添加组件,搜索选择事件,并将组件添加到按钮。手势管理器检测到一个分流点时或操作笔势发生,并使用 GameObject.SendMessage("OnSelect") 来触发选择时事件组件。与此问题是,UnityEngine.UI.Button 对象已有 (用来激活该按钮的突出显示) 的选择时事件,因此当 GestureManager 选择时发送消息到按钮时,现有的按钮选择时事件将触发。若要避免拥有两个选择时事件的冲突,重命名为 OnTapEvent 的 HoloToolkit OnSelectEvent。OnSelectEvent.cs 文件中 (在 HoloToolkit |输入 |脚本),更新为 OnTap 的选择时方法,并将该类重命名为 OnTapEvent。

存在另一个挑战按钮是 OnClick 事件并不通过编辑器辅助性事件。若要触发 click 事件,必须在 Click 事件上调用 Invoke。若要执行此操作,可在项目中创建一个新脚本 |脚本文件夹中名为 ButtonInteractable,,如下所示︰

public class ButtonInteractable : MonoBehavior {
  public void Click()
  {
    var btn = GetComponent<UnityEngine.UI.Button>();
    btn.onClick.Invoke();
  }
}

单击 btnLoad 层次结构中的对象,并添加 ButtonInteractable 组件。OnTapEvent 组件中,将 btnLoad 拖到该对象,然后,在函数中,选择 ButtonInteractable |单击。这会将配置 OnTap 事件来触发 OnClick 事件。在此项目中按钮并不执行许多操作 click 事件,但在更复杂项目按钮的 click 事件可能会触发多个操作。您可以使用 ButtonInteractable 维护单击的行为,无需更新到 OnTap 事件。

现已连接的负载的旅客按钮,构建 HoloLens 应用程序并尝试一下。当您对此负载出差的员工按钮变为绿色。专注按钮返回到正常状态。使用无线 tap 将加载出差的员工,并将其停用按钮,以便用户不能再次加载出差的员工。现在让我们更新旅行者来处理对此和笔势。

更新出差的员工

便携模板对象是用来生成应用程序中的新旅客预设。在模板上是两个脚本组件 — 便携交互和 VR 交互式项。VR 交互式项接收到的事件触发器状态就像通过 (当用户在查看交互式项),(在用户离开看上去) 时,单击 (当用户按 VR 设备上的引发按钮)。这些直接映射到对此输入,看一下保留,然后在点击。某些快速的组件添加和出差的员工将准备好要使用。

在预设推送的便携模板将添加以下组件︰ OnGazeEnterEvent、 OnGazeLeaveEvent 和 OnTapEvent。如中所示图 4,对于 OnGazeEnterEvent,添加具有 VRInteractiveItem 函数选择的 TravelerTemplate 对象 |转移终结点。执行同样的 OnGazeLeaveEvent 但选择 VRInteractiveItem |该函数的扩展。VR 交互式项,这将使 Over 和扩展事件。最后,在点击事件,将该对象到 TravelerTemplate 预设。对于函数,选择 VRInteractiveItem |单击。此快速配置将带入您 VRInteractiveItem HoloLens 看一下和手势功能。

将组件和功能添加到旅行者模板
图 4 添加到旅行者模板的组件和函数

此时,Contoso 旅行 HoloLens 应用程序功能上等效于向虚拟现实应用程序。现在,您可以利用 HoloLens,使其不同于 VR 设备的功能。若要开始,我将实现语音,因此我可以加载出差的员工,而无需单击一个按钮。

作为另一种输入机制的语音

在传统 VR 应用程序中输入仅限于对此、 方向小键盘和火灾按钮 (适用于 Samsung 齿轮 VR 类似设备)。与 HoloLens 有多个其他输入的类型,如语音,可以创建非常自然的用户界面。语音是一个极好的工具,为操作提供的用户快捷方式。而不是通过无线路器触发一个菜单,用户可以仅说出他们希望如何操作。可以选择特定的游戏对象时,才使语音命令处于活动状态或使系统始终将查找通用命令。

若要开始使用的语音,我要为用户说出"负载出差的员工"这就无需单击负载出差的员工按钮进行侦听。了解语音交互是 Adam Tuliper HoloLens 篇文章 (前面所述),在其中他介绍了实现语音命令启动一个很好。对于此应用程序,我将向管理器对象中添加新的组件来应用语音命令。在层次结构中,单击管理器 |添加组件,然后搜索 KeywordManager。一旦添加关键字管理器中,将其展开,将设置识别器开始 = 自动启动,使识别器以启动与该应用程序。然后展开关键字和响应部分,并将大小设置为 1,以添加一个关键字。As 关键字,输入"负载旅行者",然后将该函数连接到 btnLoad 和 ButtonInteractable.Click 事件。这是模拟单击按钮时用户所讲的"负载外旅行的人。"

您可以连接到旅行的关键字。首先单击 TravelerTemplate 预设并停用在点击事件。将函数添加到此输入事件激活在点击事件,然后将一个函数添加到对此保留的事件,以停用在点击事件。此安装程序允许仅用来显示旅行详细信息对此 TravelerTemplate。接下来,为两个大小更新关键字管理器并生成新的条目"您是谁。" 然后将 TravelerTemplate 拖到该对象并选择将函数视为 VRInteractiveItem 函数 |单击。这将打开旅行信息对话框。

在 Unity 中这些次要的配置更改,可以启用混合的现实应用程序中的语音。随着您将 office 设置其中的人都可能会使用键盘或鼠标,语音变得强大输入的设备具有太多的事情完整的用户。

下一步该怎么做?

HoloLens 和 MR 提供了许多您的应用程序的潜能。在这里,我扩展与语音我 VR 的应用程序,但我可以做更多空间声音和映射。假设用户将旅行应用程序绑定到其办公桌或 having 出差的员工与用户在旅行计划更改时。考虑如何混合使用等笔势,看一下和语音以提供丰富且充满乐趣界面中,再加上空间声音和映射的输入的系统。

如您所见,VR 应用程序可以将迁移到 MR 应用而无需太多的代码由于 Unity 的配置特性。将其应用程序从移动 VR 平台转换为与 HoloLens MR 时这可以节省开发人员的时间和资金。您已从这一方面开始和进一步探索 HoloLens 学院要到下一步是应用程序应用 HoloLens 的更多的功能进行了。

更新了 JSON 对象库

根据您使用的 JSON 对象库的版本,您可能需要更新 JSONTemplate.cs 文件。项目文件夹中转到 JSON/JSONTemplate.cs 并更新为以下第 19 行︰

FieldInfo[] fieldinfo = obj.GetType().GetFields() 
  as System.Reflection.FieldInfo[];

此更新将允许您以编译该项目在 HoloLens 上运行。


Tim Kulp是 Baltimore,md bwell 主体工程师 他是 Web、 移动和通用 Windows 平台应用程序开发人员,以及作者、 刷、 父亲和"wannabe Mad 科学家 Maker。" 请通过 Twitter @seccode 或 LinkedIn linkedin.com/in/timkulp 与他联系。

衷心感谢以下 Microsoft 技术专家对本文的审阅: Adam Tuliper