Unity Meta Quest 一体机开发(七):配置玩家 Hand Grab 功能
文章目录
- 📕教程说明
- 📕玩家物体配置 Hand Grab Interactor
- ⭐添加 Hand Grab Interactor 物体
- ⭐激活 Hand Grab Visual 和 Hand Grab Glow
- ⭐更新 Best Hover Interactor Group
- 📕配置可抓取物体(无抓取手势)
- ⭐刚体和碰撞体
- ⭐Grabbable 脚本
- 🔍Transfer On Second Selection
- 🔍Transformer 脚本
- ⚡OneGrabFreeTransformer
- ⚡OneGrabRotateTransformer
- ⚡OneGrabTranslateTransformer
- ⚡TwoGrabFreeTransformer
- ⭐添加 Hand Grab Interactable 物体
- ⭐让物体在进入不同状态下变色
此教程相关的详细教案,文档,思维导图和工程文件会放入 Seed XR 社区。这是一个高质量知识星球 XR 社区,博主目前在内担任 XR 开发的讲师。此外,该社区提供教程答疑、及时交流、进阶教程、外包、行业动态等服务。
知识星球链接:Seed XR 高级社区
📕教程说明
上期教程我们介绍了 Meta XR SDK 中 Hand Grab 交互中的重要知识点,这篇教程将会介绍如何将 Hand Grab 交互应用到我们自己的项目中。
配置一个基本的玩家物体可以参考前几期教程:https://blog.csdn.net/qq_46044366/article/details/134097455
系列教程专栏:https://blog.csdn.net/qq_46044366/category_12118293.html
配套的视频链接:
上半部分:2023 VR+MR全硬件开发教程】七(上半)、V59新版本说明以及配置手追交互(主讲:YY)
下半部分将在 Seed XR 社区分享。
电脑操作系统:Windows 11
使用的 VR 设备:Meta Quest 3(Quest 系列都适用)
使用的 Unity 版本:2021.3.5 LTS (这里推荐使用 2021 及以上的 LTS 版本)
Meta XR SDK 版本:v57
官方文档:https://developer.oculus.com/documentation/unity/unity-gs-overview/
HandGrab 知识点:https://developer.oculus.com/documentation/unity/unity-isdk-hand-grab-interaction/
配置 Hand Grab Interaction:https://developer.oculus.com/documentation/unity/unity-isdk-create-hand-grab-interactions/
📕玩家物体配置 Hand Grab Interactor
⭐添加 Hand Grab Interactor 物体
在 Project 窗口中搜索 Hand Grab Interactor 这个 Prefab:
将它拖到场景中,分别作为 HandInteractorsLeft 和 HandInteractorsRight 的子物体:
⭐激活 Hand Grab Visual 和 Hand Grab Glow
激活 Hand Grab Interactor 下的 Hand Grab Visual 和 Hand Grab Glow 子物体(左右手都需要):
将对应手的 Synthetic Hand 拖到 Hand Grab State Visual 脚本的 Synthetic Hand 变量上:
对 Hand Grab Glow 脚本上的 Hand Renderer,Material Editor 和 Hand Visual 变量进行赋值:
⭐更新 Best Hover Interactor Group
在 HandInteractorsLeft 和 HandInteractorsRight 物体上分别有一个 Best Hover Interactor Group 脚本,我们需要把对应的 HandGrabInteractor 拖到 Interactors 中:
Best Hover Interactor Group是 Interactor Group 的其中一种。
只要是个Interactor Group,它就会保证所有添加进 Interactor Group的Interactor,在同一时刻只能有一个Interactor在交互。当其中一个 Interactor 在交互的时候,Group 里面的其他 Interactor 会暂时失活,无法与对应的 Interactable 交互,等到当前正在运作的 Interactor 停止交互后,其他的 Interactor 才会被激活。
在 Interactor 开始交互,也就是进入到 Select 状态之前,要先进入 Hover 状态,也就是准备交互的阶段。而这个 BestHoverInteractorGroup 有它自己的特性,就是能够保证优先级高的 Interactor 进入到 Hover 状态,然后优先级低的 Interactor 会暂时失活默认情况下,Best Hover Interactor Group 中的 Interactors 列表元素中越靠前的拥有越高的优先级。也就是说列表中第一个Interactor 优先级最高,然后优先级往下递减。
比如上面这张图,这个是右手上的 Best Hover Interactor Group,在 Group 中 HandGrabInteractor 排在 HandRayInteractor(实现的是射线交互)前面,那么对于右手来说,当 HandGrabInteractor 和 HandRayInteractor 同时满足进入 Hover 的条件时,因为 HandGrabInteractor 会比 HandRayInteractor 优先进入 Hover,所以 HandRayInteractor 会暂时失活,等到 HandGrabInteractor 取消了 Hover 状态且 HandRayInteractor 仍满足 Hover 状态条件时,HandRayInteractor 才会进入到 Hover 状态。
📕配置可抓取物体(无抓取手势)
⭐刚体和碰撞体
在可抓取物体身上添加刚体和碰撞体。
我这边将碰撞体设为了 Is Trigger,将刚体 Rigidbody 的 Use Gravity 取消,让物体不具有物理效果,如果想要添加物理效果,需要添加额外的一些脚本,这个会在后续教程中介绍。
⭐Grabbable 脚本
官方文档:https://developer.oculus.com/documentation/unity/unity-isdk-grabbable/
在可抓取物体身上添加 Grabbable 脚本。
🔍Transfer On Second Selection
如果将 Grabbable 脚本上的 Transfer On Second Selection 勾选上,就能够实现左右手的交替抓取。比如我的右手正在抓取这个方块,这个时候我保持右手的抓取,然后用左手去抓取这个方块。那么我的左手会接替方块的控制权,右手则自动取消对这个方块的抓取。
🔍Transformer 脚本
在 Grabbable 脚本的 Optionals 下有一个 One Grab Transformer 和 Two Grab Transformer 变量。如果没有对这两个变量赋值,程序运行后默认会给物体添加一个 One Grab Free Transformer 脚本,然后引用到 One Grab Transformer 变量上。
Grabbable 脚本可以通过 Transformer 类型的脚本控制可抓取物体的移动,旋转或缩放。One Grab Transformer 可以通过一只手控制物体,Two Grab Transformer 需要同时用上两只手控制物体。
下面介绍一些常见的 One Grab Transformer 和 Two Grab Transformer:
我们可以手动在物体上添加 Transformer 相关的脚本,然后记得将它引用到 Grabbable 脚本上的 One Grab Transformer 或 Two Grab Transformer 处:
⚡OneGrabFreeTransformer
能用一只手控制物体的移动和旋转。
⚡OneGrabRotateTransformer
能用一只手控制物体的旋转,可设置 Rotation Axis 限定物体能绕哪个轴旋转。
⚡OneGrabTranslateTransformer
能用一只手控制物体的移动。
⚡TwoGrabFreeTransformer
能用两只手控制物体的移动,旋转和缩放。如果我们用了 Two Grab Transformer,需要将 Grabbable 脚本上的 Transfer On Second Selection 取消勾选,因为勾选上实现的是左右手交替抓取,无法支持两只手同时抓取。
如果想要让一个物体既能通过一只手抓取,也能用两只手同时操作,我们需要给 One Grab Transformer 和 Two Grab Transformer 都赋值:
⭐添加 Hand Grab Interactable 物体
我们在 Project 窗口的搜索栏中搜索 HandGrabInteractable 物体,将它拖到场景中,作为可抓取物体的子物体。
⭐让物体在进入不同状态下变色
我们可以在可抓取物体下添加一个子物体,专门用来负责视觉效果:
在 Visuals 物体上添加 Interactable Color Visual,Material Property Block Editor 和 Interactable Group View 脚本:
将物体的 Mesh Renderer 拖到 Material Property Block Editor 的 Renderers 下:
将 HandGrabInteractable 拖到 Interactable Group View 的 Interactables 下:
将 Material Property Block Editor 和 Interactable Group View 脚本拖到 Interactable Color Visual 脚本的对应位置:
默认情况下,物体进入 Hover 状态会变成蓝色,进入到 Select 状态会变成绿色。我们可以自行修改颜色。
相关文章:

