HoloLens 第一代 () 输入210:注视

重要

混合现实学院教程的设计目的是 HoloLens (一代) 、Unity 2017 和混合现实沉浸式耳机。 因此,对于仍在寻求这些设备的开发指导的开发人员而言,我们觉得很有必要保留这些教程。 这些教程 会使用最新工具集或用于 HoloLens 2 的交互进行更新,可能与新版本的 Unity 不兼容。 我们将维护这些教程,使之持续适用于支持的设备。 已经为 HoloLens 2 发布了一系列新教程

"注视" 是输入的第一种形式,它显示用户的意图和认知。 MR Input 210 (亦 Project 资源管理器) 深入探讨了 Windows Mixed Reality 的与注视相关的概念。 我们会将上下文感知添加到游标和全息影像,充分利用你的应用程序对用户外观的了解。

这里有一个友好的 astronaut,可帮助你学习注视的概念。 在 尊敬的基本知识 101中,我们有了一个简单的光标,只需跟随你的注视。 今天,我们要将一个步骤移到简单的游标之外:

  • 我们要做的是光标,我们的全息影像看起来很清楚:这两项操作都将根据用户的查找位置或用户 在查找的位置而变化。 这使它们可以识别其上下文。
  • 我们会将反馈添加到游标和全息影像,以便为用户提供更多的目标目标上下文。 这种反馈可以是音频和视觉对象。
  • 我们将向你展示用于帮助用户达到更小目标的目标技术。
  • 我们将向你展示如何使用定向指示器将用户的注意力吸引到你的全息影像。
  • 我们将指导你在世界各地四处移动时,与用户一起使用全息影像。

重要

以下各章中嵌入的视频是使用旧版本的 Unity 记录的,混合现实 Toolkit。 虽然分步说明准确且最新,但你可能会看到处于过期状态的相应视频中的脚本和视觉对象。 视频仍包含在 posterity 中,因为涵盖的概念仍适用。

设备支持

课程 HoloLens 沉浸式头戴显示设备
MR 输入 210:凝视 ✔️ ✔️

准备工作

必备条件

项目文件

  • 下载项目所需的 文件 。 需要 Unity 2017.2 或更高版本。
  • 取消将文件存档到桌面或其他易于访问的位置。

备注

如果要在下载之前查看源代码,可在 GitHub 上查看。

