Unity MRTK Hololens2眼动交互

这篇具有很好参考价值的文章主要介绍了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 something
        RotateHitTarget();
    }

    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眼动交互,unity,交互,游戏引擎文章来源地址https://www.toymoban.com/news/detail-721757.html

到了这里,关于Unity MRTK Hololens2眼动交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity Hololens2开发|(十)MRTK3空间操作 ObjectManipulator (对象操控器)

    ObjectManipulator 允许使用任何输入设备或形式直观地操作 3D 空间中的对象。 它执行与 XRI XRGrabInteractable 类似的任务,但提供其他功能以及特定于混合现实的交互。 虽然 XRGrabInteractable 与交互器完全兼容(反之亦然)。 在 MRTK v2 中, ObjectManipulator 本身处理不同类型的输入的大部

    2024年02月05日
    浏览(42)
  • Unity Hololens2开发|(五)MRTK3子系统 KeywordRecognitionSubsystem(关键字识别)

    核心定义包附带有 KeywordRecognitionSubsystem ,它是 MRTKSubsystem 和 IKeywordRecognitionSubsystem 的基本实现,作为负责 MRTK3 中的/短语识别的子系统的基础。 MRTK 附带的具体实现(例如 WindowsKeywordRecognitionSubsystem ),以及你可能构建的其他潜在短语识别子系统,都应该基于此类。

    2024年02月04日
    浏览(38)
  • unity HoloLens2开发,使用Vuforia识别实体 触发交互(二)(有dome)

    提示:文章有错误的地方,还望诸位大神不吝指教! 我使用的utniy 版本:Unity 2021.3.6f1 第一章地址链接: link 第一章记录了一些 安装环境 需要的东西,这章主要章打包和一些BUG问题 以前记录的:链接: link 前提:需要在MRTK工具包中导入到项目。 本人经常使用的方法: 在holo

    2024年02月04日
    浏览(48)
  • Hololens2 MRTK 关闭空间网格、性能面板

    在使用MRTK 创建Unity 工程时, 默认配置是带有空间网格、性能面板,但是有时候这些会干扰我们的全息幻影的视觉效果,因此需要进行屏蔽显示。 第一步,在“Hierarchy”面板选择“MixedReality Toolkit” 默认的MRTK配置是无法更改其内容的,这时候需要点击下图所显示的“Clone”字

    2023年04月08日
    浏览(37)
  • Unity Hololens2开发|(一)环境配置

    Windows10 SDK Microsoft Visual Studio2022 Windows 10/Windows11(专业版或者企业版操作系统 家庭版不行) Unity2021.3.29lts MixedRealityFeatureTool(用于配置MRTK3 Unity 的混合现实工具包) HoloLens 2 仿真器 :(有设备或者初学者不建议安装) 配置开发者模式 Holographic Remoting Player(全息远程处理播放) Visual

    2024年02月04日
    浏览(48)
  • HoloLens 2 丨打包丨MRTK丨Unity丨新手教学

    提示:今日功能介绍 使用 MRTK制作hololens 2的打包流程制作的新手教学。 这里为开发工具介绍 版本并不限制 但是建议超过2018版本 Unity2019.4.18f1 Visual Studio 2019 vs升级步骤 找到Visual Studio Installer 点击修改 后添加我们需要的开发组件 确保我们的图中四个组件有被安装 打开我们的

    2024年02月11日
    浏览(40)
  • 用Unity发布APP到Hololens2无坑教程

    发布前参考设置如下:          

    2024年02月08日
    浏览(35)
  • Hololens2远程音视频通话与AR远程空间标注,基于OpenXR+MRTK3+WebRTC实现

    下面展示一些 内联代码片 。

    2024年04月10日
    浏览(59)
  • Unity Hololens2开发|(四)实时画面电脑预览(2种方法)

    获取Hololens2 IP地址,打开Hololens2的Holographic Remoting Player 可以得到IP。 打开浏览器在搜索栏输入Hololens2 IP地址。如果出现安全问题拒绝访问,点开下面的更多信息然后进入,输入usrname、password。 -依次 查看-混合现实捕获-实时预览 点开即可看到Hololens画面。 如果不成功,请到

    2024年02月04日
    浏览(66)
  • 【Hololens2目标检测】YoloDetectionHoloLens-Unity项目发布记录

    win10专业版 Unity2019.4 VS2017( 一定要用这个版本的VS! ) Hololens2(打开开发者模式) win10 SDK 10.0.19041.0 项目来源:YoloDetectionHoloLens-Unity 这是一个使用Hololens进行目标检测的项目。Hololens端负责采集和显示,电脑端处理图像,并标注,将标注框传回Holo端进行显示。 具体的项目发

    2024年02月09日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包