Unity之OpenXR+XR Interaction Toolkit实现 射线和物体交互事件回调

news2024/12/23 0:05:51

前言

前面我们介绍了如何抓取物体,今天我们来说一下如何和3D的物体进行交互,得到接触的事件回调。
交互的两种方式:
1.直接抓取或者射线抓取物体,得到接触回调
2.射线或者手部触摸物体后,得到接触回调

准备工作

有了前两篇的配置介绍,我们就不在详细说明这些了,大家自行复习
Unity之OpenXR+XR Interaction Toolkit接入Pico VR一体机
Unity之OpenXR+XR Interaction Toolkit接入HTC Vive

我们新建一个3D(URP)工程
然后通过PackageManager安装XR Interaction ToolKit插件。
配置好XR Interaction Toolkit的Preset
新建一个3D场景
放置几个简单的3D几何体到场景中

准备工作完毕
在这里插入图片描述

添加XR Origin

我们在Hierarchy试图窗口,点击鼠标右键创建一个XR->XR Origin(VR)对象
默认XR Origin上面的LeftHandController和RightHandController是添加的RayInteractor射线交互器。RayInteractor包含了射线点击和抓取功能,如果要使用手部直接抓取功能,我们可以把HandControll的RayInteractor替换成DirectInteractor。我们这里就以RayInteractor为示例,介绍一下如何实现射线和物体交互

注意检查下XR Controller(Action-based)组件是否设置完毕。
在这里插入图片描述

设置3D物体

如果希望手柄发射的射线可以和3D物体进行交互,那么除了给手柄添加RayInteractor之外,3D物体上面还必须添加交互组件。XRInteraction Toolkit给我们提供了几个组件
XR Grab Interacable,用于物体可以被抓取
XR Simple Interacable,用于物体可以被射线和手柄检测到。

我们在创建个几何体中选择一个,添加上面两个组件中的一个即可。如果你想让物体再被射线点击的同时被抓起来,那么就添加Grab Interaction。但是我想演示的是,我们射线碰到物体后,得到回调即可,无需被抓起来。
好了,我们给圆柱体添加XR Simple Interacable组件,如下图所示:
在这里插入图片描述
属性介绍:
Interaction Layer Mask :用于设置当前物体的Layer,可以通过手柄交互的层遮罩来控制那些物体可以交互,那些物体不交互。
Colliders:设置当前可交互物体的碰撞,注意必须是碰撞,触发器无效。可以不设置,运行时组件会自动获取游戏对象的所有碰撞组件(包括子节点的碰撞),如果手动设置了一个,那么运行时组件就不会再自动获取其他碰撞组件了。
Distance Calculation Mode:
Custom Reticle:
Select Mode:选中模式,是单击选中 还是 双击选中
Interactable Filters:交互过滤器
Interactable Events:交互事件,控制交互的回调事件,也可以代码绑定。

交互事件回调

好了,XR Origin + Hand Controller 和 XR Simgle Interactable都设置好了,可以开始测试交互了。
我们写一个MonoBehaviour脚本,添加到HandController手柄上,用于接受射线和物体交互的事件。
脚本代码如下:

namespace GT.Hotfix
{
    public class VRHandItem : HandItem
    {
    	//射线交互组件
        private XRRayInteractor m_XrRayInteractor;
        protected override void Start()
        {
            m_XrRayInteractor = GetComponentInChildren<XRRayInteractor>();
            //代码绑定选中进入事件
            m_XrRayInteractor.selectEntered.AddListener(OnRaySelectEntered);
            //代码绑定选中离开事件
            m_XrRayInteractor.selectExited.AddListener(OnRaySelectExited);
        }
		//选中进入回调
        void OnRaySelectEntered(SelectEnterEventArgs args)
        {
            var attach = args.interactableObject.GetAttachTransform(args.interactorObject);
            Debug.Log("Ray触摸进入:" + attach.name);
        }
        //选中离开回调
        private void OnRaySelectExited(SelectExitEventArgs args)
        {
            var attach = args.interactableObject.GetAttachTransform(args.interactorObject);
            Debug.Log("Ray触摸结束:" + attach.name);
        }
    }
}

我们把脚本添加到左右手任意一个HandController上面,然后运行游戏。
在这里插入图片描述
我们手柄射线选中物体后,点击G按键,触发Select事件,得到事件回调,日志打印如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/467079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复

1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便 所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安…

嵌入式软考备考_3 嵌入式操作系统概述

嵌入式操作系统概述 工作在嵌入式环境中的操作系统 Embedded Operating System。 嵌入式和一般操作系统区别&#xff1a; 非通用操作系统&#xff0c;用于完成特定功能&#xff1b;性能实时性能源可靠性要求高&#xff1b;占用资源少&#xff1b;可剪裁&#xff0c;可配置。…

渗透测试 | Web信息收集

0x00 免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担…

《程序员面试金典(第6版)》面试题 16.04. 井字游戏(棋盘类问题,C++)

题目描述 设计一个算法&#xff0c;判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘&#xff0c;由字符" "&#xff0c;“X"和"O"组成&#xff0c;其中字符” "代表一个空位。 以下是井字游戏的规则&#xff1a; 玩家轮流将字符放入空位…

专门为麻醉科和手术室开发的:手术麻醉系统源码,系统稳定,功能完整,支持二次开发

手术麻醉系统源码&#xff1a;C# .net 桌面软件 C/S版 系统极其稳定&#xff0c;扩展性强&#xff0c;已在多家医院运营。 文末获取联系 手术麻醉信息管理系统是专门为麻醉科和手术室开发的围手术期临床信息管理系统&#xff0c;具备以下功能: 1.手术程管理系统整合了手术室、…

