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到场景,并进行设置,如图:
设置摄像机

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

Chapter 2 - Gaze(凝视)

目标

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

实践

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

视线凝视

本节完成,测试运行!

说明

  • 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
    {
        /// <summary>
        /// 点击事件(包含手势点击和Clicker设备的点击)
        /// </summary>
        public void OnInputClicked(InputEventData eventData)
        {
            // 为Cube增加刚体,产生掉落效果
            if (!this.GetComponent<Rigidbody>())
            {
                var rigidbody = this.gameObject.AddComponent<Rigidbody>();
                rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
            }
        }
    }
     
     
    • 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
    {
        /// <summary>
        /// 点击事件(包含手势点击和Clicker设备的点击)
        /// </summary>
        public void OnInputClicked(InputClickedEventData eventData)
        {
            // 为Cube增加刚体,产生掉落效果
            if (!this.GetComponent<Rigidbody>())
            {
                var rigidbody = this.gameObject.AddComponent<Rigidbody>();
                rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
            }
        }
    }
     
     
    • 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;
        }
    
        /// <summary>
        /// 点击事件(包含手势点击和Clicker设备的点击)
        /// </summary>
        public void OnInputClicked(InputEventData eventData)
        {
            OnDrop();
        }
    
        // 重置Cube位置
        public void OnReset()
        {
            // 删除Cube的刚体,取消掉落效果
            var rigidbody = this.GetComponent<Rigidbody>();
            if (rigidbody != null)
            {
                DestroyImmediate(rigidbody);
            }
            // 重置Cube位置
            this.transform.localPosition = originalPosition;
        }
    
        // 让Cube掉落
        public void OnDrop()
        {
            // 为Cube增加刚体,产生掉落效果
            if (!this.GetComponent<Rigidbody>())
            {
                var rigidbody = this.gameObject.AddComponent<Rigidbody>();
                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

    (代码适用:5.5.1f1版本)

    using HoloToolkit.Unity.InputModule;
    using UnityEngine;
    
    public class Cube101 : MonoBehaviour, IInputClickHandler
    {
        // Cube原始位置
        Vector3 originalPosition;
    
        void Start()
        {
            // 保存Cube原始位置
            originalPosition = this.transform.localPosition;
        }
    
        /// <summary>
        /// 点击事件(包含手势点击和Clicker设备的点击)
        /// </summary>
        public void OnInputClicked(InputClickedEventData eventData)
        {
            // 为Cube增加刚体,产生掉落效果
            if (!this.GetComponent<Rigidbody>())
            {
                var rigidbody = this.gameObject.AddComponent<Rigidbody>();
                rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
            }
        }
    
        // 重置Cube位置
        public void OnReset()
        {
            // 删除Cube的刚体,取消掉落效果
            var rigidbody = this.GetComponent<Rigidbody>();
            if (rigidbody != null)
            {
                DestroyImmediate(rigidbody);
            }
            // 重置Cube位置
            this.transform.localPosition = originalPosition;
        }
    
        // 让Cube掉落
        public void OnDrop()
        {
            // 为Cube增加刚体,产生掉落效果
            if (!this.GetComponent<Rigidbody>())
            {
                var rigidbody = this.gameObject.AddComponent<Rigidbody>();
                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

    在Hierarchy中添加一个空的GameObject,命名为:”Controller”
    将”Assets/HoloToolkit/Input/Scripts/Voice/KeywordManager.cs”拖拽至”Controller”
    点击”Controller”,在Inspector面板中,按图进行设置:
    设置语音命令

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

    注意:新版本中使用另外两个组件,分别为:
    - “Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputSource.cs”
    - “Assets/HoloToolkit/Input/Scripts/Voice/SpeechInputHandler.cs”

    将这两个组件拖拽到Cube上,按下图进行设置,实现上面相同的效果:

    设置语音命令

    本节完成,测试运行!

    说明

    • 为什么我发出语音命令,但是没有反应?
      • 检查一下上面的步骤可有遗漏?
      • 使用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,如图所示:
    设置MS HRTF Spatializer

    找到声音文件:”Assets/HoloToolkit/SpatialSound/Tests/Support/Audio/Vocals.wav”
    注意:版本迭代过程中,文件位置可能会发生变化,所以直接搜索”Vocals.wav”就可以了
    将其拖拽到Cube上,点击Cube,按下图调整Audio Source
    添加3D音效

    本节完成,测试运行!

    说明

    • 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”
    注意:版本迭代过程中,文件位置可能会发生变化,所以直接搜索”TapToPlace.cs”就可以了
    拖拽到Cube
    单击Cube,在Inspector面板上,去掉Cube (Script)的勾选(否则在点击Cube时会出现异常)

    放置物体完成,发布后,测试运行!

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

    说明:

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

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

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

    • 为什么发布后,无法扫描?
      记得勾选”Player Settings… > Publishing Settings > Capabilities > SpatialPerception”
      然而有些人可能勾选了还是无法扫描,那么请删除发布后的”Package.appxmanifest”文件,重新发布
      或者你得确认一下,这个文件中是否有如下的配置:

      <Capabilities>
        ...
        <uap2:Capability Name="spatialPerception" />
        ...
      </Capabilities>
     
     
    • 1
    • 2
    • 3
    • 4
    • 5

    小结

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值