文章目录

  • 前言
  • 一、unity软件的安装
  • 二、OpenXR与SteamVR插件的安装
  • 三、SRanipaRuntime SDK的安装与使用
    • 读取数据
  • 总结

前言

本文旨在介绍如何使用HTC Vive Pro eye,结合Unity,读取到眼动的数据。假设文章内容面向的是此前从未接触过unity以及刚上手HTC Vive Pro eye的同学(这也是我对自己的个人定位),文章会尽量写的详尽一些,如果阅读内容已经掌握,可以选择跳过。
另外,本文仅对一些不方便搜索得知的内容进行说明,如有疑问可以自行Google或者百度。
最终成果为一个简单的Demo,可以在unity的Log栏中看到输出的信息。如下图所示,右下角的信息栏中可看到读取到的眼动数据。

另外,本文支持转载,转载时请注明作者与出处。希望大家在研究的过程中可以收获到分享与交流的快乐。
如发现错误,请通过评论或是私信的方式批评指正。

感谢b站的大佬邓布利多军,在个人空间中分享过几例测试demo,本文也是在其耐心的指导下完成的。由衷的表示感谢。


一、unity软件的安装

unity的官方网址
选择红框中的“Get Started”

在进入的页面中,以学生身份或是个人身份,进行unity账户的注册(此处略过)。之后运行unity客户端时,需要个人身份验证才可以正常使用。

unity 下载界面

推荐使用unity hub,即unity官方提供的管理平台进行不同版本的客户端的安装。

选择想要下载的unity版本进行下载安装即可(至于安装过程中工具包的具体选择,视个人需要,笔者是在windows平台,所以选择了与windows相关的工具包)。

以下为几点个人在过程中遇到的问题:
1、通常在安装unity各版本的客户端时,由于网络问题,“Document”经常下载失败或是下载进度为零,可以直接选择不进行下载。
2、如要使用其他人的unity项目,请注意版本的问题。通常若两个项目的unity版本不一致,会发生错误。

新建项目时,选择3D项目即可。

二、OpenXR与SteamVR插件的安装

在新建的项目中,选择“window”,在子菜单栏中选择Package Manager

在Unity Registry中选择OpenVR Plugin,点击右下方的install即可。

有两种方式安装SteamVR。一是通过网页
unity store 搜索 steam vr 后的结果,选择红框对应的插件,选择在unity中打开即可。


第二种方法近似,即在菜单栏的windows中选择Assert Store,步骤与一近似。

下载好steamVR插件后, 需要在package manager中的My Asserts中选择进行import。

到这里,基本的工作就已经做好了。
可以在steam VR官方提供的场景中进行交互测试。

三、SRanipaRuntime SDK的安装与使用

HTC Vive 官方提供了SDK
安装网址
两个SDK都需要安装,根据步骤一步一步来即可。

安装好两个SDK后,可以在安装目录中,看到如此的两个文件夹。

在SDK文件夹下存放着说明文档,C、Unity、虚幻环境的demo。

此处提供一个方便查阅SDK 中 各API的网址,也是官方提供的,在下图所示路径下。


而在SRainipal文件夹中,则存放着本次实验的关键应用。具体使用方法请阅读SDK中提供的Eye_SRanipal_SDK_Guide。

在如图所示的路径下,可以找到HTC官方提供的demo package。在unity中选择该package file,进行import。

导入后,可以在Project中看到如图所示红框对应的文件夹ViceSR,选择Scenes中的Eye,双击EyeSample_v2。

之后则可以在Hierarchy中看到如此的结构。

笔者此处在Gaze Ray Sample_v2和Avatar_Fairy_V2组件的Inspector进行了勾选。unity通过红框中的对勾即可以实现各组件的随意添加与移除。

读取数据

在Gaze Ray Sample v2组件中,挂载了当前脚本。

在该脚本中,修改代码,结果为下面所示。
修改后,需要启动SRanipalRuntime,同时启动SteamVR,使得HMD正常运行。点击unity中的play,即可看到最终结果。

