Hololens官方教程精简版 - 03. Gaze(凝视)

前言

注意:本文已更新到5.5.1f1版本

个人建议,学习Holograms 210之前,一定完成《Hololens官方教程精简版 - 02. Introduction with Device》的学习。

本篇集中学习凝视功能,完成以下目标:

  • 让物体感知凝视
  • 凝视被感知后,给用户一定的反馈
  • 如何凝视更小的物体
  • 方向标

Chapter 1 - Unity Setup

请按照第一篇的教程,完成项目的创建。
新建文件夹:”Assets/_Scenes/Holograms 210/”
新建场景:”Assets/_Scenes/Holograms 210/Holograms 210.unity”
打开场景,删除默认的Main Camera
将”Assets/HoloToolkit/Input/Prefabs/HololensCamera.prefab”添加到Hierarchy根级
添加一个Cube,按如下属性进行设置:

设置Cube

本节完成,测试运行!

Chapter 2 - Cursor and target feedback

目标

凝视、点击等操作后,缩放Cube

实践

将”Assets/HoloToolkit/Input/Prefabs/InputManager.prefab”添加到Hierarchy根级
将”Assets/HoloToolkit/Input/Prefabs/Cursor/DefaultCursor.prefab”添加到Hierarchy根级
新建文件夹:”Assets/_Scenes/Holograms 210/Scripts/”
新建脚本文件:”Assets/_Scenes/Holograms 210/Scripts/Cube210.cs“,将其拖拽到 Cube
完成后如图:

添加输入源及光标

修改 Cube210.cs 文件,内容如下:
(代码适用:5.5.0f3版本)

using HoloToolkit.Unity.InputModule;
using UnityEngine;

public class Cube210 : MonoBehaviour, IFocusable, IInputClickHandler
{
    // Cube原始缩放
    private Vector3 origScale;

    void Start()
    {
        // 保存Cube原始缩放
        origScale = gameObject.transform.localScale;
    }

    /// <summary>
    /// 凝视进入事件
    /// </summary>
    public void OnFocusEnter()
    {
        // 凝视进入后,Cube放大1.25倍
        gameObject.transform.localScale = origScale * 1.25f;
    }

    /// <summary>
    /// 凝视退出事件
    /// </summary>
    public void OnFocusExit()
    {
        // 凝视退出后,Cube还原缩放
        gameObject.transform.localScale = origScale;
    }

    /// <summary>
    /// 单击事件
    /// </summary>
    public void OnInputClicked(InputEventData eventData)
    {
        // 点击后,Cube放大1.5倍
        gameObject.transform.localScale = origScale * 1.5f;
    }
}

(代码适用:5.5.1f1版本)

using HoloToolkit.Unity.InputModule;
using UnityEngine;

public class Cube210 : MonoBehaviour, IFocusable, IInputClickHandler
{
    // Cube原始缩放
    private Vector3 origScale;

    void Start()
    {
        // 保存Cube原始缩放
        origScale = gameObject.transform.localScale;
    }

    /// <summary>
    /// 凝视进入事件
    /// </summary>
    public void OnFocusEnter()
    {
        // 凝视进入后,Cube放大1.25倍
        gameObject.transform.localScale = origScale * 1.25f;
    }

    /// <summary>
    /// 凝视退出事件
    /// </summary>
    public void OnFocusExit()
    {
        // 凝视退出后,Cube还原缩放
        gameObject.transform.localScale = origScale;
    }

    /// <summary>
    /// 单击事件
    /// </summary>
    public void OnInputClicked(InputClickedEventData eventData)
    {
        // 点击后,Cube放大1.5倍
        gameObject.transform.localScale = origScale * 1.5f;
    }
}

本节完成,测试运行!

说明

  • InputManager.prefab
    查看这个组件的Inspector,有以下几个主要脚本:

    • GazeManager.cs
      GazeManager是一个单例类,可以通过GazeManager.Instance来进行访问。管理所有与凝视射线相关的内容。常用功能如下:

      • IsGazingAtObject:判断是否凝视在物体上
      • HitInfo:可以获取到被凝视物体的基本信息,包括碰撞体、刚体、点、法线、纹理坐标、距离,及Transform属性等
      • HitObject:可以获取到被凝视的对象
      • HitPosition:凝视碰撞点位置
      • GazeOrigin:凝视射线原点
      • GazeNormal:凝视射线法线
    • InputManager.cs
      InputManager也是一个单例,可以通过InputManager.Instance来访问。在诸如手势输入源(GuesturesInput)或者其他各种输入源类中(包含自定义输入源类)中,都需要通过它进行输入源注册,以便于进行输入源的事件调度。

    • GuesturesInput.cs
      GuesturesInput是HoloToolkit提供的手势输入源处理类,内部通过GestureRecognizer单例来实现手势识别及事件捕捉。我们可以继承BaseInputSource或者IInputSource来实现自己的输入源处理类。
  • IFocusable
    IFocusable用来处理凝视进入和凝视退出

    • OnFocusEnter()
    • OnFocusEnter()

更多的事件接口,请参考《Hololens官方教程精简版 - 02. Introduction with Device》

Chapter 3 - Targeting Techniques

目标

稳定凝视光标,降低光标抖动

实践

什么都不用作,此步已经完成!

没错!点击InputManager组件,在Inspector面板中已经包含了一个内置的Gaze Stabilizer凝视稳定器,在Gaze ManagerStabilizer属性中已经进行了指定。
凝视稳定器