Unity Meta Quest 一体机开发(七):配置玩家 Hand Grab 功能
文章目录 📕教程说明📕玩家物体配置 Hand Grab Interactor⭐添加 Hand Grab Interactor 物体⭐激活 Hand Grab Visual 和 Hand Grab Glow⭐更新 Best Hover Interactor Group 📕配置可抓取物体(无抓取手势)⭐刚体和碰撞…...

我又开始贩卖焦虑了,机器视觉兄弟们,打工这生意盘不活了?让人逃离北上广深,是毒鸡汤吗?
我想大多数人和我想的一样,不要质疑自己的出身,也不必用一生去改变出身而获得融入感,思想富足这是我们留给自己一生最珍贵的礼物。也许一线城市容不下肉身,二三线城市容不下灵魂。那我回到生我养我的十八线小县城,这不…...

hyperledger fabric2.4测试网络添加组织数量
!!!修改内容比较繁琐,预期未来提供模板修改 修改初始配置文件,初始添加3个组织 organizations文件夹 /cryptogen文件夹下创建文件crypto-config-org3.yaml,内容如下: PeerOrgs:# ---------------------------------------------------------------------------# Org3# ----…...

分库分表
分库,分表,分库分表 “只分库“,“只分表“,“既分库又分表" 何时分库 在面对高并发的情况下,数据库连接成为性能瓶颈。当数据QPS过高导致数据库连接数不足时,考虑分库。在读多写少的场景下&#x…...
uniapp自定义组件
在UniApp中,你可以使用自定义组件来拓展应用程序的功能和界面。自定义组件是由多个Vue组件构成的,可以在应用程序中重复使用。 要创建一个自定义组件,你需要在UniApp项目中的components目录下创建一个新的文件夹,并在该文件夹中创…...
linux gdb调试
安装gdb yum install gdb -y 查看dump文件所在路径: 可通过 cat /proc/sys/kernel/core_pattern命令获取dump目录路径 gdb调试: 可执行文件为 xxx(例如:main),结合其运行时产生的dump文件进行调试 命令&a…...
java17 linux 环境配置
linux版本 :centos 8 1.能联网的情况下: wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3./etc/profile增加: export JAVA_HOME/usr/local/java/jdk-17.…...

