**学习源于官方文档 Gestures in Unity **

笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文


(五)Hololens Unity 开发之 手势识别

HoloLens 有三大输入系统,凝视点、手势和声音 ~ 本文主要记录手势识别的学习笔记 ~

一、概述

Gestures are the second "G" in Gaze, Gesture, and Voice. Unity provides both low level access (raw position and velocity information) and a high level gesture recognizer that exposes more complex gesture events (for example: tap, double tap, hold, manipulation and navigation).  

手势识别是Hololens 三大输入系统 Gaze焦点、Gesture手势 和 Voice声音 中的第二个G(这句翻译的好像有点儿生硬了)同时在Unity层面也提供了底层的API,例如原始位置速度位移信息等~ 当然,也提供了高维度封装好的供开发者调用的高层API例如:手势单击,双击,长按,多点点击以及导航栏...(完全按照开发者的思维翻译的)

官文可以得知~ HoloLens提供了高层次的和核心的API供开发者调用~

2

  • Gesture Input
  • Interaction Input

二、Gesture Input(高层次分装的API)

Namespace: UnityEngine.VR.WSA.Input

Types: GestureRecognizer, GestureSettings, InteractionSourceKind

These high level gestures are generated by input sources. Each Gesture event provides the SourceKind for the input as well as the targeting head ray at the time of the event. Some events provide additional context specific information.

这是一些高层次的手势源,每个手势输入都对应了一个事件event~ 而每个事件都提供了SourceKind 手势输入员的类别 以及 在 头部感应器触发事件的事件~ 而且一些事件来提供了额外的一些信息~

高层的封装代表着简洁,方便,快捷所以我们只要通过下面几个步骤我们就能实现手势识别了

  1. 创建一个手势识别对象 Gesture Recognizer

  2. 设置手势监听的类型

  3. 注册事件

  4. 开启手势识别的功能

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    using UnityEngine.VR.WSA.Input;

    public class GestureDemo : MonoBehaviour {

    1. private GestureRecognizer recognizer;
    2. // Use this for initialization
    3. void Start () {
    4. Debug.Log("初始化开始~");
    5. // 创建手势识别对象
    6. recognizer = new GestureRecognizer();
    7. // 设置手势识别的类型
    8. recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold | GestureSettings.DoubleTap);
    9. // 添加手势识别的事件
    10. recognizer.TappedEvent += Recognizer_TappedEvent;
    11. recognizer.HoldStartedEvent += Recognizer_HoldStartedEvent;
    12. recognizer.HoldCompletedEvent += Recognizer_HoldCompletedEvent;
    13. recognizer.HoldCanceledEvent += Recognizer_HoldCanceledEvent;
    14. // 开启手势识别
    15. recognizer.StartCapturingGestures();
    16. Debug.Log("初始化完成~");
    17. }
    18. private void Recognizer_HoldCanceledEvent(InteractionSourceKind source, Ray headRay)
    19. {
    20. Debug.Log("Recognizer_HoldCanceledEvent 枚举类型应该为1 ~ " + source);
    21. }
    22. private void Recognizer_HoldCompletedEvent(InteractionSourceKind source, Ray headRay)
    23. {
    24. Debug.Log("Recognizer_HoldCompletedEvent 枚举类型应该为1 ~ " + source);
    25. }
    26. private void Recognizer_HoldStartedEvent(InteractionSourceKind source, Ray headRay)
    27. {
    28. Debug.Log("Recognizer_HoldStartedEvent 枚举类型应该为1 ~ " + source);
    29. }
    30. private void Recognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay)
    31. {
    32. Debug.Log("Recognizer_TappedEvent 枚举类型应该为1 ~ " + source + " 点击的次数 " + tapCount);
    33. }
    34. void OnDestroy()
    35. {
    36. // 销毁注册的事件
    37. recognizer.TappedEvent -= Recognizer_TappedEvent;
    38. recognizer.HoldStartedEvent -= Recognizer_HoldStartedEvent;
    39. recognizer.HoldCompletedEvent -= Recognizer_HoldCompletedEvent;
    40. recognizer.HoldCanceledEvent -= Recognizer_HoldCanceledEvent;
    41. }

    }

