Hololens开发笔记之Gesture手势识别(Manipulation手势控制物体平移)
Manipulation gesture:保持点击手势,在3D世界中绝对运动
当你想要全息图像1:1响应用户手部移动时,操纵手势能被用于移动、缩放或旋转全息图像。如此的一个用处是使得用户可以在世界中绘制图像或作画。使用所有的手势时,操纵手势的初始目标应该通过凝视来选中。一旦点击手势开始,通过手部移动的任何对对象的操作都能够被处理,在用户操作全息图像时,从而使得用户得以自由地四处张望。
1、修改HandsManager.cs,添加InteractionManager.SourcePressed,InteractionManager.SourceReleased处理函数,用于识别物体被点击和被释放的事件
HandsManager.cs完整代码如下:
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Licensed under the MIT License. See LICENSE in the project root for license information.
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.VR.WSA.Input;
- namespace HoloToolkit.Unity
- {
- /// <summary>
- /// HandsManager determines if the hand is currently detected or not.
- /// </summary>
- public partial class HandsManager : Singleton<HandsManager>
- {
- /// <summary>
- /// HandDetected tracks the hand detected state.
- /// Returns true if the list of tracked hands is not empty.
- /// </summary>
- public bool HandDetected
- {
- get { return trackedHands.Count > ; }
- }
- private HashSet<uint> trackedHands = new HashSet<uint>();
- public GameObject FocusedGameObject { get; private set; }
- void Awake()
- {
- //识别到来源
- InteractionManager.SourceDetected += InteractionManager_SourceDetected;
- //来源丢失
- InteractionManager.SourceLost += InteractionManager_SourceLost;
- //来源被按下
- InteractionManager.SourcePressed += InteractionManager_SourcePressed;
- //被释放
- InteractionManager.SourceReleased += InteractionManager_SourceReleased;
- FocusedGameObject = null;
- }
- private void InteractionManager_SourceDetected(InteractionSourceState state)
- {
- // Check to see that the source is a hand.
- if (state.source.kind != InteractionSourceKind.Hand)
- {
- return;
- }
- trackedHands.Add(state.source.id);
- }
- private void InteractionManager_SourceLost(InteractionSourceState state)
- {
- // Check to see that the source is a hand.
- if (state.source.kind != InteractionSourceKind.Hand)
- {
- return;
- }
- if (trackedHands.Contains(state.source.id))
- {
- trackedHands.Remove(state.source.id);
- }
- FocusedGameObject = null;
- }
- //手势释放时,将被关注的物体置空
- private void InteractionManager_SourceReleased(InteractionSourceState state)
- {
- FocusedGameObject = null;
- }
- //识别到手指按下时,将凝视射线关注的物体置为当前手势操作的对象
- private void InteractionManager_SourcePressed(InteractionSourceState state)
- {
- if (GazeManager.Instance.FocusedObject != null)
- {
- FocusedGameObject = GazeManager.Instance.FocusedObject;
- }
- }
- void OnDestroy()
- {
- InteractionManager.SourceDetected -= InteractionManager_SourceDetected;
- InteractionManager.SourceLost -= InteractionManager_SourceLost;
- InteractionManager.SourceReleased -= InteractionManager_SourceReleased;
- InteractionManager.SourcePressed -= InteractionManager_SourcePressed;
- }
- }
- }
2、修改GestureManager.cs,订阅Manipulation gesture事件
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Licensed under the MIT License. See LICENSE in the project root for license information.
- using System;
- using UnityEngine;
- using UnityEngine.VR.WSA.Input;
- namespace HoloToolkit.Unity
- {
- /// <summary>
- /// GestureManager creates a gesture recognizer and signs up for a tap gesture.
- /// When a tap gesture is detected, GestureManager uses GazeManager to find the game object.
- /// GestureManager then sends a message to that game object.
- /// </summary>
- [RequireComponent(typeof(GazeManager))]
- public partial class GestureManager : Singleton<GestureManager>
- {
- /// <summary>
- /// Key to press in the editor to select the currently gazed hologram
- /// </summary>
- public KeyCode EditorSelectKey = KeyCode.Space;
- /// <summary>
- /// To select even when a hologram is not being gazed at,
- /// set the override focused object.
- /// If its null, then the gazed at object will be selected.
- /// </summary>
- public GameObject OverrideFocusedObject
- {
- get; set;
- }
- public bool IsManipulating { get; private set; }
- public Vector3 ManipulationPosition { get; private set; }
- /// <summary>
- /// Gets the currently focused object, or null if none.
- /// </summary>
- public GameObject FocusedObject
- {
- get { return focusedObject; }
- }
- private GestureRecognizer gestureRecognizer;
- private GameObject focusedObject;
- void Start()
- {
- // Create a new GestureRecognizer. Sign up for tapped events.
- gestureRecognizer = new GestureRecognizer();
- gestureRecognizer.SetRecognizableGestures(GestureSettings.Tap
- | GestureSettings.DoubleTap
- | GestureSettings.ManipulationTranslate);
- gestureRecognizer.TappedEvent += GestureRecognizer_TappedEvent;
- //订阅Manipulation gesture事件
- gestureRecognizer.ManipulationStartedEvent += GestureRecognizer_ManipulationStartedEvent;
- gestureRecognizer.ManipulationUpdatedEvent += GestureRecognizer_ManipulationUpdatedEvent;
- gestureRecognizer.ManipulationCompletedEvent += GestureRecognizer_ManipulationCompletedEvent;
- gestureRecognizer.ManipulationCanceledEvent += GestureRecognizer_ManipulationCanceledEvent;
- // Start looking for gestures.
- gestureRecognizer.StartCapturingGestures();
- }
- private void GestureRecognizer_ManipulationStartedEvent(InteractionSourceKind source, Vector3 cumulativeDelta, Ray headRay)
- {
- //当被关注的对象非空时,设置初始位置
- if (HandsManager.Instance.FocusedGameObject != null)
- {
- IsManipulating = true;
- ManipulationPosition = cumulativeDelta;
- HandsManager.Instance.FocusedGameObject.SendMessageUpwards("PerformManipulationStart", cumulativeDelta);
- }
- }
- private void GestureRecognizer_ManipulationUpdatedEvent(InteractionSourceKind source, Vector3 cumulativeDelta, Ray headRay)
- {
- //当被关注的对象非空时,更新新的位置
- if (HandsManager.Instance.FocusedGameObject != null)
- {
- IsManipulating = true;
- ManipulationPosition = cumulativeDelta;
- HandsManager.Instance.FocusedGameObject.SendMessageUpwards("PerformManipulationUpdate", cumulativeDelta);
- }
- }
- private void GestureRecognizer_ManipulationCompletedEvent(InteractionSourceKind source, Vector3 cumulativeDelta, Ray headRay)
- {
- IsManipulating = false;
- }
- private void GestureRecognizer_ManipulationCanceledEvent(InteractionSourceKind source, Vector3 cumulativeDelta, Ray headRay)
- {
- IsManipulating = false;
- }
- private void OnTap()
- {
- if (focusedObject != null)
- {
- focusedObject.SendMessage("OnTap");
- }
- }
- private void OnDoubleTap()
- {
- if (focusedObject != null)
- {
- focusedObject.SendMessage("OnDoubleTap");
- }
- }
- private void GestureRecognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay)
- {
- if (tapCount == )
- {
- OnTap();
- }
- else
- {
- OnDoubleTap();
- }
- }
- void LateUpdate()
- {
- GameObject oldFocusedObject = focusedObject;
- if (GazeManager.Instance.Hit &&
- OverrideFocusedObject == null &&
- GazeManager.Instance.HitInfo.collider != null)
- {
- // If gaze hits a hologram, set the focused object to that game object.
- // Also if the caller has not decided to override the focused object.
- focusedObject = GazeManager.Instance.HitInfo.collider.gameObject;
- }
- else
- {
- // If our gaze doesn't hit a hologram, set the focused object to null or override focused object.
- focusedObject = OverrideFocusedObject;
- }
- //if (focusedObject != oldFocusedObject)
- //{
- // // If the currently focused object doesn't match the old focused object, cancel the current gesture.
- // // Start looking for new gestures. This is to prevent applying gestures from one hologram to another.
- // gestureRecognizer.CancelGestures();
- // gestureRecognizer.StartCapturingGestures();
- //}
- }
- void OnDestroy()
- {
- gestureRecognizer.StopCapturingGestures();
- //取消订阅
- gestureRecognizer.TappedEvent -= GestureRecognizer_TappedEvent;
- gestureRecognizer.ManipulationStartedEvent -= GestureRecognizer_ManipulationStartedEvent;
- gestureRecognizer.ManipulationUpdatedEvent -= GestureRecognizer_ManipulationUpdatedEvent;
- gestureRecognizer.ManipulationCompletedEvent -= GestureRecognizer_ManipulationCompletedEvent;
- gestureRecognizer.ManipulationCanceledEvent -= GestureRecognizer_ManipulationCanceledEvent;
- }
- }
- }
3、添加ManipulationTranslate脚本,计算相对位移,然后进行更新物体的新的位置。
- using UnityEngine;
- using System.Collections;
- using HoloToolkit.Unity;
- public class ManipulationTranslate: MonoBehaviour {
- private Vector3 manipulationPreviousPosition;
- // Use this for initialization
- void Start () {
- }
- // Update is called once per frame
- void Update () {
- }
- void PerformManipulationStart(Vector3 position)
- {
- //设置初始位置
- manipulationPreviousPosition = position;
- }
- void PerformManipulationUpdate(Vector3 position)
- {
- if (GestureManager.Instance.IsManipulating)
- {
- //计算相对位移,然后更新物体的位置
- Vector3 moveVector = Vector3.zero;
- moveVector = position - manipulationPreviousPosition;
- manipulationPreviousPosition = position;
- transform.position += 2f * moveVector;
- }
- }
4、运行测试
将凝视射线投射到对象上,举起右手使食指和拇指碰触在一起,然后进行左右移动,可以看到物体的位置将移动。
Hololens开发笔记之Gesture手势识别(Manipulation手势控制物体平移)的更多相关文章
- Hololens开发笔记之Gesture手势识别(手势检测反馈)
本文实现当使用者手出现在Hololens视野范围内时,跟踪手并给出反馈的效果. 1.在Manager上添加HandsManager脚本组件,用于追踪识别手 HandsManager.cs如下(直接使用 ...
- Hololens开发笔记之Gesture手势识别(Manipulation手势控制物体旋转)
Manipulation gesture:保持点击手势,在3D世界中绝对运动 当你想要全息图像1:1响应用户手部移动时,操纵手势能被用于移动.缩放或旋转全息图像.如此的一个用处是使得用户可以在世界中绘 ...
- Hololens开发笔记之Gesture手势识别(单击,双击)
本文使用手势识别实现识别单击及双击手势的功能,当单击Cube时改变颜色为蓝色,当双击Cube时改变颜色为绿色. 手势识别是HoloLens交互的重要输入方法之一.HoloLens提供了底层API和高层 ...
- Hololens开发笔记之Gesture手势识别(基本介绍)
手势识别是HoloLens交互的重要输入方法之一.HoloLens提供了底层API和高层API,可以满足不同的手势定制需求.底层API能够获取手的位置和速度信息,高层API则借助手势识别器来识别预设的 ...
- HoloLens开发笔记之Gesture input手势输入
手势是HoloLens三个首要输入形式之一.一旦你使用凝视定位了一个全息图像,手势允许你与它交互.手势输入允许你使用手或者点击器原生地与全息图像交互. 手势之外,你也可以在应用中使用语音输入来交互. ...
- Hololens开发笔记之使用Unity开发一个简单的应用
一.Hololens概述 Hololens有以下特性 1.空间映射借助微软特殊定制的全息处理单元(HPU),HoloLens 实现了对周边环境的快速扫描和空间匹配.这保证了 HoloLens能够准确地 ...
- Hololens开发笔记之连接PC实现资源共享
官网原文介绍:https://developer.microsoft.com/en-us/windows/holographic/using_the_windows_device_portal Hol ...
- Hololens开发笔记:UDP接收数据
Hololens的应用需要与其他设备通信的时候,UDP是比较方便的一种方式,Unity3d 2017.3 C#开发的时候可以用Windows.Networking.Sockets.DatagramSo ...
- Hololens开发笔记之Gaze凝视射线
凝视是HoloLens首要输入方式,形式功能类似于桌面系统的光标,用于选择操作全息对象.然而在Unity中并没有明确的Gaze API或者组件. 概念上来说,Gaze是通过用户头部两眼之间发出一条向前 ...
随机推荐
- Win10/UWP开发-Ink墨迹书写
在UWP开发中,微软提供了一个新型的InkCanvas控件用来让用户能书写墨迹,在新版的Edga浏览器中微软自己也用到了该控件使用户很方便的可以在web上做笔记. InkCanvas控件使用很简单,从 ...
- 传智播客JavaWeb day11--事务的概念、事务的ACID、数据库锁机制、
1. 什么叫做事务? 2.默认情况下每一条sql语句都是一个事务,然后自动提交事务 ps:如果想多条语句占一个事务,则可以手动设置SetAutoCommit为false 3.关键字 start tr ...
- Linux系统下远程文件拷贝scp命令
在Linux系统下,不同机器上实现文件拷贝 一.将本地文件拷贝到远程机器: scp /home/administrator/news.txt root@192.168.6.129:/etc/squid ...
- 必须掌握的八个cmd 命令
一,ping 它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它 所利用的原理是这样的:网络上的机器都有唯一确定的I ...
- declaration is incompatible with "__nounwind __interwork __softfp unsigned long __get_PSP(void)" IAR 编译报故障
原因是以前的CMSIS CORTEX-CM0 文件太老了. 使用新文件就可以.
- DotNetBar 第1课,设置整体窗口样式
1. 先引用 DevComponents.DotNetBar2.dll 2. 窗口继承 Office2007Form public partial class Form1 : Office2007Fo ...
- 论文ei,sci检索,JCR-SCI分区,中科院分区连接
https://jcr.incites.thomsonreuters.com/JCRJournalHomeAction.action?SID=B1-bQgax2FJ7EsyZ9muP6O5loc77S ...
- 【海洋女神原创】知识普及:IS版本命名规则和高低关系
经常有朋友对IS的版本命名不甚了解,有时候在交流的时候就会造成误会,在这里做一下普及. IS最早出名的版本是IS6.22,这是个非常古老的版本的,但是在IS历史上有不可磨灭的贡献. 之后很长一段时间内 ...
- linux sed和awk的区别
awkawk是一种程序语言,对文档资料的处理具有很强的功能.awk擅长从格式化报文或从一个大的文本文件中抽取数据.awk的命令格式为:awk [-F filed-separator] “command ...
- NSCharacterSet在字符串操作中得使用
NSCharacterSet以及它的可变版本NSMutableCharacterSet,用面向对象的方式表示一组Unicode字符,它经常与NSString及NSScanner组合起来使用,在不同的字 ...