Hololens官方教程精简版 - 02. Introduction with Device

前言

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

个人认为,官方的Holograms 101教程是该系列最重要的一篇。这里面包含了几乎所有Hololens的特征:凝视、手势、声音输入、空间声音、空间映射。

准备工作

按《Hololens官方教程精简版 - 01. Getting started with Unity》 完成项目创建。

注意:以下包含5.5.0f3和5.5.1f1代码,练习时,注意对应自己的版本

Chapter 1 - “Holo” world

新建文件夹:”Assets/_Scenes/Holograms 101/” 
在该文件夹下新建场景:”Holograms 101” 
打开该场景,按上一篇的说明,设置好摄像机。 
添加一个Cube到场景,并进行设置,如图: 
Hololens官方教程精简版 - 02. Introduction with Device_第1张图片

测试运行! 
(推荐使用Holographics Remoting Player进行开发过程测试,效率会高很多。)

Chapter 2 - Gaze(凝视)

目标

创建一个随“视线”移动的光标

实践

在Project面板中,找到”Assets/HoloToolkit/Input/Prefabs/InputManager.prefab”,拖动到Hierarchy根目录 
同样,将”Assets/HoloToolkit/Input/Prefabs/Cursor/Cursor.prefab”,拖动到Hierarchy根目录

Hololens官方教程精简版 - 02. Introduction with Device_第2张图片

本节完成,测试运行!

说明

  • InputManager.prefab 
    输入管理器,用来管理视线、手势等输入源。 
    这个管理器还提供了在编辑器中模拟输入的功能:

    • Shift:左手
    • Space:右手
    • 鼠标移动:模拟手移动
    • 鼠标左键:模拟手点击
    • 鼠标右键:模拟视线移动
    • WSAD/QE:摄像机移动
  • Cursor.prefab 
    工具包自带光标之一,主要实现凝视物体时,出现附着圆环,否则光标发亮。 
    其他几个自带光标如下:

    • BasicCursor.prefab:基础光标,凝视物体出现附着圆环,否则不显示。
    • CursorWithFeedback.prefab:手势检测光标,当检测到手时,会变成一个手势图标。
    • DefaultCursor.prefab:默认光标,模拟Hololens系统内置光标。

Chapter 3 - Gestures(手势识别)

目标

点击Cube,Cube坠落

实践

新建文件夹:”Assets/_Scenes/Holograms 101/Scripts/” 
新建C#脚本:”Assets/_Scenes/Holograms 101/Scripts/Cube.cs”,内容如下: 
(代码适用:5.5.0f3版本)

using HoloToolkit.Unity.InputModule;
using UnityEngine;

