设为首页收藏本站

微软Hololens全息现实网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

一键登录:

查看: 762|回复: 1

Hololens官方教程精简版 - 04. Gesture(手势)

[复制链接]
发表于 2017-12-5 22:00:10 | 显示全部楼层 |阅读模式

本帖最后由 HoloLens全息现实网 于 2017-12-5 22:01 编辑 前言注意:本文已更新到5.5.1f1版本个人建议,学习Holograms 211之前,一定完成《Hololens官方教程精简版 - 02. Introduction with Device》的学习。本篇集中学习手势功能,完成以下目标: - 是否已检测到手势动作 - 使用导航手势来旋转...

本帖最后由 HoloLens全息现实网 于 2017-12-5 22:01 编辑

前言
注意:本文已更新到5.5.1f1版本
个人建议,学习Holograms 211之前,一定完成《Hololens官方教程精简版 - 02. Introduction with Device》的学习。
本篇集中学习手势功能,完成以下目标:
- 是否已检测到手势动作
- 使用导航手势来旋转物体
- 手势超出检测区域的处理
- 手势移动物体
Unity Setup
请按照第一篇的教程,完成项目的创建。
新建文件夹:”Assets/_Scenes/Holograms 211/”
新建场景:”Assets/_Scenes/Holograms 211/Holograms 211.unity”
打开场景,删除默认的Main Camera
将”Assets/HoloToolkit/Input/Prefabs/HololensCamera.prefab”添加到Hierarchy根级
添加一个Cube,按如下属性进行设置:
36.png
本节完成,测试运行!
Chapter 1 - Hand detected feedback目标
检测到手势后,光标发生变化
实践
在Project面板中,找到”Assets/HoloToolkit/Input/Prefabs/InputManager.prefab”,拖动到Hierarchy根目录
同样,将”Assets/HoloToolkit/Input/Prefabs/Cursor/CursorWithFeedback.prefab”,拖动到Hierarchy根目录
本节完成!
在编辑器中进行测试,点击Play,在Game窗口中,按住空格键模拟右手手势,会发现光标发生了变化。
在Hololens模拟器或者真机上测试,会产生同样的效果。
说明
HoloToolkit内置的几个光标,都继承自Cursor抽象类,如图:
35.png
Cursor内部的实现,简单来说,就是当输入源事件触发时(比如检测到手势),修改光标的状态值(一个枚举值CursorStateEnum)。
UpdateUpdateCursorState()方法调用时,根据这个光标状态值,进行相应的光标变化处理。这个处理,
实际上,执行的是一个虚函数:
  1. public virtual void OnCursorStateChange(CursorStateEnum state)
复制代码
具体的光标类重写Override这个方法,实现光标变化的细节。
比如本节所使用的光标CursorWithFeedback.prefab,调用的是ObjectCursor类,相关代码为:
  1.     public class ObjectCursor : Cursor
  2.     {
  3.         ...

  4.         public override void OnCursorStateChange(CursorStateEnum state)
  5.         {
  6.             base.OnCursorStateChange(state);

  7.             if (state != CursorStateEnum.Contextual)
  8.             {
  9.                 // Hide all children first
  10.                 for(int i = 0; i < ParentTransform.childCount; i++)
  11.                 {
  12.                     ParentTransform.GetChild(i).gameObject.SetActive(false);
  13.                 }

  14.                 // Set active any that match the current state
  15.                 for (int i = 0; i < CursorStateData.Length; i++)
  16.                 {
  17.                     if (CursorStateData[i].CursorState == state)
  18.                     {
  19.                         CursorStateData[i].CursorObject.SetActive(true);
  20.                     }
  21.                 }
  22.             }
  23.         }
  24.     }
复制代码

注意:5.5.1f1代码有些变化,但思路一致
同时,HoloToolkit还提供了其他几个光标类供我们使用,分别为:
- ObjectCursor
- SpriteCursor
- MeshCursor
- AnimatedCursor
如果想扩展我们自己的光标,可以继承上面的类,或者直接继承Cursor类。
由于本系列是精简版,所以不赘述,后面有精力会补充深入版本的教程。
Chapter 2 - Navigation目标
使用导航手势,旋转Cube
实践
新建文件夹:”Assets/_Scenes/Holograms 211/Scripts/”
新建脚本文件:”Assets/_Scenes/Holograms 211/Scripts/Cube211.cs”,将其拖拽到 Cube 上 ,编写脚本如下:
  1. using HoloToolkit.Unity.InputModule;
  2. using UnityEngine;

  3. public class Cube211 : MonoBehaviour, INavigationHandler
  4. {
  5.     [Tooltip("旋转速度")]
  6.     public float RotationSensitivity = 10.0f;

  7.     public void OnNavigationCanceled(NavigationEventData eventData)
  8.     {
  9.         //do nothing
  10.     }

  11.     public void OnNavigationCompleted(NavigationEventData eventData)
  12.     {
  13.         //do nothing
  14.     }

  15.     public void OnNavigationStarted(NavigationEventData eventData)
  16.     {
  17.         //do nothing
  18.     }

  19.     public void OnNavigationUpdated(NavigationEventData eventData)
  20.     {
  21.         // 计算旋转值,其中:eventData的CumulativeDelta返回手势导航差值,值域[-1, 1]
  22.         float rotationFactor = eventData.CumulativeDelta.x * RotationSensitivity;
  23.         transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
  24.     }
  25. }
