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组件挂载到新建的物体上就可以了

相关文章:
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.EyeTrackin…...
接口自动化测试 —— 协议、请求流程
一、架构 CRM客户关系管理系统 SAAS Software As A Service 软件即服务 PAAS Platform AS A Service 平台即服务 快速交付→ 快:自己去干、有结果、事事有回音、持续改进 单体架构——》垂直架构——》面向服务架构——》微服务架构(分布式…...
JDK安装详细教程
JDK安装详细教程 国内大多数使用的是1.8的版本,对于初学者来说这个版本很友善,不过由于我安装过了1.8,所以我这里演示JDK21 的安装,过程并无区别,只在下载时注意选择1.8版本。1.8就是JDK8. 文章目录 JDK安装详细教程一…...
vulnhub_Fowsniff靶机渗透测试
Fowsniff靶机 靶机地址:https://www.vulnhub.com/entry/fowsniff-1,262/ 文章目录 Fowsniff靶机信息收集web渗透密码碰撞POP3邮件服务器渗透获取权限权限提升靶机总结 信息收集 通过nmap扫描,靶机开放22 80 110 143端口,110是pop3邮件服务…...
FPGA面试题(3)
一.FPGA和CPLD区别 FPGA:现场可编程门阵列CPLD:复杂可编程逻辑器件 二.多位异步信号如何同步 单比特异步信号 慢时钟域->快时钟域:同步打拍快时钟域->慢时钟域:先拓展位宽再同步打拍 多比特异步信号 1.异步FIFO2.保持…...
Avalonia常用小控件Menu
1.项目下载地址:https://gitee.com/confusedkitten/avalonia-demo 2.UI库Semi.Avalonia,项目地址 https://github.com/irihitech/Semi.Avalonia 样式预览: axaml代码 : <UserControl xmlns"https://github.com/avalo…...
steam游戏服务器如何选择
steam游戏平台现在在国内市场很吃香,当我们自己开发的游戏想要上架steam我们需要准备什么,在选择服务器的时候我们又需要考虑哪些因素呢,该怎样选择一款适合自己游戏的服务器是很关键的。 Steam专用服务器通常是指由游戏开发商提供的服务器&…...
电脑技巧:推荐一款桌面整理神器TidyTabs
目录 1、软件简介 2、软件功能介绍 3、总结 1、软件简介 TidyTabs是一款Windows应用程序,它可以将多个打开的窗口整理成一个选项卡式的界面,使得用户可以更加方便地切换和管理不同的窗口。 TidyTabs可以将多个窗口整合到一个主窗口中,类似…...
git合并分支-IDEA
有1个主分支,我从主分支拉取过来了,数据然后改好了,现在想合并到主分支上,并且将主分支的内容更新到我的分支下。用git怎么操作? 1.将主分支(master)的内容合并到我的分支(master-shi)中 在我的分支下执行 git merge master ID…...
winscope使用方法
Ubuntu下Android T的winscope工具使用方法 1. 在Android的项目源码中,prebuilts/misc/common/winscope目录下 直接使用chrome浏览器打开文件winscope.html 2. 可能会提示adb问题 进入目录development/tools/winscope/adb_proxy,有文件winscope_proxy.…...
获取西华大学新闻网站信息(爬虫样例)
利用python的爬虫功能进行信息爬取,关键在于源码分析,代码相对简单。 1 源代码分析 访问网站,按下F12,进行元素查找分析。 2 代码实现 from requests import get from bs4 import BeautifulSoupdef getXhuNews(pageNum1):&qu…...
【Linux】https协议
文章目录 📖 前言1. 引入https协议2. 常见的加密方式2.1 对称加密:2.2 非对称加密:2.3 数据摘要&&数据指纹: 3. 对加密方式的探究3.1 只使用对称加密:3.2 只使用非对称加密:3.3 双方都使用非对称加…...
基于工业5G网关的工业机器人监测控制方案
随着智能制造、自动化生产的发展进步,工业机器人的身影越来越多地出现在工厂现场,成为新型无人化、智能化生产制造的中坚力量。 工业机器人的运行伴生着海量的数据采集、传输、分析和反馈执行,因此也需要高速、低延迟的5G网络,支撑…...
[Machine learning][Part4] 线性回归模型技巧
目录 正规方程法 梯度下降法 缩放特征 学习率选择 正规方程法 这种方法可以不多次迭代梯度下降函数就能得到w,b。但是缺点是在大量数据训练情况下效率较低,其次是这种算法仅仅在线性回归中实现了,并没有在其他模型中实现,因此,…...
产品经理进阶:如何写商业计划书?
目录 简介 确定目标 确定目标市场 竞争分析 CSDN学院 作者简介 简介 很多时候,我们缺乏的并不是创意。 因为任何人都可能会萌发出一个好的创意。 但是,将想法变成可行的业务就完全是另一码事了。 你可能会认为你自己已经做好充分准备࿰…...
Excel 规范录入数据
文章目录 录入日期录入百分比 快捷键: tab:向右切换单元格 enter:向下切换行 shift tab:向左切换单元格 shiftenter:向上切换行 录入日期 输入今天的日期的快捷键:Ctrl ; 输入当时的时间的快捷键&a…...
使用IDEA自带功能将WSDL转java
好像IDEA2018版本之后不再支持webservice转java,可以下载2018.3.6版本的IDEA(直接IDEA官网下载即可),然后打开一个项目,在根目录处单击右键 选择Generate Java Code From Wsdl..., 选择OK,即可…...
Vue + moment 实现自定义日历
moment moment是一个js工具库,这个库中封装的是日期时间的方法,功能很全面。可以去moment官网看看,它的中文文档介绍的也很详细,主要是看一下方法的使用。附上官网地址:添加链接描述 日历案例 日历的逻辑:…...
【斗罗2】天梦哥抓捕冰帝,霍雨浩与她完美融合,喜提五挂
Hello,小伙伴们,我是小郑继续为大家深度解析斗罗大陆2绝世唐门。 斗罗大陆动画第二部绝世唐门第19集预告终于更新了,看到公布时间,大半夜才发布,着实不过瘾。不过剧情相当炸裂,天梦哥与冰帝对峙,造神计划正…...
上个月Balada Injector攻击中有超过17,000个WordPress网站被黑
导语 最近,一场名为Balada Injector的攻击活动引起了广泛关注。这次攻击以WordPress网站为目标,据统计,有超过17,000个网站受到了感染。在本文中,我们将详细介绍这次攻击的概述、攻击手段以及如何保护自己的网站。 攻击概述 Balad…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
