//当选择的控制器中包含手势跟踪时 quset 会自动在 AndroidManifest.xml 文件中添加以下配置
//当选择手势跟踪版本为 V1 或 V2 时,Quest 会自动在 AndroidManifest.xml 文件中添加元素
为了生成和渲染手部模型,OVR Mesh Renderer 结合了 OVR Skeleton OVR Mesh 返回的数据。 OVR Skeleton 返回绑定姿势、骨骼层次结构和碰撞体数据, OVR Mesh 从 Oculus 运行时加载指定的 3D 资源,并将其显示为 Unity Mesh。
Physics Capsules 表示手的骨骼体积,用于触发物理对象的交互,并生成与物理系统中其他刚体的碰撞事件。
默认手部模型为蒙皮, SkinnedMeshRenderer 显示模型在场景中渲染方式的属性。确保 Skinned Mesh Renderer 组件被启用,可以定义三大类别来自定义手部模型:
高频手部跟踪提供更强大和可靠的手势检测、稳定的手部描绘,以及约 10% 的延迟改进。这为使用手作为输入的用户创建了自然手部运动的无缝复制和更身临其境的体验。使用高频跟踪的会导致抖动略有增加,特别是在弱光条件下。
OVRSkeleton 包含用于实现交互的骨骼 ID 和方法的完整列表,例如检测手势,计算手势相似度,或在物理系统中触发碰撞事件。
调用 GetCurrentStartBoneID ()
和 GetCurrentEndBoneId()
方法来返回开始骨骼 ID 和结束骨骼 ID , 这些骨骼 ID 主要用于循环访问当前配置的骨架类型中存在的骨骼子集。 调用 GetCurrentNumBones()
和 GetCurrentNumSkinnableBones()
方法以返回骨架中的骨骼总数和蒙皮骨骼总数。
Invalid = -1
Hand_Start = 0
Hand_WristRoot = Hand_Start + 0 // root frame of the hand, where the wrist is located
Hand_ForearmStub = Hand_Start + 1 // frame for user's forearm
Hand_Thumb0 = Hand_Start + 2 // thumb trapezium bone
Hand_Thumb1 = Hand_Start + 3 // thumb metacarpal bone
Hand_Thumb2 = Hand_Start + 4 // thumb proximal phalange bone
Hand_Thumb3 = Hand_Start + 5 // thumb distal phalange bone
Hand_Index1 = Hand_Start + 6 // index proximal phalange bone
Hand_Index2 = Hand_Start + 7 // index intermediate phalange bone
Hand_Index3 = Hand_Start + 8 // index distal phalange bone
Hand_Middle1 = Hand_Start + 9 // middle proximal phalange bone
Hand_Middle2 = Hand_Start + 10 // middle intermediate phalange bone
Hand_Middle3 = Hand_Start + 11 // middle distal phalange bone
Hand_Ring1 = Hand_Start + 12 // ring proximal phalange bone
Hand_Ring2 = Hand_Start + 13 // ring intermediate phalange bone
Hand_Ring3 = Hand_Start + 14 // ring distal phalange bone
Hand_Pinky0 = Hand_Start + 15 // pinky metacarpal bone
Hand_Pinky1 = Hand_Start + 16 // pinky proximal phalange bone
Hand_Pinky2 = Hand_Start + 17 // pinky intermediate phalange bone
Hand_Pinky3 = Hand_Start + 18 // pinky distal phalange bone
Hand_MaxSkinnable= Hand_Start + 19
// Bone tips are position only. They are not used for skinning but are useful for hit-testing.
// NOTE: Hand_ThumbTip == Hand_MaxSkinnable since the extended tips need to be contiguous
Hand_ThumbTip = Hand_Start + Hand_MaxSkinnable + 0 // tip of the thumb
Hand_IndexTip = Hand_Start + Hand_MaxSkinnable + 1 // tip of the index finger
Hand_MiddleTip = Hand_Start + Hand_MaxSkinnable + 2 // tip of the middle finger
Hand_RingTip = Hand_Start + Hand_MaxSkinnable + 3 // tip of the ring finger
Hand_PinkyTip = Hand_Start + Hand_MaxSkinnable + 4 // tip of the pinky
Hand_End = Hand_Start + Hand_MaxSkinnable + 5
Max = Hand_End + 0
手势关节点信息
通过 GetCurrentNumBones() 方法返回不包括 五个手指 Tip 点的 19 个骨骼点
通过 GetCurrentNumSkinnableBones() 方法返回 24 个蒙皮骨骼点
为了标准化应用之间的交互,OVR Hand 提供对过滤后的指针姿势和捏合手势检测的访问,以确保应用符合 Oculus 系统应用相同的交互,
捏合是使用手势与 UI 的基本交互。成功捏合被视为一次 UI 点击操作
OVR Hand 提供检测手指当前是否正在捏合,捏合的力度以及手指姿势的相似度的方法。可以通过更改 手指的颜色,再手指完全捏合时添加音效,或者基于捏合状态继承物理交互来向用户提供反馈。
调用 GetFingerIsPinching()
方法并传递手指检查它当前是否正在捏合。该方法返回一个 bool ,表示捏合的状态。
调用GetFingerPinchStrength()
方法返回当前手指的捏合进度以及强度。它返回的值范围为 ( 0 - 1 ), 0 表示无捏合,1 表示手指触摸到拇指完全捏合状态。
GetFingerConfidence()
方法返回手势的相似度,返回值为 low 或 high .
var hand = GetComponent();
bool isIndexFingerPinching = hand.GetFingerIsPinching(HandFinger.Index);
float ringFingerPinchStrength = hand.GetFingerPinchStrength(HandFinger.Ring);
TrackingConfidence confidence = hand.GetFingerConfidence(HandFinger.Index);
OVR Hand 提供手势指针姿势,以便交互可以与 Quest 保持一致。它提供 从手部到跟踪空间中的起点和终点。强烈建议使用 PointerPose
来确定用户在 UI 交互情况下指向的方向。
OVRHand.IsTracked 检测当前手是否可见,并且被 Oculus 设备跟踪。
HandConfidence 设置追踪的相似度。
HandScale 获取用户手部模型缩放,默认手部模型缩放为 1.0 该值可以随时更改
唤起系统手势是一个保留手势,允许用户通过手势唤起 Oculus 菜单,当用户惯用手手掌朝向用户并用食指捏合时,会触发此事件
若要检测惯用手,调用 IsDominantHand 属性。如果返回为 true ,通过调用 IsSystemGestureInProgress 可以检查用户是否正在执行系统手势。