软硬件配置:
Unity2022.3.51f1c1、visual studio code、Meta Quest3、Meta XR All in One SDK v77
一、手势识别基础组件
OVRCameraRig上有HandFeature
记录姿势基础组件:
FingerFeatureStateProvider :识别手指姿势
TransformFeatureStateProvider :识别手腕旋转姿势
一个姿势预制体上有的组件
HandRef:预制件上的其他组件通过此引用读取手部状态
识别姿势基础组件:
ShapeRecognizerActiveState :一个或多个,满足指定形状条件时变成激活状态
TransformRecognizerActiveState :检测到变换特征激活
ActiveStateGroup :当所有依赖的 ActiveStates 都为真时,返回 true 的 ActiveStateGroup
姿势调用触发事件基础组件:
ActiveStateSelector :不暴露接口给Inspector
SelectorUnityEventWrapper :引用ActiveStateSelector,可以在上面添加识别后回调的方法
二、记录手势
这个官方文档写得老复杂了,但是实操真的很简单,就是录一下手部姿势微调一下拖到场景里绑定方法就可以用了。
1.创建一个有OVRInteractionComprehensive预制体的OVRCameraRig
我这里直接用BuildingBlock加了一个OVRCameraRig然后拖了OVRInteractionComprehensive预制体(一个涵盖基本上meta所有预设交互的预制体)进去
(其实理论来说,只要你的OVRCameraRig有下面这三个脚本就行了,但是我没测过,感兴趣的同学可以测测)
2.打开Hand Pose Selector Recorder,这是meta提供的记录手部姿势的工具
3.将要录制的手的feature拖到recorder里
4.配置基础信息,比如生成的姿势预制体名字啥的
5.运行有配好的OVRCameraRig的场景,点击record按钮就会将你当前的手部姿势生成一个预制体和姿势数据到Assets/RecordedHandPoseSelectors
如果上一步勾选了添加到场景还会自动给你添加到场景里(但是引用的不太准确,建议手动添加)
三、在场景中添加手势识别并验证手势准确度
1.把生成的预制体拖到场景中
2.配置脚本引用,以右手姿势为例
3.建一个Cube通过Cube的激活关闭验证准确度
这个脚本也在生成的姿势预制体上
4.运行场景
可以看到它会根据我的手势显隐
四、调整手势约束严格度
可能有同学试了一下发现很难识别到,这是因为meta在记录时严格要求了每一个手指以及关节旋转,可以通过调整姿势预制体对应的配置文件来修改约束
调整约束
解释一下各个参数的意思,meta我没找到对应的,这是g老师说的,可能不完全对,可以参考着调
✅ 整体结构
Shape Name:给要识别的手势起的名字(目前是空的,你可以填一个如“PeaceSign”或“OpenHand”之类的)。
Thumb / Index / Middle / Ring / Pinky Feature Configs:分别针对五个手指,设置要检测的“特征”。
✋ 手指特征(Feature)
一般会检测三个维度的特征:
Curl(弯曲度):手指向手心弯曲的程度,通常有 Open / Neutral / Closed。
Flexion(屈伸角度):类似 curl,但更细分角度或者检测范围。
Abduction(外展):手指是否张开或并拢(侧向张开的角度)。
⚙ 配置方式
每个特征都有一个比较条件:
Is
:值必须是后面指定的状态(例如 Is Open 表示必须是张开的)。
Is Not
:值不能是后面指定的状态(例如 Is Not Open 表示不能是张开的)。后面接的状态:
Open
:完全张开。
Closed
:完全弯曲。
Neutral
:中间状态(半弯曲等)。
如果调完发现还是不太灵敏,可以直接把姿势预制体上的关节旋转识别移除
PS.博主一直是左右手姿势分开录制的,不知道左手的姿势能不能迁移到右手,可能是可以的,我不确定