HoloLens开发手记 - Unity之Gestures手势识别
2024-10-07 23:11:22
手势识别是HoloLens交互的重要输入方法之一。HoloLens提供了底层API和高层API,可以满足不同的手势定制需求。底层API能够获取手的位置和速度信息,高层API则借助手势识别器来识别预设的手势(包括,单击、双击、长按、平移等等)。
手势输入 Gesture Input
本部分为高级API使用,通过输入源来识别手势。每个手势对应一个SourceKind输入源,大部分手势事件都是系统预设的事件,有些事件会提供额外的上下文信息。
只需要很少的步骤就能使用GestureRecognizer集成手势识别:
- 创建GestureRecognizer实例
- 注册指定的手势类型
- 订阅手势事件
- 开始手势识别
private GestureRecognizer recognizer; // Use this for initialization
void Start()
{
recognizer = new GestureRecognizer();
recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);
recognizer.HoldStartedEvent += Recognizer_HoldStartedEvent;
recognizer.TappedEvent += Recognizer_TappedEvent;
//开始识别
recognizer.StartCapturingGestures();
} private void Recognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay)
{
Debug.Log("Tap");
} private void Recognizer_HoldStartedEvent(InteractionSourceKind source, Ray headRay)
{
Debug.Log("hold");
} // Update is called once per frame
void Update()
{ } void OnDestory()
{
recognizer.TappedEvent -= Recognizer_TappedEvent;
recognizer.HoldStartedEvent -= Recognizer_HoldStartedEvent; }
停止手势识别
recognizer.StopCapturingGestures();
底层API Interaction Input
底层API运行获得输入来源的更多详细信息,例如它在世界中的位置和速度。
如何处理底层交互事件
使用底层交互是很容易的:
- 注册InteractionManager事件
- 处理事件
停止它也很容易:
- 取消注册事件
注册底层交互事件
对于每种你需要的底层事件,你都需要去注册它
InteractionManager.SourcePressed += InteractionManager_SourcePressed;
处理底层交互事件
一旦注册了底层交互事件,在事件发生时你就可以得到回调。你可以使用获取到的时间信息来处理应用行为。
void InteractionManager_SourcePressed(InteractionSourceState state)
{
// state变量里包含以下信息:
// 当前凝视射线信息
// 来源是否被点击
// 位置、速度之类的属性
// 来源id和来源类型 (hand, voice, controller或其他)
}
如何停止交互事件
当你不再想要关注一些事件后,只需要取消时间注册即可。
InteractionManager.SourcePressed -= InteractionManager_SourcePressed;
输入源变化事件
这些事件描述了输入源的当前状态:
- detected(即将激活)
- lost(即将取消激活)
- updates(移动或者一些状态在变化)
- is pressed(点击、按钮按下或者语音选中)
- is released(点击结束,按钮松开,语音选中结束)
输入源状态
每个事件都会有一个InteractionSourceState参数,这个参数代表了实时输入源状态:
- 是否是点击状态
- InteractionSourceProperties包含了输入源位置信息 InteractionSourceLocation,能够获得当前输入源位置和速度信息
- 凝视射线信息,用于判断事件发生时用户是否在注视目标
- 来源类型信息,包括hand、voice、controller或者其他类型
示例代码
using UnityEngine.VR.WSA.Input; void Start ()
{
InteractionManager.SourceDetected += InteractionManager_SourceDetected;
InteractionManager.SourceUpdated += InteractionManager_SourceUpdated;
InteractionManager.SourceLost += InteractionManager_SourceLost;
InteractionManager.SourcePressed += InteractionManager_SourcePressed;
InteractionManager.SourceReleased += InteractionManager_SourceReleased;
} void OnDestroy()
{
InteractionManager.SourceDetected -= InteractionManager_SourceDetected;
InteractionManager.SourceUpdated -= InteractionManager_SourceUpdated;
InteractionManager.SourceLost -= InteractionManager_SourceLost;
InteractionManager.SourcePressed -= InteractionManager_SourcePressed;
InteractionManager.SourceReleased -= InteractionManager_SourceReleased;
} void InteractionManager_SourceDetected(InteractionSourceState state)
{
// 识别到来源
} void InteractionManager_SourceLost(InteractionSourceState state)
{
//丢失来源
} void InteractionManager_SourceUpdated(InteractionSourceState state)
{
//来源被更新
} void InteractionManager_SourcePressed(InteractionSourceState state)
{
//来源被按下
} void InteractionManager_SourceReleased(InteractionSourceState state)
{
// 来源被松开
}
最新文章
- 《JavaScript 代码优化指南》
- 什么是web service
- 《HelloGitHub月刊》第04期(秋招临近,本期加入了面试相关的项目)
- eclipse 闪退
- 【py技巧】使用reload重导入修改过的包或模块
- 栈——PowerShell版
- ASP.NET-FineUI开发实践-8
- 分布式开放消息系统(RocketMQ)的原理与实践(转)
- 洛谷 P3370 【模板】字符串哈希
- DNS协议(一)
- 做双网卡绑定_______物理机在双网卡的情况下做多IP绑定
- 关于在Idea 创建Maven项目时,无法在source文件下创建servlet文件问题解决!
- Python相关文章
- Magicodes.NET框架之路——让代码再飞一会(ASP.NET Scaffolding)
- Huawei运维记录
- springboot+shiro+redis(单机redis版)整合教程-续(添加动态角色权限控制)
- [LeetCode] 240. Search a 2D Matrix II_Medium tag: Binary Search
- http 2.0 新特性
- Unity预计算全局光照的学习(速度优化,LightProbe,LPPV)
- BPM编程模型(场景)
热门文章
- (android) SharedPreferences 两种方式的存储范围
- PHP正则中的捕获组与非捕获组
- MySQL的replace函数的用法
- linux: 获取监听指定端口的进程PID
- R语言Cairo包的使用
- [转]ionic $state.go passed $stateParams
- [转]GridView排序——微软提供Sort
- UESTC 898 方老师和缘分 --二分图匹配+强连通分量
- linux命令学习-复制(cp,scp)
- 解决svn的working copy locked并且cleanup恢复不能的情况