//========= Copyright 2018, HTC Corporation. All rights reserved. ===========
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.Assertions;namespace ViveSR
{namespace anipal{namespace Eye{public class SRanipal_GazeRaySample_v2 : MonoBehaviour{public int LengthOfRay = 25;[SerializeField] private LineRenderer GazeRayRenderer;private static EyeData_v2 eyeData = new EyeData_v2();private bool eye_callback_registered = false;//此处为增加的变量private float pupilDiameterLeft, pupilDiameterRight;private Vector2 pupilPositionLeft, pupilPositionRight;private float eyeOpenLeft, eyeOpenRight;private void Start(){if (!SRanipal_Eye_Framework.Instance.EnableEye){enabled = false;return;}Assert.IsNotNull(GazeRayRenderer);}private void Update(){if (SRanipal_Eye_Framework.Status != SRanipal_Eye_Framework.FrameworkStatus.WORKING &&SRanipal_Eye_Framework.Status != SRanipal_Eye_Framework.FrameworkStatus.NOT_SUPPORT) return;if (SRanipal_Eye_Framework.Instance.EnableEyeDataCallback == true && eye_callback_registered == false){SRanipal_Eye_v2.WrapperRegisterEyeDataCallback(Marshal.GetFunctionPointerForDelegate((SRanipal_Eye_v2.CallbackBasic)EyeCallback));eye_callback_registered = true;}else if (SRanipal_Eye_Framework.Instance.EnableEyeDataCallback == false && eye_callback_registered == true){SRanipal_Eye_v2.WrapperUnRegisterEyeDataCallback(Marshal.GetFunctionPointerForDelegate((SRanipal_Eye_v2.CallbackBasic)EyeCallback));eye_callback_registered = false;}Vector3 GazeOriginCombinedLocal, GazeDirectionCombinedLocal;if (eye_callback_registered){if (SRanipal_Eye_v2.GetGazeRay(GazeIndex.COMBINE, out GazeOriginCombinedLocal, out GazeDirectionCombinedLocal, eyeData)) { }else if (SRanipal_Eye_v2.GetGazeRay(GazeIndex.LEFT, out GazeOriginCombinedLocal, out GazeDirectionCombinedLocal, eyeData)) { }else if (SRanipal_Eye_v2.GetGazeRay(GazeIndex.RIGHT, out GazeOriginCombinedLocal, out GazeDirectionCombinedLocal, eyeData)) { }else return;}else{if (SRanipal_Eye_v2.GetGazeRay(GazeIndex.COMBINE, out GazeOriginCombinedLocal, out GazeDirectionCombinedLocal)) { }else if (SRanipal_Eye_v2.GetGazeRay(GazeIndex.LEFT, out GazeOriginCombinedLocal, out GazeDirectionCombinedLocal)) { }else if (SRanipal_Eye_v2.GetGazeRay(GazeIndex.RIGHT, out GazeOriginCombinedLocal, out GazeDirectionCombinedLocal)) { }else return;}Vector3 GazeDirectionCombined = Camera.main.transform.TransformDirection(GazeDirectionCombinedLocal);GazeRayRenderer.SetPosition(0, Camera.main.transform.position - Camera.main.transform.up * 0.05f);GazeRayRenderer.SetPosition(1, Camera.main.transform.position + GazeDirectionCombined * LengthOfRay);//以下为新增的部分//pupil diameter 瞳孔的直径pupilDiameterLeft = eyeData.verbose_data.left.pupil_diameter_mm;pupilDiameterRight = eyeData.verbose_data.right.pupil_diameter_mm;//pupil positions 瞳孔位置//pupil_position_in_sensor_area手册里写的是The normalized position of a pupil in [0,1],给坐标归一化了pupilPositionLeft = eyeData.verbose_data.left.pupil_position_in_sensor_area;pupilPositionRight = eyeData.verbose_data.right.pupil_position_in_sensor_area;//eye open 睁眼//eye_openness手册里写的是A value representing how open the eye is,也就是睁眼程度,从输出来看是在0-1之间,也归一化了eyeOpenLeft = eyeData.verbose_data.left.eye_openness;eyeOpenRight = eyeData.verbose_data.right.eye_openness;Debug.Log("左眼瞳孔直径:" + pupilDiameterLeft + " 左眼位置坐标:" + pupilPositionLeft + "左眼睁眼程度" + eyeOpenLeft);Debug.Log("右眼瞳孔直径:" + pupilDiameterRight + " 右眼位置坐标:" + pupilPositionRight + " 左眼睁眼程度" + eyeOpenRight);}private void Release(){if (eye_callback_registered == true){SRanipal_Eye_v2.WrapperUnRegisterEyeDataCallback(Marshal.GetFunctionPointerForDelegate((SRanipal_Eye_v2.CallbackBasic)EyeCallback));eye_callback_registered = false;}}private static void EyeCallback(ref EyeData_v2 eye_data){eyeData = eye_data;}}}}
}

该方法有些取巧,前文提到的“邓布利多军”是通过新建脚本实现的该功能。笔者也在进一步的尝试中。

总结

笔者从一头雾水,到如今简单的实现了该功能,要感谢官方论坛中许多位前辈,以及官方技术人员的技术支持。同时也要感谢众多曾在网络上分享技术,发表见解的前辈们。

最后,再次感谢“邓布利多军”。希望有更多未来的开发者们,加入技术分享的大家庭中。

HTC Vive Pro eye 眼动数据简单获取相关推荐

  1. Win10 配置 HTC VIVE Pro Eye

    本文主要参考 VIVE官网设置指南,在实验室电脑完成配置. 一.检查软件.显卡和定位器状态 确保已安装必要的 VIVE 和 SteamVR 软件.否则,请下载并安装 VIVE 安装程序( 里边有 St ...

  2. 【Vive Pro】眼动安装SR_Runtime

    必须先安装viveport,再安装VIVE_SRanipalInstaller.msi 尝试不同版本 直到桌面右下角托盘出现机器人,眼部呈黄色,表示安装成功 右键about 出现版本信息,时有时无(这 ...

  3. 眼球追踪技术 Unity+ HTC vive Pro + DroolonF1 (二)

    本篇将如何开发,如果您喜欢请收藏.点赞.打赏~ 博主使用环境:Unity 2018.3.7.   Win 10 x64. HTC vive Pro demo下载:下载地址 1.新建Camera 2.V ...

  4. 眼球追踪技术 Unity+ HTC vive Pro + DroolonF1 (一)

    本篇博客主要讲开发前的配置,如安装配置问题. 开发前需要准备: 1.DroolonF1设备 2.SR_Runtime驱动 3.SRinipal SDK 4.Unity开发引擎 建议2017.3版本以上 ...

  5. VR拆装(HTC vive Pro开发)——8、场景搭建

    VR拆装(HTC vive Pro开发)--8.场景搭建 简单的unity界面介绍 主场景背景音相关问题 以拆卸场景为例介绍前文相关脚本挂在及问题在拖入素材前请先在size中输入素材个数

  6. HTC vive pro unity开发者软件/SDK版本注意事项

    HTC vive pro & unity开发:SteamVR.VRTK.VRIK.facial tracker开发环境配置注意事项 1.在unity中配置SteamVR plugin Stea ...

  7. 大话脑影像:你真的了解你的眼动数据吗!—数据清洗的“神秘”力量

    我从小就做眼动数据处理,,,, 统计检验是当前所有定量分析研究所必经的途径,尽管在今天我们已经有大量不同的统计方法来完成与我们的数据特征相符合的统计检验,但几乎所有的分析都建立在重要的基本假设之上.如 ...

  8. 眼动数据中的AOI是什么?

    关注"心仪脑"查看更多脑科学知识的分享. 我们在关注眼动数据分析时,经常能看到AOI一词.在今天的实验小知识里,我们将给大家解释什么是AOI及其分析指标. AOI被称作兴趣区,在我 ...

  9. 处理Unity中使用HTC VIVE PRo的SRWork插件若干问题

    一.介绍 HTC VIVE Pro版本的头盔显示器可以使用一个叫SRWork的工具轻松制作混合现实功能的案例,如图1所示:功能很强大,目前据我写 图1 这篇文真为止已经更新到了SRWork0.9.7. ...

  10. ZED Mini+HTC Vive pro使用:VR变AR以及视频流传输

    最近遇到一个项目,要求机器人携带相机工作,远端通过VR头显查看机器人当前所处环境.ZED Mini双目相机的卖点就是能将VR变成AR,遂入手一台ZED Mini和一套HTC Vive Pro,加起来一 ...

最新文章

  1. iOS15.4 来袭:新增“男妈妈”表情及口罩面容解锁、AirTags 反跟踪等新功能
  2. 聊一聊:Service层你觉得有用吗?
  3. opencv 连通域笔记
  4. asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”...
  5. jquery实现图片懒加载
  6. 五一好礼70份免费送:示波器、开发板、焊台等!
  7. c#基础知识梳理(四)
  8. scrapy 让指定的spider执行指定的pipeline
  9. 阿诗玛的传说|阿诗玛民间故事
  10. linux配置内存buffer,调整Linux的网络栈(Buffer Size)来提升网络性能
  11. uni_app UView 2.0 Upload 上传 header 如何配置
  12. 关于Facebook,Linkedin网的数据采集总结
  13. 面试被问离职原因该怎么回答?
  14. 心理测评软件php mysql_中小学版心理测评档案管理系统
  15. 【RPA自动化|提升办公效率】无需代码的傻瓜式爬虫
  16. xmind打不开java_xmind打开出错(JVM terminated. Exit code=-1) | 学步园
  17. 《约伯记》注释正文 第十三章
  18. Android单点触控技术,对图片进行平移,缩放,旋转操作
  19. 我的世界服务器披风文件在哪,关于我的世界国际版披风导入方法与详解(联机可用...
  20. 在以太坊开发自己的ERC-20代币及如何ICO

热门文章

  1. 负载均衡和Nginx
  2. markdown颜色索引及表格背景颜色填充
  3. 作为一名软件测试工程师,需要具备哪些能力?
  4. 俄勒冈州立大学计算机科学专业,俄勒冈州立大学电气工程与计算机科学专业介绍在这里哦!...
  5. email邮箱格式校验
  6. php 导出word怎么分页,php 导出Word怎么分页
  7. 给学计算机男生起外号,如何给男生起外号
  8. linux系统怎样将图片导出,Linux 下 将PDF文件中的文本,图片导出的方法。
  9. GRUB4DOS(十) 关于grldr.mbr和grldr
  10. PIKA trouble01 -- pika主从关系不能建立及主从断连问题