public class Cube : MonoBehaviour, IInputClickHandler
{
    /// 
    /// 点击事件(包含手势点击和Clicker设备的点击)
    /// 
    public void OnInputClicked(InputEventData eventData)
    {
        // 为Cube增加刚体,产生掉落效果
        if (!this.GetComponent())
        {
            var rigidbody = this.gameObject.AddComponent();
            rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

(代码适用:5.5.1f1版本)

using HoloToolkit.Unity.InputModule;
using UnityEngine;

public class Cube101 : MonoBehaviour, IInputClickHandler
{
    /// 
    /// 点击事件(包含手势点击和Clicker设备的点击)
    /// 
    public void OnInputClicked(InputClickedEventData eventData)
    {
        // 为Cube增加刚体,产生掉落效果
        if (!this.GetComponent())
        {
            var rigidbody = this.gameObject.AddComponent();
            rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

将脚本拖拽至Cube 
本节完成,测试运行!

说明

  • IInputClickHandler 
    点击事件处理接口,需要实现OnInputClicked(InputEventData eventData) 方法 
    在该方法中实现具体的逻辑。

HoloToolkit中还提供了更多的事件处理接口,如下:

  • IFocusable 凝视聚焦事件,当视线进入或离开物体的触发
  • IHoldHandle 处理Hold手势事件
  • IInputHandler 处理点击过程中的按下和松开事件
  • IInputClickHandler 处理点击事件
  • IManipulationHandler 处理手势操纵事件,事件返回手势偏移量
  • INavigationnHandler 处理手势导航事件,事件返回手势偏移量,值域[-1, 1]
  • ISourceStateHandler 处理事件源的状态监测,比如:手势离开检测区域
  • ISpeechHandler 处理语音命令(5.5.1f1新增

Chapter 4 - Voice(声音)

目标

语音命令控制Cube坠落

实践

打开Player Settings…面板,在Publishing Settings>Capabilities中,勾选Microphone

修改文件:”Assets/_Scenes/Holograms 101/Scripts/Cube.cs”,如下: 
(代码适用:5.5.0f3版本)

using HoloToolkit.Unity.InputModule;
using UnityEngine;

public class Cube : MonoBehaviour, IInputClickHandler
{
    // Cube原始位置
    Vector3 originalPosition;

    void Start()
    {
        // 保存Cube原始位置
        originalPosition = this.transform.localPosition;
    }

    /// 
    /// 点击事件(包含手势点击和Clicker设备的点击)
    /// 
    public void OnInputClicked(InputEventData eventData)
    {
        OnDrop();
    }

    // 重置Cube位置
    public void OnReset()
    {
        // 删除Cube的刚体,取消掉落效果
        var rigidbody = this.GetComponent();
        if (rigidbody != null)
        {
            DestroyImmediate(rigidbody);
        }
        // 重置Cube位置
        this.transform.localPosition = originalPosition;
    }

    // 让Cube掉落
    public void OnDrop()
    {
        // 为Cube增加刚体,产生掉落效果
        if (!this.GetComponent())
        {
            var rigidbody = this.gameObject.AddComponent();
            rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

(代码适用:5.5.1f1版本)

using HoloToolkit.Unity.InputModule;
using UnityEngine;

public class Cube101 : MonoBehaviour, IInputClickHandler
{
    // Cube原始位置
    Vector3 originalPosition;

    void Start()
    {
        // 保存Cube原始位置
        originalPosition = this.transform.localPosition;
    }

    /// 
    /// 点击事件(包含手势点击和Clicker设备的点击)
    /// 
    public void OnInputClicked(InputClickedEventData eventData)
    {
        // 为Cube增加刚体,产生掉落效果
        if (!this.GetComponent())
        {
            var rigidbody = this.gameObject.AddComponent();
            rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
        }
    }

    // 重置Cube位置
    public void OnReset()
    {
        // 删除Cube的刚体,取消掉落效果
        var rigidbody = this.GetComponent();
        if (rigidbody != null)
        {
            DestroyImmediate(rigidbody);
        }
        // 重置Cube位置
        this.transform.localPosition = originalPosition;
    }

    // 让Cube掉落
    public void OnDrop()
    {
        // 为Cube增加刚体,产生掉落效果
        if (!this.GetComponent())
        {
            var rigidbody = this.gameObject.AddComponent();
            rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
        }
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

在Hierarchy中添加一个空的GameObject,命名为:”Controller” 
将”Assets/HoloToolkit/Input/Scripts/Voice/KeywordManager.cs”拖拽至”Controller” 
点击”Controller”,在Inspector面板中,按图进行设置: 
Hololens官方教程精简版 - 02. Introduction with Device_第3张图片

其中:Keyword对应的语音命令,Response()面板中设置响应的对象及方法

本节完成,测试运行!

说明

  • 为什么我发出语音命令,但是没有反应? 
    • 检查一下上面的步骤可有遗漏?
    • 使用Holographics Remoting Player进行调试时,如果有外置麦克风,请试着对外置麦克风说话
    • 请注意勾选Microphone功能
  • 为什么要创建一个单独的”Controller”对象来放置语音命令脚本? 
    个人喜好,方便管理。将”KeywordManager.cs”放置在其他对象上也是可以的。 
    但需要提醒的是,尽可能不要放置到HoloToolkit内置的Prefab上。 
    由于目前HoloToolkit-Unity在Github上更新频率相当快!在项目中尽量保持组件的独立性,便于以后升级版本。

Chapter 5 - Spatial sound(空间声音)

目标

把Cube变成“音乐盒”,随着Cube的坠落,声音消失

实践

打开菜单:”Edit > Project Settings > Audio”,将Spatializer Plugin修改为:MS HRTF Spatializer,如图所示: 
Hololens官方教程精简版 - 02. Introduction with Device_第4张图片

找到声音文件:”Assets/HoloToolkit/SpatialSound/Tests/Support/Audio/Vocals.wav” 
将其拖拽到Cube上,点击Cube,按下图调整Audio Source: 
Hololens官方教程精简版 - 02. Introduction with Device_第5张图片

本节完成,测试运行!

说明

  • Spatial Blend 
    调整声音的3D效果

  • Doppler Level 
    多普勒级别越大,移动速度对声音波长的影响越大,移动中会导致“变声”

  • Volume Rolloff 
    音量衰减模式

Chapter 6 - Spatial mapping(空间映射)

目标

扫描房间,将Cube放置在房间地面、墙体等地方

实践

找到文件:”Assets/HoloToolkit/SpatialMapping/Prefabs/SpatialMapping.prefab” 
拖拽到Hierarchy 根级

空间映射完成,测试运行!

注意:第一次运行时,需要耐心等待一段时间

找到文件:”Assets/HoloToolkit/Utilities/Scripts/WorldAnchorManager.cs” 
拖拽到Controller上 
找到文件:”Assets/HoloToolkit/SpatialMapping/Scripts/TapToPlace.cs” 
拖拽到Cube 上 
单击Cube,在Inspector面板上,去掉Cube (Script)的勾选(否则在点击Cube时会出现异常)

做好后如下图:



放置物体完成,测试运行!(需要真机调试)

注意:需要等待空间映射效果出现后,才能放置Cube

说明:

  • SpatialMapping.prefab 
    内置空间映射组件

  • WorldAnchorManager.cs 
    内置空间坐标管理器

  • TapToPlace.cs 
    单击并放置物体到空间的脚本,内置的

小结

Holograms 101 是整个官方教程系列中最重要的一篇,要能达到闭着眼睛都能完成。

本篇未深入Hololens的各个功能,只是体验了一下。后续的文章会一个个的进行深入学习。

参考文档: 
官方教程Holograms 101:https://developer.microsoft.com/EN-US/WINDOWS/HOLOGRAPHIC/holograms_101


你可能感兴趣的:(HoloLens开发)