复制代码
本节结束!
使用模拟器或者真机进行测试,凝视Cube,用手势进行横向拖拽,会发现Cube发生旋转。
说明
  • INavigationHandler
    手势导航事件处理接口,该事件会将导航差值(归一化)传递出来给开发者使用,取值在[-1, 1]之间。
Chapter 3 - Hand Guidance目标
当手势快要超出检测范围时,给出提示
实践
  • Hierarchy根级新建空对象,并重命名为:Controller
  • Project中查找HandGuidance脚本,拖拽到Controller
  • 点击Controller,显示Inspector面板
  • HierarchyCursorWithFeedback对象拖拽到Cursor属性上。
  • 点击属性Hand Guidance Indicator右侧的按钮,选择HeadsUpDirectionIndicatorPointer
  • Hand Guidance Threshold取值:0.5
本节完成!
按下图发布到VS2015,并使用模拟器或者真机进行测试。
34.png
当拖拽的手势快超出检测范围时,会显示一个提醒箭头。
说明
HandGuidance类中,主要用了InteractionManager这个交互管理器,来监听手势变化。
Chapter 4 - Manipulation目标
拖拽移动Cube
实践
修改文件:”Assets/_Scenes/Holograms 211/Scripts/Cube211.cs”
  1. using HoloToolkit.Unity.InputModule;
  2. using UnityEngine;

  3. public class Cube211 : MonoBehaviour, INavigationHandler, IManipulationHandler
  4. {
  5.     [Tooltip("旋转速度")]
  6.     public float RotationSensitivity = 10.0f;

  7.     [Tooltip("移动速度")]
  8.     public float MoveSensitivity = 1.5f;

  9.     //Cube移动前的位置
  10.     private Vector3 origPosition;

  11.     public void OnManipulationCanceled(ManipulationEventData eventData)
  12.     {
  13.         //do nothing
  14.     }

  15.     public void OnManipulationCompleted(ManipulationEventData eventData)
  16.     {
  17.         //do nothing
  18.     }

  19.     public void OnManipulationStarted(ManipulationEventData eventData)
  20.     {
  21.         // 开始移动前,保存Cube原始位置
  22.         origPosition = transform.position;
  23.     }

  24.     public void OnManipulationUpdated(ManipulationEventData eventData)
  25.     {
  26.         // 获取拖拽的总偏移量
  27.         Vector3 newPos = new Vector3(eventData.CumulativeDelta.x, eventData.CumulativeDelta.y, eventData.CumulativeDelta.z);

  28.         // 设置Cube新的位置
  29.         transform.position = origPosition + newPos * MoveSensitivity;
  30.     }

  31.     public void OnNavigationCanceled(NavigationEventData eventData)
  32.     {
  33.         //do nothing
  34.     }

  35.     public void OnNavigationCompleted(NavigationEventData eventData)
  36.     {
  37.         //do nothing
  38.     }

  39.     public void OnNavigationStarted(NavigationEventData eventData)
  40.     {
  41.         //do nothing
  42.     }

  43.     public void OnNavigationUpdated(NavigationEventData eventData)
  44.     {
  45.         // 计算旋转值,其中:eventData的CumulativeDelta返回导航差值,值域[-1, 1]
  46.         float rotationFactor = eventData.CumulativeDelta.x * RotationSensitivity;
  47.         transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
  48.     }
  49. }
复制代码
本节完成!
凝视Cube并拖拽,Cube将会发生移动。
如果上一节中的箭头会影响视线的话,可以去掉Controller的勾选框。
说明
  • IManipulationHandler
    手势移动事件处理接口,该事件会将返回自拖拽开始的总位移量。
小结
  • Cursor及其子类:实现基础的光标
  • INavigationHandler:手势导航事件的处理
  • IManipulationHandler:手势移动事件的处理
  • HandGuidance:手势超出检测区域的提醒
更多手势识别的处理,可以参考Unity SDK中提供的类:GestureRecognizer






上一篇:Hololens官方教程精简版 - 03. Gaze(凝视)
下一篇:Hololens官方教程精简版 - 05. Voice(语音)
发表于 2017-12-5 22:10:29 | 显示全部楼层
看来来不错
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

注册验证邮件查收提醒:

由于各大邮箱政策原因,

如果没收到邮件提醒,

您的注册验证邮件可能

被投送到您邮箱的垃圾箱,

请注意查收验证哦


QQ|小黑屋|Hololens全息现实网 ( 京ICP备15026232号   点击这里给我发消息

GMT+8, 2018-12-14 14:46 , Processed in 0.559701 second(s), 30 queries .

Powered by Hololens全息现实网 X3.2

© 2001-2017 Hololens全息现实网

快速回复 返回顶部 返回列表