一切尽在代码中~


三、Interaction Input(核心API)

Namespace: UnityEngine.VR.WSA.Input

Types: InteractionManager, InteractionSourceState, InteractionSource, InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation

1、API介绍

手势交互核心层的API调用分厂简单,三步搞定~

  1. 注册手势交互的事件

  2. 接收事件回调

  3. 移除手势交互的事件

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    using UnityEngine.VR.WSA.Input;

    public class InteractionDemo : MonoBehaviour {

    1. // Use this for initialization
    2. void Start () {
    3. // 点击某个控件的事件
    4. InteractionManager.SourcePressed += InteractionManager_SourcePressed;
    5. // 点击某个控件放开的事件
    6. InteractionManager.SourceReleased += InteractionManager_SourceReleased;
    7. // 选中某个控件的事件
    8. InteractionManager.SourceDetected += InteractionManager_SourceDetected;
    9. // 选中后再不选中的事件
    10. InteractionManager.SourceLost += InteractionManager_SourceLost;
    11. // 更新某个控件的事件
    12. InteractionManager.SourceUpdated += InteractionManager_SourceUpdated;
    13. }
    14. private void InteractionManager_SourceUpdated(InteractionSourceState state)
    15. {
    16. throw new System.NotImplementedException();
    17. }
    18. private void InteractionManager_SourceReleased(InteractionSourceState state)
    19. {
    20. throw new System.NotImplementedException();
    21. }
    22. private void InteractionManager_SourceLost(InteractionSourceState state)
    23. {
    24. throw new System.NotImplementedException();
    25. }
    26. private void InteractionManager_SourceDetected(InteractionSourceState state)
    27. {
    28. throw new System.NotImplementedException();
    29. }
    30. private void InteractionManager_SourcePressed(InteractionSourceState state)
    31. {
    32. throw new System.NotImplementedException();
    33. }
    34. void OnDestroy()
    35. {
    36. // 移除各种手势的事件
    37. InteractionManager.SourceDetected -= InteractionManager_SourceDetected;
    38. InteractionManager.SourceUpdated -= InteractionManager_SourceUpdated;
    39. InteractionManager.SourceLost -= InteractionManager_SourceLost;
    40. InteractionManager.SourcePressed -= InteractionManager_SourcePressed;
    41. InteractionManager.SourceReleased -= InteractionManager_SourceReleased;
    42. }

    }

2、InteractionSourceState 结构体

源码~

  1. namespace UnityEngine.VR.WSA.Input
  2. {
  3. [RequiredByNativeCodeAttribute]
  4. public struct InteractionSourceState
  5. {
  6. public Ray headRay { get; }
  7. public bool pressed { get; }
  8. public InteractionSourceProperties properties { get; }
  9. public InteractionSource source { get; }
  10. }
  11. }
  • headRay 这个变量可以确定该事件发生时用户头部所处的位置信息
  • pressed 是否处于点击状态
  • InteractionSourceProperties 可以通过InteractionSourceProperties获得输入源的位置、速度以及输入源的时间点
  • InteractionSource 枚举类型,可以是不同的输入类型,包括手势 声音 控制器 以及 其他等等~

