Unity MRTK Hololens2眼动交互

/** ==================================================================================================================** UnityVersion : 2021.3.6f1* Description : 眼部交互基类* Author: * CreateTime : 2023-10-11  09:43:20* Version : V1.0.0* * ==================================================================================================================*/using System.Collections.Generic;
using Microsoft.MixedReality.Toolkit.Input;
using UnityEngine;namespace MRTKExtend.EyeTracking
{[RequireComponent(typeof(Collider))]public abstract class BaseFocus : MonoBehaviour, IMixedRealityFocusHandler, IMixedRealityFocusChangedHandler{[SerializeField] [Tooltip("是否启用焦点?")] private bool focusEnabled = true;/// <summary>/// 是否为启用了焦点/// </summary>public virtual bool FocusEnabled{get => focusEnabled;set => focusEnabled = value;}/// <summary>/// 此对象当前是否有焦点/// </summary>public virtual bool HasFocus => FocusEnabled && Focusers.Count > 0;/// <summary>/// 当前聚焦此对象的列表/// </summary>public List<IMixedRealityPointer> Focusers { get; } = new(0);/// <summary>/// 焦点进入/// </summary>public virtual void OnFocusEnter(FocusEventData eventData){}/// <summary>/// 焦点退出/// </summary>public virtual void OnFocusExit(FocusEventData eventData){}public virtual void OnBeforeFocusChange(FocusEventData eventData){//如果是新的目标对象,将指针添加到焦点列表。if (eventData.NewFocusedObject == gameObject){eventData.Pointer.FocusTarget = this;Focusers.Add(eventData.Pointer);}//如果是旧的聚焦目标对象,从列表中删除指针。else if (eventData.OldFocusedObject == gameObject){Focusers.Remove(eventData.Pointer);//如果没有新的焦点目标,从指针中清除焦点目标。if (eventData.NewFocusedObject == null){eventData.Pointer.FocusTarget = null;}}}public virtual void OnFocusChanged(FocusEventData eventData){}}
}
/** ==================================================================================================================** UnityVersion : 2021.3.6f1* Description : 眼部交互* Author: * CreateTime : 2023-10-11  09:21:40* Version : V1.0.0* * ==================================================================================================================*/using System;
using Microsoft.MixedReality.Toolkit.Input;
using UnityEngine;namespace MRTKExtend.EyeTracking
{public abstract class BaseEyeFocus : BaseFocus{[Tooltip("可配置的持续时间,用于在用户查注释目标的时间超过此持续时间时触发事件。")] [SerializeField] [Range(0, 20)]private float timeToTriggerDwellInSec = 5;/// <summary>/// 停留时间/// </summary>private DateTime _dwellTimer;/// <summary>/// 是否持续注视/// </summary>private bool _isDwelling = false;/// <summary>/// 是否注视/// </summary>private bool _hadFocus = false;/// <summary>/// 处理光标进入目标时的突出显示目标。/// </summary>protected virtual void Update(){if (!HasFocus && _hadFocus){OnEyeFocusStop();_isDwelling = false;_hadFocus = false;}else if (HasFocus){if (!_hadFocus){OnEyeFocusStart();_dwellTimer = DateTime.UtcNow;_hadFocus = true;}else{OnEyeFocusStay();if (!_isDwelling && (DateTime.UtcNow - _dwellTimer).TotalSeconds > timeToTriggerDwellInSec){OnEyeFocusDwell();_isDwelling = true;}}}}/// <inheritdoc />public override void OnBeforeFocusChange(FocusEventData eventData){//如果注视新的目标对象,将指针添加到焦点列表。if (eventData.NewFocusedObject == gameObject &&eventData.Pointer.InputSourceParent.SourceType == InputSourceType.Eyes){eventData.Pointer.FocusTarget = this;Focusers.Add(eventData.Pointer);}//如果注视是旧的聚焦目标对象,从列表中删除指针。else if (eventData.OldFocusedObject == gameObject){Focusers.Remove(eventData.Pointer);// 如果没有新目标,从指针中清除焦点目标if (eventData.NewFocusedObject == null){eventData.Pointer.FocusTarget = null;}}}/// <summary>///一旦眼睛凝视射线开始与该目标的碰撞体接触,就会触发。/// </summary>protected virtual void OnEyeFocusStart(){}/// <summary>/// 在眼睛凝视射线与该目标的碰撞体持续接触时触发。/// </summary>protected virtual void OnEyeFocusStay(){}/// <summary>///一旦眼睛凝视射线停止与该目标的碰撞体,就会触发。/// </summary>protected virtual void OnEyeFocusStop(){}/// <summary>/// 一旦眼睛凝视射线与该目标的碰撞体接触指定时间后触发。/// </summary>protected virtual void OnEyeFocusDwell(){}}
}
/** ==================================================================================================================** UnityVersion : 2021.3.6f1* Description : 功能描述* Author: * CreateTime : 2023-10-10  16:09:27* Version : V1.0.0* * ==================================================================================================================*/using MRTKExtend.EyeTracking;
using UnityEngine;public class EyeTrackingTest : BaseEyeFocus
{protected override void OnEyeFocusStay(){Debug.Log("OnEyeFocusStay");//todo somethingRotateHitTarget();}protected override void OnEyeFocusStart(){Debug.Log("OnEyeFocusStart");//todo something}protected override void OnEyeFocusStop(){Debug.Log("OnEyeFocusStop");//todo something}protected override void OnEyeFocusDwell(){Debug.Log("OnEyeFocusDwell");//todo something}private void RotateHitTarget(){transform.localEulerAngles += new Vector3(0, 0.1f, 0);}
}

在场景中新建一个物体,将EyeTrackingTest组件挂载到新建的物体上就可以了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/156590.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flask vue跨域问题

问题&#xff1a; 调试时候跨域访问报&#xff1a; Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response. 解决办法&#xff1a; 安装flask_cros from flask_cors import CORS CORS(app) app.after_request def a…

探索乡村新风貌:VR全景记录乡村发展,助力乡村振兴

引言&#xff1a; 中国乡村正经历着巨大变革&#xff0c;长期以来&#xff0c;乡村地区一直面临着人口外流、资源匮乏等问题。然而&#xff0c;近年来&#xff0c;政府的政策支持以及新兴技术的崭露头角&#xff0c;如虚拟现实&#xff08;VR&#xff09;全景记录&#xff0c;…

22字符串-简单反转

目录 BM&#xff08;Boyer-Moore&#xff09; 坏字符 好后缀 什么情况用哪个规则&#xff1f; LeetCode之路——151. 反转字符串中的单词 分析: 字符串匹配中除了简单的BF&#xff08;Brute Force&#xff09;、RK&#xff08;Rabin-Karp&#xff09;算法&#xff0c;还有…

PPO算法逐行代码详解

前言&#xff1a;本文会从理论部分、代码部分、实践部分三方面进行PPO算法的介绍。其中理论部分会介绍PPO算法的推导流程&#xff0c;代码部分会给出PPO算法的各部分的代码以及简略介绍&#xff0c;实践部分则会通过debug代码调试的方式从头到尾的带大家看清楚应用PPO算法在car…

iMazing2023免费版苹果iPhone手机备份应用软件

iMazing是一款功能强大的苹果手机备份软件&#xff0c;它可通过备份功能将通讯录备份到电脑上&#xff0c;并在电脑端iMazing“通讯录”功能中随时查看和导出联系人信息。它自带Wi-Fi自动备份功能&#xff0c;能够保证通讯录备份数据是一直在动态更新的&#xff0c;防止手机中新…

webdriver.Chrome()没反应

今天学习爬虫安装selenium之后刚开始webdriver.Chrome()正常 后面运行突然卡在这一步了 百度发现是版本不匹配 我们下载旧版本的chrome Download Google Chrome 95.0.4638.69 for Windows - Filehippo.com 禁用chrome的自动更新 打开文件所在位置 点击Google文件夹 右键up…

HDLbits: Lemmings3

Lemmings又多了一种状态&#xff1a;dig&#xff0c;我按照上一篇文章里大神的思路又多加了两种状态&#xff1a;LEFT_DIGGING与RIGHT_DIGGING&#xff0c;写出了如下的代码&#xff1a; module top_module(input clk,input areset, // Freshly brainwashed Lemmings walk …

【Java 进阶篇】JavaScript 与 HTML 的结合方式

JavaScript是一种广泛应用于Web开发中的脚本语言&#xff0c;它与HTML&#xff08;Hypertext Markup Language&#xff09;结合使用&#xff0c;使开发人员能够创建交互式和动态的网页。在这篇博客中&#xff0c;我们将深入探讨JavaScript与HTML的结合方式&#xff0c;包括如何…

图像滤波总结

中值滤波器 中值滤波器是一种常用的非线性滤波器&#xff0c;其基本原理是&#xff1a;选择待处理像素的一个邻域中各像素值的中值来代替待处理的像素。主要功能使某像素的灰度值与周围领域内的像素比较接近&#xff0c;从而消除一些孤立的噪声点&#xff0c;所以中值滤波器能够…

超美!ChatGPT DALL-E 3已可用,另外GPT-4可上传图片进行问答

今天&#xff0c;在ChatGPT里使用DALL-E 3的功能终于上线了。以下是截图&#xff1a; 在GPT-4下加了一个菜单入口&#xff0c;名为 DALL-E 3&#xff0c;这也意味着ChatGPT免费账户暂时不能使用这个功能。 我们体验一下这个功能。 技术交流 建了技术交流群&#xff01;想要进…

解决echarts配置滚动(dataZoom)后导出图片数据不全问题

先展现一个echarts&#xff0c;并配置dataZoom&#xff0c;每页最多10条数据&#xff0c;超出滚动 <div class"echartsBox" id"echartsBox"></div>onMounted(() > {nextTick(() > {var chartDom document.getElementById(echartsBox);…

如何在雷电模拟器上安装Magisk并加载movecert模块抓https包(二)

接来下在PC端安装和配置Charles&#xff0c;方法同下面链接&#xff0c;不再赘述。在模拟器上安装magisk实现Charles抓https包&#xff08;二&#xff09;_小小爬虾的博客-CSDN博客 一、记录下本机IP和代理端口 二、在手机模拟器上设置代理192.168.31.71:8888&#xff0c;设置…

接口自动化测试_L1

目录&#xff1a; 接口自动化测试框架介绍 接口测试场景自动化测试场景接口测试在分层测试中的位置接口自动化测试与 Web/App 自动化测试对比接口自动化测试与 Web/App 自动化测试对比接口测试工具类型为什么推荐 RequestsRequests 优势Requests 环境准备接口请求方法接口请求…

LeetCode【118】杨辉三角

题目&#xff1a; 解析&#xff1a; 该题目解析起来更像是数学推导&#xff0c;找到里面的规律 1、第n行有n个元素 2、第i行第j个元素&#xff0c;为第i-1行&#xff0c;j-1个元素和j个元素的和 3、每行第一个&#xff0c;最后一个元素是1 代码&#xff1a; public List<…

Docker 的数据管理和网络通信

目录 Docker 的数据管理 管理 Docker 容器中数据的方式 端口映射 容器互联&#xff08;使用centos镜像&#xff09; Docker 镜像的创建 Dockerfile 操作常用的指令 编写 Dockerfile 时格式 Dockerfile 案例 Docker 的数据管理 管理 Docker 容器中数据的方式 管理 Doc…

STM32使用HAL库驱动DS3231

1、STM32通讯口配置 启动IIC&#xff0c;默认配置即可。 2、头文件 #ifndef __DS3231_H #define __DS3231_H#include "main.h"#define DS3231_COM_PORT hi2c1 /*通讯端口*//**************************** defines *******************************/ #define DS3231…

cocos2d-x C++与Lua交互

Cocos版本&#xff1a; 3.10 Lua版本&#xff1a; 5.1.4 环境&#xff1a; window Visual Studio 2013 Lua Lua作为一种脚本语言&#xff0c; 它的运行需要有宿主的存在&#xff0c;通过Lua虚拟栈进行数据交互。 它的底层实现是C语言&#xff0c;C语言封装了很多的API接口&a…

ICCV23中的域泛化相关研究

ICCV23中的域泛化相关研究 【OCR】Order-preserving Consistency Regularization for Domain Adaptation and Generalization【iDAG】iDAG: Invariant DAG Searching for Domain Generalization【RIDG】Domain Generalization via Rationale Invariance【3DLabelProp】Domain G…

2023年医药商业行业发展研究报告

第一章 行业概况 1.1 定义 医药商业行业&#xff0c;作为医药领域的重要组成部分&#xff0c;扮演着至关重要的角色。这一行业专注于医药商品的经营与流通&#xff0c;确保药品能够有效、安全地到达消费者手中。随着医药科技的进步和市场需求的增长&#xff0c;医药商业行业在…

Android攻城狮学鸿蒙 -- 点击事件

具体参考&#xff1a;华为官网学习地址 1、点击事件&#xff0c;界面跳转 对于一个按钮设置点击事件&#xff0c;跳转页面。但是onclick中&#xff0c;如果pages前边加上“/”&#xff0c;就没法跳转。但是开发工具加上“/”才会给出提示。不知道是不是开发工具的bug。&#…