unity实现小球poke不穿膜

news/2024/10/24 7:30:56/

引言

在oculus quest2官方实现了手部指尖poke按键不穿膜,具体采用代码的方式进行限制,具体看oculus quest包中的HandPokeLimiterVisual.cs,下面则实现其他物体(小球)作为pokeInteractor来poke按键,当按下的时候小球不会透过按键。
首先先来讲述官方手部指尖实现的逻辑方式。

官方指尖poke limit

poke主导者-手指尖

请添加图片描述
具体的手势跟踪采用的是oculus包中Interaction->Scenes->Examples->PokeExample案例中的模块结构。其中我们看到HandPokeInteractor挂载了重要的 Poke Interactor 和Hand Poke Limiter Visual代码。
Poke Interactor 红框所呈现的列表中我们可以看到一个变量 Point Transform,他导入了指尖的坐标,这里导入的是食指的坐标。因此对于想要成为poke的主导者的话就要挂载这个代码,将poke 主导者的坐标导入进去,之后可以看小球的案例会更加清楚一些。
请添加图片描述

如果要不穿模,主导者也要挂载limit代码,对于手部的代码,他主要是:当检测到按下的时候,更改指尖的位置,让他限制在一定范围内,然后还锁住手腕的pose,避免指尖不动,手腕乱翻,但是没有limit的其他手指实测后还是可以动的。
请添加图片描述
touchPoint就是按下的表面,delta就是上一帧的位移,radius是限制移动的半径,touchnormal是poke的法线,也就是只会沿着法线移动半径距离。
radius可以从上面的Poke Interactor的参数中更改。

被poke-按键

在被poke者挂载poke interactable,主要这是按键的hover悬停、select按下等参数。
以及挂载Interactable unity event可以设置按键发生的各种事件。
请添加图片描述

广播

设置后poke者和被poke者后要设置pointableCanvasModule挂载eventSystem和PointableCanvasModule进行广播。
请添加图片描述

小球案例

poke主导者-小球

建立小球,在小球上挂载上面所说的两个代码,并将小球拖拽到Point Transform中。请添加图片描述
Ball Limit见github代码,给个star呗~

被主导者-按键

在按键上放置上面所说的两个代码。
为了让小球垂直按下按键较长的距离依旧被limit,这里的cancel select normal改成1,之前十0.3太短了,也就是当小球在按键表面向下超过1的时候才被认为是unselect,而我们limit代码是当select = ture则会被limit。
请添加图片描述
按键还能按照不同状态设置事件响应。在这个组件中,我们可以在list添加事件,然后将我们要响应函数挂载在这里。
比如下面的例子:
buttomvisual是我的一个组件,组件上有一个interactableColorVisual的代码,代码中有public的函数synHover(),synSelect()。
在这个列表中将组件拖拽下来,然后在右侧选择代码和对应要响应的函数。
请添加图片描述

广播

同样,我们需要设置广播,跟官方的模块一样,大家看上面截图的设置。


http://www.ppmy.cn/news/74118.html

相关文章

cpp11实现线程池(一)——项目介绍

项目介绍 线程池是库的形式提供给用户,是必须放到代码中,不能单独运行,亦称为基础组件 第一版线程池任务对象使用继承技术,提供一个抽象基类Task,里面有一个纯虚函数run(),使用时继承该类,并重…

LeetCode:25. K 个一组翻转链表

25. K 个一组翻转链表 1)题目2)思路3)代码4)结果 1)题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。…

std::thread使用

std::thread使用 join & detachjoinable() 函数代码演示主线程不做操作joindetach join & detach 定义区别: join 会阻塞,调用线程等待子线程执行完毕,然后再往下执行detach 分离,调用线程不再等待子线程结束&#xff0…

【牛客刷题专栏】0x30:JZ38 字符串的排列(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录 前言问…

管中窥豹!从冠德石油看数字化对加油站的影响力

从上个世纪90年代起,至2010年前后,是国内信息化建设的高速发展期。这段时间无论是应用软件、企业网站还是商业咨询,无不呈现井喷式发展。大多数企业和政府机关均完成了或多或少的信息化建设。IT带来了标准化、科学化的管理和运作模式&#xf…

当Python遇上异步编程:实现高效、快速的程序运行!

前言 同步/异步的概念: 同步是指完成事务的逻辑,先执行第一个事务,如果阻塞了,会一直等待,直到这个事务完成,再执行第二个事务,顺序执行 异步是和同步相对的,异步是指在处理调用这…

C++——内存管理+模块

作者:几冬雪来 时间:2023年5月19日 内容:C——内存管理模块 目录 前言: 1.new和delete操作自定义类型: operator new/delete: 定位new表达式(placement-new): …

Lucene(4):Field域类型

1 Field属性 Field是文档中的域,包括Field名和Field值两部分,一个文档可以包括多个Field,Document只是Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。 是否分词(tokenized) 是:作分词处理…