当前位置: 首页 > news >正文

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 平台即服务 快速交付→ 快&#xff1a;自己去干、有结果、事事有回音、持续改进 单体架构——》垂直架构——》面向服务架构——》微服务架构&#xff08;分布式&#xf…...

JDK安装详细教程

JDK安装详细教程 国内大多数使用的是1.8的版本&#xff0c;对于初学者来说这个版本很友善&#xff0c;不过由于我安装过了1.8&#xff0c;所以我这里演示JDK21 的安装&#xff0c;过程并无区别&#xff0c;只在下载时注意选择1.8版本。1.8就是JDK8. 文章目录 JDK安装详细教程一…...

vulnhub_Fowsniff靶机渗透测试

Fowsniff靶机 靶机地址&#xff1a;https://www.vulnhub.com/entry/fowsniff-1,262/ 文章目录 Fowsniff靶机信息收集web渗透密码碰撞POP3邮件服务器渗透获取权限权限提升靶机总结 信息收集 通过nmap扫描&#xff0c;靶机开放22 80 110 143端口&#xff0c;110是pop3邮件服务…...

FPGA面试题(3)

一.FPGA和CPLD区别 FPGA&#xff1a;现场可编程门阵列CPLD&#xff1a;复杂可编程逻辑器件 二.多位异步信号如何同步 单比特异步信号 慢时钟域->快时钟域&#xff1a;同步打拍快时钟域->慢时钟域&#xff1a;先拓展位宽再同步打拍 多比特异步信号 1.异步FIFO2.保持…...

Avalonia常用小控件Menu

1.项目下载地址&#xff1a;https://gitee.com/confusedkitten/avalonia-demo 2.UI库Semi.Avalonia&#xff0c;项目地址 https://github.com/irihitech/Semi.Avalonia 样式预览&#xff1a; axaml代码 &#xff1a; <UserControl xmlns"https://github.com/avalo…...

steam游戏服务器如何选择

steam游戏平台现在在国内市场很吃香&#xff0c;当我们自己开发的游戏想要上架steam我们需要准备什么&#xff0c;在选择服务器的时候我们又需要考虑哪些因素呢&#xff0c;该怎样选择一款适合自己游戏的服务器是很关键的。 Steam专用服务器通常是指由游戏开发商提供的服务器&…...

电脑技巧:推荐一款桌面整理神器TidyTabs

目录 1、软件简介 2、软件功能介绍 3、总结 1、软件简介 TidyTabs是一款Windows应用程序&#xff0c;它可以将多个打开的窗口整理成一个选项卡式的界面&#xff0c;使得用户可以更加方便地切换和管理不同的窗口。 TidyTabs可以将多个窗口整合到一个主窗口中&#xff0c;类似…...

git合并分支-IDEA

有1个主分支&#xff0c;我从主分支拉取过来了&#xff0c;数据然后改好了&#xff0c;现在想合并到主分支上&#xff0c;并且将主分支的内容更新到我的分支下。用git怎么操作? 1.将主分支(master)的内容合并到我的分支(master-shi)中 在我的分支下执行 git merge master ID…...

winscope使用方法

Ubuntu下Android T的winscope工具使用方法 1. 在Android的项目源码中&#xff0c;prebuilts/misc/common/winscope目录下 直接使用chrome浏览器打开文件winscope.html 2. 可能会提示adb问题 进入目录development/tools/winscope/adb_proxy&#xff0c;有文件winscope_proxy.…...

获取西华大学新闻网站信息(爬虫样例)

利用python的爬虫功能进行信息爬取&#xff0c;关键在于源码分析&#xff0c;代码相对简单。 1 源代码分析 访问网站&#xff0c;按下F12&#xff0c;进行元素查找分析。 2 代码实现 from requests import get from bs4 import BeautifulSoupdef getXhuNews(pageNum1):&qu…...

【Linux】https协议

文章目录 &#x1f4d6; 前言1. 引入https协议2. 常见的加密方式2.1 对称加密&#xff1a;2.2 非对称加密&#xff1a;2.3 数据摘要&&数据指纹&#xff1a; 3. 对加密方式的探究3.1 只使用对称加密&#xff1a;3.2 只使用非对称加密&#xff1a;3.3 双方都使用非对称加…...

基于工业5G网关的工业机器人监测控制方案

随着智能制造、自动化生产的发展进步&#xff0c;工业机器人的身影越来越多地出现在工厂现场&#xff0c;成为新型无人化、智能化生产制造的中坚力量。 工业机器人的运行伴生着海量的数据采集、传输、分析和反馈执行&#xff0c;因此也需要高速、低延迟的5G网络&#xff0c;支撑…...

[Machine learning][Part4] 线性回归模型技巧

目录 正规方程法 梯度下降法 缩放特征 学习率选择 正规方程法 这种方法可以不多次迭代梯度下降函数就能得到w,b。但是缺点是在大量数据训练情况下效率较低&#xff0c;其次是这种算法仅仅在线性回归中实现了&#xff0c;并没有在其他模型中实现&#xff0c;因此&#xff0c…...

产品经理进阶:如何写商业计划书?

目录 简介 确定目标 确定目标市场 竞争分析 CSDN学院 作者简介 简介 很多时候&#xff0c;我们缺乏的并不是创意。 因为任何人都可能会萌发出一个好的创意。 但是&#xff0c;将想法变成可行的业务就完全是另一码事了。 你可能会认为你自己已经做好充分准备&#xff0…...

Excel 规范录入数据

文章目录 录入日期录入百分比 快捷键&#xff1a; tab&#xff1a;向右切换单元格 enter&#xff1a;向下切换行 shift tab&#xff1a;向左切换单元格 shiftenter&#xff1a;向上切换行 录入日期 输入今天的日期的快捷键&#xff1a;Ctrl ; 输入当时的时间的快捷键&a…...

使用IDEA自带功能将WSDL转java

好像IDEA2018版本之后不再支持webservice转java&#xff0c;可以下载2018.3.6版本的IDEA&#xff08;直接IDEA官网下载即可&#xff09;&#xff0c;然后打开一个项目&#xff0c;在根目录处单击右键 选择Generate Java Code From Wsdl...&#xff0c; 选择OK&#xff0c;即可…...

Vue + moment 实现自定义日历

moment moment是一个js工具库&#xff0c;这个库中封装的是日期时间的方法&#xff0c;功能很全面。可以去moment官网看看&#xff0c;它的中文文档介绍的也很详细&#xff0c;主要是看一下方法的使用。附上官网地址&#xff1a;添加链接描述 日历案例 日历的逻辑&#xff1a;…...

【斗罗2】天梦哥抓捕冰帝,霍雨浩与她完美融合,喜提五挂

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析斗罗大陆2绝世唐门。 斗罗大陆动画第二部绝世唐门第19集预告终于更新了&#xff0c;看到公布时间&#xff0c;大半夜才发布&#xff0c;着实不过瘾。不过剧情相当炸裂&#xff0c;天梦哥与冰帝对峙&#xff0c;造神计划正…...

上个月Balada Injector攻击中有超过17,000个WordPress网站被黑

导语 最近&#xff0c;一场名为Balada Injector的攻击活动引起了广泛关注。这次攻击以WordPress网站为目标&#xff0c;据统计&#xff0c;有超过17,000个网站受到了感染。在本文中&#xff0c;我们将详细介绍这次攻击的概述、攻击手段以及如何保护自己的网站。 攻击概述 Balad…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...