作用就是通过插值运算,降低凝视光标的抖动。具体效果,可以点击Play按钮,在Play视图中,用鼠标右键模拟视线移动,仔细观察光标的移动平滑程度。

Chapter 4 - Directional indicator

目标

在光标上显示一个方向标,指向目标物体

实践

这个在物体超出视线范围外的时候,非常有用。

  1. 点击Cube,在Inspector面板中,点击Add Component,搜索Direction Indicator,并添加。
  2. 将场景中的DefaultCursor拖拽到Direction IndicatorCursor属性中
  3. 点击Direction Indicator Object右侧的圆钮,选择HeadsUpDirectionIndicatorPointer模型

添加方向标

本节完成,测试运行!

说明

具体实现逻辑,都在DirectionIndicator类中

Chapter 5 - Billboarding

目标

让物体总是朝向摄像机

实践

点击Cube,在Inspector面板中,点击Add Component按钮,搜索Billboard脚本,并添加。
添加Billboard脚本

本节完成!

Play窗口中,用键盘或者鼠标控制摄像机位置,在Scene窗口中观察Cube的朝向
也可以戴上Hololens,围绕Cube走动,观察Cube的朝向

Chapter 6 - Tag-Along

目标

让物体跟随摄像机移动

实践

点击Cube,在Inspector面板中,点击Add Component按钮,搜索Tagalong脚本,并添加。
添加Tagalong脚本

本节完成!

Play窗口中,用键盘或者鼠标控制摄像机位置,在Scene窗口中观察Cube的位置
也可以戴上Hololens,四处走动,观察Cube是否跟随

小结

  • IFocusable:实现凝视检测
  • IInputClickHandler:实现手势的单击动作
  • GazeManager:凝视管理器,获取凝视物体相关信息,等。
  • GestureRecognizer:手势识别器
  • Gaze Stabilizer:凝视光标稳定器
  • DirectionIndicator:方向标
  • Billboard:公告板效果,让物体面朝摄像机
  • Tagalong:跟随器,让物体跟随摄像机

更深入的学习,我后面会陆续写。不过即使学习到了这里,有很多东西希望大家一起动手作起来。比如:

  • 除了:IFocusable和IInputClickHandler,还有一些其他事件处理接口,分别实现什么效果?
  • GazeManager:具体可以获取到哪些信息?
  • GestureRecognizer:如何使用?

参考文档
官方教程Holograms 210:https://developer.microsoft.com/en-us/windows/mixed-reality/holograms_210


VR/AR/MR技术交流QQ群:594299228
VR/AR/MR技术交流QQ群:594299228

本篇学习笔记主要讲解 HoloLens 2 开发入门教程中的 MRTK(Mixed Reality Toolkit)的 EyeTracking 和语音识别功能。 ## EyeTracking HoloLens 2 中的 EyeTracking 功能可以让应用程序能够检测用户的注视点,并根据注视点来响应相应的操作。MRTK 提供了一些组件来支持 EyeTracking 功能。 ### GazeProvider GazeProvider 是一个 MRTK 组件,它可以检测用户的注视点,并在场景中放置一个 Gaze Cursor(注视光标)来指示用户的注视点。要使用 GazeProvider,需要将它添加到场景中的一个物体上。 ### EyeTrackingTarget EyeTrackingTarget 是一个 MRTK 组件,它可以将一个物体标记为 EyeTracking 的目标。当用户的注视点在该物体上时,可以触发相应的操作。要使用 EyeTrackingTarget,需要将它添加到场景中的一个物体上,并设置它的 Trigger Type(触发类型)和 Action(操作)。 ### 示例 以下代码演示了如何在 HoloLens 2 上使用 EyeTracking 功能: ```csharp using UnityEngine; using UnityEngine.XR.WSA.Input; using Microsoft.MixedReality.Toolkit.Input; public class EyeTrackingExample : MonoBehaviour { private GazeProvider gazeProvider; private GameObject targetObject; void Start() { gazeProvider = FindObjectOfType<GazeProvider>(); targetObject = GameObject.Find("TargetObject"); } void Update() { if (gazeProvider.GazeTarget != null && gazeProvider.GazeTarget == targetObject) { Debug.Log("Gaze detected on target object."); } } } ``` ## 语音识别 HoloLens 2 中的语音识别功能可以让应用程序能够识别用户的语音指令,并根据指令来响应相应的操作。MRTK 提供了一些组件来支持语音识别功能。 ### SpeechInputHandler SpeechInputHandler 是一个 MRTK 组件,它可以将一个物体标记为语音输入的目标。当用户说出相应的语音指令时,可以触发相应的操作。要使用 SpeechInputHandler,需要将它添加到场景中的一个物体上,并设置它的 Keywords(关键词)和 Actions(操作)。 ### 示例 以下代码演示了如何在 HoloLens 2 上使用语音识别功能: ```csharp using UnityEngine; using Microsoft.MixedReality.Toolkit.Input; public class SpeechInputExample : MonoBehaviour, IMixedRealitySpeechHandler { public void OnSpeechKeywordRecognized(SpeechEventData eventData) { if (eventData.Command.Keyword == "Hello") { Debug.Log("Hello command recognized."); } } } ``` 需要注意的是,在使用语音识别功能之前,需要先在 MRTK 的配置文件中启用语音识别功能,并添加相应的语音指令。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值