勘误表和说明

  • 在 Visual Studio 中,需要禁用 "仅我的代码" ("工具->选项" 下的 "未选中) ",以便在代码中命中断点。

第1章-Unity 设置

目标

  • 针对 Hololens 开发优化 Unity。
  • 导入资产并设置场景。
  • 查看 HoloLens 中的 astronaut。

说明

  1. 启动 Unity。
  2. 选择 “新建项目”
  3. 将项目命名为 ModelExplorer
  4. 输入 "位置" 作为先前未存档的 " 注视 " 文件夹。
  5. 请确保将项目设置为“3D”。
  6. 单击“创建项目”。

HoloLens 的 Unity 设置

我们需要让 Unity 知道我们要导出的应用程序应创建 沉浸式视图 而不是2d 视图。 为此,我们将 HoloLens 添加为虚拟现实设备。

  1. 请参阅 编辑 > Project 设置 > 播放机
  2. 在播放器设置的 "检查器" 面板 中,选择 " Windows 存储" 图标。
  3. 展开“XR 设置”组。
  4. 在“呈现”部分,选中“支持虚拟现实”复选框,添加新“虚拟现实 SDK 的”列表 。
  5. 验证列表中是否显示“Windows 混合现实”。 如果没有,请选择 + 列表底部的 "" 按钮,然后选择 " Windows 全息"。

接下来,我们需要将脚本后端设置为 .NET。

  1. 请参阅 编辑 > Project 设置 > 播放机 (你仍可以从上一步) 来执行此操作。
  2. 在播放器设置的 "检查器" 面板 中,选择 " Windows 存储" 图标。
  3. 在 "其他设置 配置" 部分中,确保 "脚本后端" 设置为 " .net "

最后,我们将更新质量设置以实现 HoloLens 的快速性能。

  1. 请参阅 编辑 > Project 设置 > 质量
  2. 在 "Windows 存储" 图标下,单击 默认 行中的向下箭头。
  3. 对于 Windows 应用商店应用,请选择 "非常低"。

导入项目资产

  1. 右键单击 " Project " 面板中的 "资产" 文件夹。
  2. 单击 " 导入包 > 自定义包"。
  3. 导航到下载的项目文件,然后单击 " ModelExplorer. unitypackage"。
  4. 单击“打开”。
  5. 加载包后,单击 " 导入 " 按钮。

设置场景

  1. 在层次结构中,删除 主摄像机
  2. HoloToolkit 文件夹中,打开 " 输入 " 文件夹,然后打开 " prototyping " 文件夹。
  3. MixedRealityCameraParent Prefab 从 prototyping 文件夹拖放到 层次结构 中。
  4. 右键单击层次结构中的 定向光 ,然后选择 " 删除"。
  5. 全息影像 文件夹中,将以下资产拖放到 层次结构 的根中:
    • AstroMan
    • 光线
    • SpaceAudioSource
    • SpaceBackground
  6. 启动 播放模式 ▶查看 astronaut。
  7. 再次单击 播放模式停止
  8. 全息影像 文件夹中,找到 Fitbox 资产,并将其拖到 层次结构 的根。
  9. 在 "层次结构" 面板中选择 " Fitbox "。
  10. 在 "检查器" 面板中,将 AstroMan 集合从 层次结构 中拖到 Fitbox 的 全息图集合 属性中。

保存项目

  1. 保存新场景: File > 将场景另存为
  2. 单击 " 新建文件夹 ",然后将文件夹命名为 " 场景"。
  3. 将该文件命名为 "ModelExplorer" 并将其保存在 幕后 文件夹中。

生成项目

  1. 在 Unity 中,选择 "文件 > 生成设置"。
  2. 单击 " 添加打开的场景 " 添加场景。
  3. 选择 "平台" 列表中的 "通用 Windows 平台",然后单击 "切换平台"。
  4. 如果要为 HoloLens 专门进行开发,请将 "目标设备" 设置为 " HoloLens"。 否则,请将其留在 任何设备 上。
  5. 确保将 " 生成类型 " 设置为 " D3D ",并将 " Sdk " 设置为 " 最新安装 的 (,这应是 SDK 16299 或更高) 版本
  6. 单击“生成”。
  7. 创建名为 "App" 的 新文件夹
  8. 单击 应用 文件夹。
  9. 按 " 选择文件夹"。

当 Unity 完成后,将显示文件资源管理器窗口。

  1. 打开 应用程序 文件夹。
  2. 打开 ModelExplorer Visual Studio 解决方案

如果部署到 HoloLens:

  1. 使用 Visual Studio 中的顶部工具栏将目标从 "调试" 更改为 "发布",将 "从 ARM" 更改为 " x86"。
  2. 单击 "本地计算机" 按钮旁的下拉箭头,然后选择 " 远程计算机"。
  3. 输入 HoloLens 设备 IP 地址,并将身份验证模式设置为 通用 (未加密的协议)。 单击“选择” 。 如果你不知道设备 IP 地址,请查看 设置 > 网络 & Internet > 高级选项
  4. 在顶部菜单栏中,单击 " 调试-> 启动而不调试 " 或按 Ctrl + F5。 如果这是首次部署到设备,则需要将其与 Visual Studio 配对
  5. 当应用程序已部署后,使用 选择手势 关闭 Fitbox

如果要部署到沉浸式耳机:

  1. 使用 Visual Studio 中的顶部工具栏,将目标从 "调试" 更改为 "发布",并将 "从 ARM 更改为 x64"。
  2. 确保将部署目标设置为 " 本地计算机"。
  3. 在顶部菜单栏中,单击 " 调试-> 启动而不调试 " 或按 Ctrl + F5
  4. 当应用程序已部署后,通过将触发器拖到运动控制器上来关闭 Fitbox

第2章-游标和目标反馈

目标

  • 游标视觉对象设计和行为。
  • 基于注视的光标反馈。
  • 基于注视的全息影像反馈。

我们将使用一些游标设计原则,即:

  • 游标始终存在。
  • 不要让光标变得太小或太大。
  • 避免阻碍内容。

说明

  1. HoloToolkit\Input\Prefabs 文件夹中,找到 " InputManager " 资产。
  2. InputManager 拖放到 层次结构 中。
  3. HoloToolkit\Input\Prefabs 文件夹中,找到 光标 资产。
  4. 光标 拖放到 层次结构 中。
  5. 选择 层次结构 中的 InputManager 对象。
  6. 光标 对象从 层次结构 中拖放到 检查器 底部的 InputManager 的 SimpleSinglePointerSelector游标 字段。

简单的单指针选择器设置

生成和部署

  1. > Build 设置从文件 重新生成应用。
  2. 打开 应用程序文件夹
  3. 打开 ModelExplorer Visual Studio 解决方案
  4. 单击 " 调试-> 启动但不调试 " 或按 Ctrl + F5
  5. 观察如何绘制光标,以及如何在触摸全息图时更改其外观。

Instructions

  1. 在 "层次结构" 面板中,展开 " AstroMan -> GEO_G -> Back_Center " 对象。
  2. 双击 " Interactible " 以 Visual Studio 中打开它。
  3. 取消注释 IFocusable 中的行 OnFocusEnter () 和 IFocusable 中的 () 回调。 当焦点 (时,混合现实 Toolkit 的 InputManager 会调用这些类,) 进入和退出特定 GameObject 的碰撞器。
/* TODO: DEVELOPER CODING EXERCISE 2.d */

void IFocusable.OnFocusEnter()
{
    for (int i = 0; i < defaultMaterials.Length; i++)
    {
        // 2.d: Uncomment the below line to highlight the material when gaze enters.
        defaultMaterials[i].EnableKeyword("_ENVIRONMENT_COLORING");
    }
}

void IFocusable.OnFocusExit()
{
    for (int i = 0; i < defaultMaterials.Length; i++)
    {
        // 2.d: Uncomment the below line to remove highlight on material when gaze exits.
        defaultMaterials[i].DisableKeyword("_ENVIRONMENT_COLORING");
    }
}

备注

我们使用 EnableKeywordDisableKeyword 更高版本。 若要使用 Toolkit 的标准着色器在自己的应用程序中使用这些应用程序,需要遵循Unity 指导原则,通过脚本访问材料。 在这种情况下,我们已在 "资源" 文件夹中包含了所需的 突出显示材料的三个变体 (查找姓名) 中突出显示的三个材料。

生成和部署

  1. 与之前一样,生成项目并部署到 HoloLens。
  2. 观察注视的目标是对象时,发生的情况。

第3章-目标技术

目标

  • 更轻松地定位全息影像。
  • 稳定的自然头运动。

Instructions

  1. 在 " 层次结构 " 面板中,选择 " InputManager " 对象。
  2. 在 " 检查器 " 面板中,找到 " 注视" 稳定 的脚本。 单击它可在 Visual Studio 中打开(如果想要查看)。
    • 此脚本将循环访问 Raycast 数据的示例,并帮助使用户看得更稳定,以实现精确定位。
  3. 检查器 中,可以编辑 存储的稳定性示例 值。 此值表示稳定程序为计算稳定值而迭代的样本数。

第4章-方向指示器

目标

  • 在光标处添加方向指示器以帮助查找全息影像。

Instructions

我们将使用 DirectionIndicator 文件,该文件将:

  1. 如果用户不 gazing 在全息影像上,则显示方向指示器。
  2. 如果用户在全息影像上 gazing,则隐藏方向指示器。
  3. 更新方向指示器以指向全息影像。

现在就开始吧。

  1. 单击 "层次结构" 面板中的 AstroMan 对象,然后 单击箭头 将其展开。
  2. 在 "层次结构" 面板中,选择 " AstroMan" 下的 DirectionalIndicator 对象。
  3. 检查器 面板中,单击 " 添加组件 " 按钮。
  4. 在菜单中,键入 "搜索框 方向" 指示器。 选择搜索结果。
  5. 在 "层次结构" 面板中,将 cursor 对象拖放到 检查器cursor 属性上。
  6. Project 面板的 全息影像 文件夹中,将 DirectionalIndicator 资产拖放到 检查器 的 "方向指示器" 属性上。
  7. 构建并部署应用。
  8. 观看方向指示器对象如何帮助您找到 astronaut。

第5章-Billboarding

目标

  • 使用 billboarding,让全息影像始终面向你。

我们将使用 GameObject 文件来 保持面向用户的面向用户,使其始终面向用户。

  1. 在 " 层次结构 " 面板中,选择 " AstroMan " 对象。
  2. 检查器 面板中,单击 " 添加组件 " 按钮。
  3. 在菜单中,在 "搜索" 框中键入 " 布告栏"。 选择搜索结果。
  4. 检查器 中,将 透视轴 设置为 Y
  5. 试试看! 像以前一样生成和部署应用。
  6. 无论如何更改视点,都查看"公告板"对象如何面向你。
  7. 立即从 AstroMan 中删除脚本。

第 6 章 - Tag-Along

目标

  • 使用Tag-Along,让全息影像跟随我们四处移动。

在解决此问题时,我们将遵循以下设计约束:

  • 内容应始终一目了然。
  • 内容不应是单向的。
  • 头部锁定内容是令人不满意的。

此处使用的解决方案是使用"标记方式"方法。

标记对象永远不会完全离开用户的视图。 你可以将 标记视为一个对象,该对象通过橡皮环附加到用户的头部。 用户移动时,通过滑动到视图边缘,无需完全离开,即可轻松查看内容。 当用户凝视标记对象时,它会更完整地进入视图。

我们将使用 SimpleTagalong.cs 文件 ,该文件将:

  1. 确定Tag-Along对象是否位于相机边界内。
  2. 如果不在视图 frustum 中,将Tag-Along部分定位到视图 frustum 中。
  3. 否则,将Tag-Along定位到与用户之间的默认距离。

为此,首先必须更改 Interactible.cs 脚本以调用 TagalongAction

  1. 通过完成编码练习 6.a (取消注释第 84 到 87 行来编辑 Interactible.cs) 。
/* TODO: DEVELOPER CODING EXERCISE 6.a */
// 6.a: Uncomment the lines below to perform a Tagalong action.
if (interactibleAction != null)
{
    interactibleAction.PerformAction();
}

Interactible.cs 配对的 InteractibleAction.cs 脚本在点击全息影像时执行自定义操作。 在这种情况下,我们将专门使用一个进行标记。

  • 在"脚本" 文件夹中,单击 "TagalongAction.cs" 资产,在Visual Studio。
  • 完成编码练习或更改为:
    • 在"层次结构 "的顶部, 在搜索栏中键入 ChestButton_Center并选择结果
    • 在" 检查器" 面板中,单击" 添加组件" 按钮。
    • 在菜单中,键入搜索框 Tagalong Action。 选择搜索结果。
    • 全息影像 文件夹中,找到 Tagalong 资产。
    • 选择ChestButton_Center 层次结构****中的对象。 将 TagAlong 对象从Project拖放到 "检查" 的"对象 到 Tagalong" 属性中。
    • Tagalong Action 对象 从检查 器拖动到可交互 脚本上的"交互操作" 字段。
  • 双击 TagalongAction 脚本以在 Visual Studio。

可交互设置

我们需要添加以下内容:

  • 将功能添加到 TagalongAction 脚本脚本中的 PerformAction (从 InteractibleAction) 。
  • 将广告板添加到后向对象,将透视轴设置为 XY。
  • 然后,将Tag-Along添加到 对象。

下面是来自 TagalongAction.cs 的解决方案

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

using HoloToolkit.Unity;
using UnityEngine;

public class TagalongAction : InteractibleAction
{
    [SerializeField]
    [Tooltip("Drag the Tagalong prefab asset you want to display.")]
    private GameObject objectToTagalong;

    private void Awake()
    {
        if (objectToTagalong != null)
        {
            objectToTagalong = Instantiate(objectToTagalong);
            objectToTagalong.SetActive(false);

            /* TODO: DEVELOPER CODING EXERCISE 6.b */

            // 6.b: AddComponent Billboard to objectToTagAlong,
            // so it's always facing the user as they move.
            Billboard billboard = objectToTagalong.AddComponent<Billboard>();

            // 6.b: AddComponent SimpleTagalong to objectToTagAlong,
            // so it's always following the user as they move.
            objectToTagalong.AddComponent<SimpleTagalong>();

            // 6.b: Set any public properties you wish to experiment with.
            billboard.PivotAxis = PivotAxis.XY; // Already the default, but provided in case you want to edit
        }
    }

    public override void PerformAction()
    {
        // Recommend having only one tagalong.
        if (objectToTagalong == null || objectToTagalong.activeSelf)
        {
            return;
        }

        objectToTagalong.SetActive(true);
    }
}
  • 试试看! 构建并部署应用。
  • 观察内容如何跟随凝视点的中心,但不持续且没有阻塞。