(五)Hololens Unity 开发之 手势识别的更多相关文章

  1. (二)Hololens Unity 开发之 语音识别

    学习源于官方文档 Voice input in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 (二)Hololens Unity 开发之 语音识别 Hol ...

  2. (二)Hololens Unity 开发入门 之 Hello HoloLens~

    学习源于官方文档 微软官文~ 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 (二)Hololens Unity 开发入门 之 Hello HoloLens~ 本文主要 ...

  3. (三)Hololens Unity 开发之 语音识别

    学习源于官方文档 Voice input in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 (三)Hololens Unity 开发之 语音识别 Hol ...

  4. (一)Hololens Unity 开发环境搭建(Mac BOOTCAMP WIN10)

    (一)Hololens Unity 开发环境搭建(Mac BOOTCAMP WIN10) 系统要求 64位 Windows 10 除了家庭版的 都支持 ~ 64位CPU CPU至少是四核心以上~ 至少 ...

  5. (四)Hololens Unity 开发之 凝视系统

    学习源于官方文档 Gaze in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 HoloLens 有三大输入系统,凝视点.手势和声音 ~ 本文主要记录凝视 ...

  6. HoloLens开发手记 - Unity development overview 使用Unity开发概述

    Unity Technical Preview for HoloLens最新发行版为:Beta 24,发布于 09/07/2016 开始使用Unity开发HoloLens应用之前,确保你已经安装好了必 ...

  7. 使用Unity开发HoloLens应用

    https://developer.microsoft.com/en-us/windows/holographic/install_the_tools 导读:开发者们在陆续收到HoloLens开发者版 ...

  8. Unity开发概览(HoloLens开发系列)

    本文翻译自:Unity development overview 要开始使用Unity创建全息应用,点此安装包含Unity HoloLens技术预览的开发工具.Unity HoloLens技术预览基于 ...

  9. 【Holograms 101D】一步步用Unity 开发 Hologram

    转载请注明出处: copperface:[Holograms 101D]一步步用Unity 开发 Hologram Holograms 101 该教程将带领你走完 Hologram 创建 的全过程.整 ...

随机推荐

  1. ecos新命令

    创建myapp,在myapp里创建lib/command目录 新建一个文件hello.php <?php /** * myapp_command_hello(myapp->app名称,co ...

  2. HUST 1027 Enemy Target!

    求二分图的最小点覆盖集,并输出 对于每一个a[i][j]=1,我们从行i-->列j建立一条边 显然,这张图是一张二分图.左边的节点代表删除哪一行,右边的节点代表删除哪一列.中间的边代表所有a[i ...

  3. 关于NOMINMAX这个预处理宏

    标准库在<algorithm>头中定义了两个模板函数std::min() 和 std::max().通常用它可以计算某个值对的最小值和最大值.可惜在 Visual C++ 无法使用它们,因 ...

  4. PHP操作mysql类

    <?php class Mysql{ //数据库连接句柄 private $link; //返回结果集 private $result; //返回查询数据 private $data; //执行 ...

  5. 学习vi(1)

    原文地址:http://www.gentoo.org/doc/zh_cn/vi-guide.xml#doc_chap2 1.  新手上路 介绍 本教程将会向你展示如何使用vi──一个强大的可视化编辑器 ...

  6. 理解javascript函数的重载

        javascript其实是不支持重载的,这篇文章会和java语言函数的重载对比来加深对javascript函数重载的理解.       以下我会假设读者不了解什么是重载所以会有一些很基础的概念 ...

  7. 7 -- Spring的基本用法 -- 12...

    7.12 Spring 3.0 提供的表达式语言(SpEL) Spring表达式语言(简称SpEL)是一种与JSP 2 的EL功能类似的表达式语言,它可以在运行时查询和操作对象图.支持方法调用和基本字 ...

  8. sgu176 Flow Construction【有源汇有上下界最小流】

    同样是模板题. 首先将有源汇转换为无源汇,假设原来的源汇为st,我们加入的源汇为ST,那么我们应该从t到s连一条流量为+∞的边,使原来的st满足收支平衡,退化为普通节点. 分离必要边和其他边,从S到T ...

  9. CSS border三角、圆角图形生成技术简介

    http://www.zhangxinxu.com/wordpress/?p=794 一.前言 利用CSS的border属性可以生成一些图形,例如三角或是圆角.纯粹的CSS2的内容,没有兼容性的问题, ...

  10. 华为AR1220新机试用

    今天刚刚收到华为AR1220,以为直接就可以用web界面管理,结果开机后才知道web管理界面需要激活. 下面简单分享这个过程: *** 用控制台线(一边RJ45,一边9针串)连接Router cons ...