引言
在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()。
在这个列表中将组件拖拽下来,然后在右侧选择代码和对应要响应的函数。
广播
同样,我们需要设置广播,跟官方的模块一样,大家看上面截图的设置。