人工智能实践: 基于T-S 模型的模糊推理

模糊推理是一种基于行为的仿生推理方法, 主要用来解决带有模糊现象的复杂推理问题。由于模糊现象的普遍存在, 模糊推理系统被广泛的应用。模糊推理系统主要由模糊化、模糊规则库、模糊推理方法以及去模糊化组成, 其基本流程如图1所示。

C++(继承下)

目录&#xff1a; 1.继承与有元 2.继承与静态成员 3.单继承、多继承 4.如何定义一个不能被继承的类&#xff1f;&#xff1f; 5.分享有意思的一道题 6.菱形继承及菱形虚拟继承 --------------------------------------------------------------------------------------------…

【c语言】全局变量 | 局部变量的生命周期与作用域

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

亚马逊云科技赋能客户,为海思科打造安全高效的营销业务中台系统

羽翼渐丰&#xff0c;翱翔云端 携手亚马逊云科技&#xff0c;打造互联网级企业解决方案 秉承“为客户创造价值”的理念&#xff0c;在公司发展过程中&#xff0c;博智信息先后服务了众多知名企业&#xff0c;客户行业覆盖制造、零售、餐饮、科技、电子等。经过近20年的发展&a…

AutoGPT 是 prompt 工程的下一个前沿

前言 最近了解到Auto GPT的上线&#xff0c;下面我来整理一下整个体验过程&#xff0c;希望对大家有所帮助和启发。 首先Auto GPT是 OpenAI 的 Andrej Karpathy 都在大力宣传的一个开源项目&#xff0c;他认为 AutoGPT 是 prompt 工程的下一个前沿。 近日&#xff0c;AI 界貌…

自助式数据分析平台:jvs数据智仓-统计报表的使用条件及界面介绍

统计报表界面介绍 统计报表是指利用表格和报表等形式&#xff0c;将数据以清晰的结构和布局的方式呈现出来&#xff0c;以便用户进行数据分析和决策制定的一种BI统计方法。表格式的BI统计通常采用交叉表格、分组表、报表等形式&#xff0c;对数据进行整合、分析和展示&#xff…

【数据库数据恢复】ndf文件损坏的SQL SERVER数据库数据恢复案例

数据库数据恢复环境&#xff1a; 某公司存储上部署SQL SERVER数据库&#xff0c;数据库中有1000多个文件&#xff0c;该SQL SERVER数据库每10天生成一个NDF文件&#xff0c;数据库包含两个LDF文件。 数据库故障&分析&#xff1a; 存储设备出现故障导致SQL SERVER数据库异常…

IDEA实用设置

1、设置全局编码统一为UTF-8 file>setting中搜索框输入file encoding修改格式为UTF-8 2、设置文字大小 file>setting中搜索框输入font修改字体大小 3、配置maven file>setting中搜索框输入maven修改maven的路径、conf文件、文件仓库 4、idea中实现Serializable提示…

RabbitMQ通讯方式

RabbitMQ通讯方式 RabbitMQ提供了很多中通讯方式&#xff0c;依然可以去官方查看&#xff1a;https://rabbitmq.com/getstarted.html 七种通讯方式 1 RabbitMQ提供的通讯方式 Hello World!&#xff1a;为了入门操作&#xff01;Work queues&#xff1a;一个队列被多个消费者…

三十五、垃圾回收器

一、GC分类于性能指标 垃圾回收器的分类 1.串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作&#xff0c;此时工作线程被暂停&#xff0c;直至垃圾收集工作结束。 1)在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合&#xff0c;串行回收器…

WRF模式应用:天气预报、模拟分析观测气温、降水、风场、水汽和湿度、土地利用变化、土壤及近地层能量水分通量、土壤、水体、植被等相关气象变量

查看原文>>>高精度气象模拟软件WRF(Weather Research Forecasting)技术及案例应用 目录 区域气候模式理论知识梳理 Linux操作系统WRF模式系统实际操作 模式调试及运行 模式操作及案例实践 实际应用及案例分析 Python在WRF模型自动化运行及前后处理中的实践技术…

为什么在马云成功前就有那么多影像留下来?

马云创业的各个阶段&#xff0c;都有意无意得到媒体的推波助澜&#xff0c;不光是影像&#xff0c;还留下了很多相关的文字报道。站在当时的角度&#xff0c;马云或许并不总是以一种成功人士的身份出现&#xff0c;但即便如此&#xff0c;他做事情也足够新潮、足够前卫、或者足…

Delphi 知识 彻底搞懂Delphi中的匿名方法

前言&#xff1a; 顾名思义&#xff0c;匿名方法是一个没有与之相关的名字的过程或函数。一个匿名方法将一个代码块视为一个实体&#xff0c;可以分配给一个变量或作为一个方法的参数使用。此外&#xff0c;匿名方法可以引用变量&#xff0c;并在定义该方法的上下文中为变量绑定…

Off-CPU分析

前言 性能问题可以分为两种类型&#xff1a; On-CPU&#xff1a;线程花时间在CPU上运行的地方&#xff1b; Off-CPU&#xff1a;在I/O&#xff0c;锁&#xff0c;计数器&#xff0c;分页/交换上阻塞等待的时间 Off-CPU的分析是一种性能分析的方法&#xff0c;用于测量和研究Off…

java懒加载实现

懒加载&#xff0c;也称为“不需要”加载&#xff0c;是一种内存管理方式。在 Java中&#xff0c;当一个类不再使用时&#xff0c;就会将其转化为另一个类对象。这也是所谓的“垃圾回收”。java中的懒加载有三种方式&#xff1a; 3、在对象被回收时&#xff0c;会将其销毁。 在…