65.9K
CodeProject 正在变化。 阅读更多。
Home

2. HoloToolkit Unity - Gaze 和 Airtap

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2017 年 4 月 1 日

CPOL

4分钟阅读

viewsIcon

15850

增强现实和 Hololens 终于成为现实,对熟练开发人员的需求很快就会出现。

引言

本文将向您展示如何使用 HoloToolkit 中的功能,在您开始或停止凝视全息图时或您在执行 airtap 手势时凝视全息图时触发您自己的操作。

背景

全息学院是一个很好的学习资源。不幸的是,那里的视频是基于旧版本的 HoloToolkit (2017 年之前)。较新的版本似乎更多地倾向于使用界面技术来暴露功能,而不是向活动对象发送消息。

为 Hololens 创建应用程序应该简单而有趣。 简单通常是解决问题的最佳方法。 因此,我将尝试说明如何尽可能简单地利用 2017 HololensToolkit 中的功能。

Gaze - 聚焦与否,这是一个问题...

我将继续从我之前的关于设置这些东西并使其运行的文章中结束的地方开始... 所以启动Test_HoloToolkit项目,打开Scene_1并将其另存为Scene_2在您自己的_CP\Scenes 文件夹中。 在此期间,您可能希望在您的_CP 文件夹中创建一个_Scripts 文件夹。(只是为了保持井井有条 :-))。

在您的_Scripts 文件夹中,创建一个新的 C# 脚本并将其命名为_CubeGazeActions.cs。 将脚本拖到您的 Cube 上。 双击它以在 Visual Studio 中进行编辑。

如果您像我一样,代码语法并不总是那么容易正确记住,所以我认为名为 Intellisense 的东西是一个很棒的功能。 为了让 Toolkit 能够为您提供它,要做的第一件事是在您的代码中创建一个新的using语句。

using HoloToolkit.Unity.InputModule;

正如我提到的,Toolkit 的功能是基于接口的,所以如果您在您的类定义中继承自MonoBehaviour之后放一个逗号,然后按 I,intellisense 应该会发挥作用并向您显示在 Toolkit 中定义的IFocusable接口。

public class CubeGazeActions : MonoBehaviour, IFocusable

您仍然需要处理IFocusable下方的一条红色波浪线,因此将鼠标悬停在其上,单击您的小黄色灯泡朋友,当它弹出时,单击实现接口。 这件事应该会发挥它的魔力,您应该会获得两个全新的方法可以使用,即OnFocusEnterOnFocusExit

    public void OnFocusEnter()
    {
        throw new NotImplementedException();
    }

    public void OnFocusExit()
    {
        throw new NotImplementedException();
    }

Visual Studio 中的另一个很棒的功能是将代码分成区域。 请随意用一个区域包围这些方法。 您可以将该区域命名为IFocusable,您将从下面的代码示例中看到它是如何完成的。 这可能会大大提高您更大的脚本的可读性。

现在您可能想要实现一些这样的功能

using HoloToolkit.Unity.InputModule;
using UnityEngine;

public class CubeGazeActions : MonoBehaviour, IFocusable
{
    private Color defaultColor;
    void Start()
    {
        defaultColor = gameObject.GetComponent<MeshRenderer>().material.color;
    }

    #region IFocusable
    public void OnFocusEnter()
    {
        gameObject.GetComponent<MeshRenderer>().material.color = Color.green;
    }

    public void OnFocusExit()
    {
        gameObject.GetComponent<MeshRenderer>().material.color = defaultColor;
    }
    #endregion IFocusable
}

这东西只是让您的 Cube 在您看着它时变成绿色(将光标放在其上)。 当您移开视线时,Cube 再次变成它自己的无聊的鼠灰色。 这看起来可能像是非常简单的巫术,但想想你可以用自己的想象力完成的所有事情,无论是邪恶的还是好的...

AirTap - 您在混合现实中的鼠标点击

实现此功能将与前者非常相似,因此我将简单地向您展示我编写的一个小脚本,用于处理由IInputClickHandler接口提供的OnInputClicked事件。

using HoloToolkit.Unity.InputModule;
using UnityEngine;

public class CubeAirtapActions : MonoBehaviour, IInputClickHandler
{
    #region IInputClickHandler
    public void OnInputClicked(InputClickedEventData eventData)
    {
        if (gameObject.GetComponent<MeshRenderer>().material.color != Color.red)
        {
            gameObject.GetComponent<MeshRenderer>().material.color = Color.red;
        }
        else
        {
            gameObject.GetComponent<MeshRenderer>().material.color = new Color(0,0,255,255);
        }
    }
    #endregion IInputClickHandler
}

使用此脚本作为您的 Cube 的一个组件,当 AirTap 同时执行时,您的 Cube 将在红色和蓝色之间切换。(由于某些未知原因,当您在编辑器中运行时,您的第一个点击似乎不起作用,但这实际上是一个微不足道的问题,甚至不值得一提,因此,我只是不得不提到它。)

在_HoloToolkit\Input\Tests\Scenes 目录中,有一个名为InputTapTest的场景,它与我们在这里经历的几乎完全相似。 我强烈建议您加入并试玩一下。 我做到了...

下一步?

现在我们熟悉了火车和公共汽车上的所有那些陌生人,他们似乎在使用他们的智能手机时自言自语,与 Siri、Cortana、你的狗、你的 Hololens 或其他任何东西交谈不再是一种奇怪的现象,并且在大多数情况下不会让你被拘留。

下次,我们将尝试让 Hololens 真正听取您的意见。(我们不能让它在没有您的情况下自己飞行和表演,对吧?)

© . All rights reserved.