Flutter最新稳定版3.16 新特性介绍
Flutter 3.16 默认采用 Material 3 主题,Android 平台预览 Impeller,DevTools 扩展等等 欢迎回到每季度一次的 Flutter 稳定版本发布,这次是 Flutter 3.16。这个版本将 Material 3 设为新的默认主题,为 Android 带来 Impeller 预览…...

nodejs+vue慢性胃炎健康管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计
随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于慢性胃炎健康管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了慢性胃炎健康管理系统, 系统首页、个…...
【C++】传递‘类非静态成员函数’用作回调函数
在C语言中,传递函数指针是非常常见的操作。 在C语言中,使用C语言一致的方法传递全局函数指针,或者传递静态函数指针也很常见。 不过如果遇到想传递非静态成员函数时,可以参考以下示例代码。 #ifndef _WORKER_HPP_ #define _WOR…...
vscode 创建 运行c++ 项目
1 扩展 install c 2.1安装 mingw g 下载 MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net win32下载地址 Download x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z (MinGW-w64 - for 32 and 64 bit Windows) 2.2 把 文件夹 bin 路径 添加到环境…...

Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】
文章目录 DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询组合查询相关性算分Function Score Query复合查询 Boolean Query 搜索结果处理排序分页高亮 RestClient查询文档快速入门match查询精确查询复合查询排序、分页、高亮 黑马旅游案例 DSL查询文档 DSL查询分类 …...

大数据HCIE成神之路之数学(3)——概率论
概率论 1.1 概率论内容介绍1.1.1 概率论介绍1.1.2 实验介绍 1.2 概率论内容实现1.2.1 均值实现1.2.2 方差实现1.2.3 标准差实现1.2.4 协方差实现1.2.5 相关系数1.2.6 二项分布实现1.2.7 泊松分布实现1.2.8 正态分布1.2.9 指数分布1.2.10 中心极限定理的验证 1.1 概率论内容介绍…...

【论文解读】FFHQ-UV:用于3D面部重建的归一化面部UV纹理数据集
【论文解读】FFHQ-UV 论文地址:https://arxiv.org/pdf/2211.13874.pdf 0. 摘要 我们提出了一个大规模的面部UV纹理数据集,其中包含超过50,000张高质量的纹理UV贴图,这些贴图具有均匀的照明、中性的表情和清洁的面部区域,这些都是…...
simple foc 移植odriver foc的 anti-cogging(抗齿槽算法)
文章目录 ESP32 simple foc 移植odriver anti-cogging.1.硬件,在淘宝买的。esp32 simple foc(最新). 下电阻三采样。2. 效果,见视频https://www.bilibili.com/video/BV1xg4y1X7Yr/?vd_source4fd70d693021f289fb2d339c6c0407193.代码添加(生成…...

基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...

环境配置|GitHub——解决Github无法显示图片以及README无法显示图片
一、问题背景 最近在整理之前写过的实验、项目,打算把这些东西写成blog,并把工程文件整理上传到Github上。但在上传README文件的时候,发现github无法显示README中的图片,如下图所示: 在README中该图片路径为࿱…...
AIGC(生成式AI)试用 12 -- 年终再总结
上次使用年终总结为题测试了CSDN创作助手和文心一言的表现,随着不断对总结给出更细节的提示。AIGC(生成式AI)试用 11 -- 年终总结-CSDN博客 总结年终总结生活/工作年终总结IT开发/运维年终总结 AIGC都能就新给出的主题修饰给出相应的关点&am…...
Linux下 tar 命令详解
一、tar 命令概述 Tar(Tape ARchive,磁带归档的缩写,LCTT 译注:最初设计用于将文件打包到磁带上,现在我们大都使用它来实现备份某个分区或者某些重要的目录)。 tar 是类 Unix 系统中广泛使用的命令&#x…...

SQL单表复杂查询where、group by、order by、limit
1.1SQL查询代码如下: select job as 工作类别,count(job) as 人数 from tb_emp where entrydate <2015-01-01 group by job having count(job) > 2 order by count(job) limit 1,1where entrydate <‘2015-01-01’ 表示查询日期小于2015-01-01的记录…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...