Oculus 手势追踪

手部设置入门

设置相机

  1. 从项目中创建新场景或打开现有场景。
  2. 在 Assets 目录中找到 OVRCameraRig 预制体将其拖到场景中。如果场景中已存在 预制体跳过此步骤
  3. 在 面板中选中 OVRCameraRig > OVR Manager > Tracking 选择 Tracking Origin TypeFloor Level.

选择手势跟踪作为输入

  1. 选择 OVR Manager > Quest FeaturesHand Tracking Support 列表中选择 Controllers and Hands 或者 Hands Only 选项开启手势跟踪
//当选择的控制器中包含手势跟踪时 quset 会自动在 AndroidManifest.xml 文件中添加以下配置
 

  1. Hand Tracking Version 列表中选择 V2 使用最新版手部跟踪
//当选择手势跟踪版本为 V1 或 V2 时,Quest 会自动在 AndroidManifest.xml 文件中添加元素

添加手势跟踪预制体

  1. Hierarchy 面板选择 OVRCameraRig > TrackingSpace 节点下选中左右手锚点
  2. 在 Assets 目录下搜索 OVRHandPrefab ,将其拖拽至 左右手锚点下。
  3. Hierarchy 面板 RightHandAnchor 节点下 选择 OVRHandPrefabOVR Hand, OVR Skeleton, 和 OVR Mesh, 组件中类型改为 HandRight , 左手预制体无需改动,默认手部类型为左手
  4. Hierarchy 面板 同时选择左右手 OVRHandPrefab 预制体,确保 OVR Skeleton, OVR Mesh, OVR Mesh Renderer 组件被启动
    此时,应用可以将手部呈现为输入设备,可以带上头戴设别,运行程序,在场景中看到 双手被正常跟踪渲染。

更新手势模型位置,大小

为了生成和渲染手部模型,OVR Mesh Renderer 结合了 OVR Skeleton OVR Mesh 返回的数据。 OVR Skeleton 返回绑定姿势、骨骼层次结构和碰撞体数据, OVR Mesh 从 Oculus 运行时加载指定的 3D 资源,并将其显示为 Unity Mesh。

  1. 当 OVRHandPrefab 在 OVRCameraRig > TrackingSpace 下的 左右手锚点时,取消 OVRSkeleton 组件中的 UpdateRootPose 选项,
  2. 当 OVRHandPrefab 放在非 OVRCameraRig > TrackingSpace 下时,需要勾选 UpdateRootPose 选项,确保手势模型 位置能够正确更新
  3. 如果需要根据用户手部大小更新 手部模型比例,请确保 OVRSkeleton 中 UpdateRootScale 被勾选,默认情况下,模型缩放比例为 1.0 ,通过启用缩放,可以根据用户的实际手部大小放大或缩小手部模型。如果你希望使用默认参考手部尺寸,则取消勾选

添加 Physics Capsules

Physics Capsules 表示手的骨骼体积,用于触发物理对象的交互,并生成与物理系统中其他刚体的碰撞事件。

  1. Hierarchy 面板展开 OVRCameraRig>TrackingSpace ,然后选择要与物理交互的 OVRHandPrefab.
  2. OVR Skeleton 组件选择开启 Enable Physics Capsules

自定义显示

默认手部模型为蒙皮, SkinnedMeshRenderer 显示模型在场景中渲染方式的属性。确保 Skinned Mesh Renderer 组件被启用,可以定义三大类别来自定义手部模型:

  • Materials 材质自定义手在应用程序中的显示方式。根据 shader ,配置适合您的内容的材质。
  • Lighting 光照指定网格渲染器是否以及如何投影和接受阴影
  • Probes 探针包含设置渲染器如何从光照探针系统接收光线的属性。
    要定义 Skinned Mesh Renderer 属性,请执行以下操作:
  1. Hierarchy 面板上,展开 OVRCameraRig > TrackingSpace 然后从选择任意一个 OVRHandPrefab.
  2. Inspector 面板,执行以下操作:
    • 确保 Skinned Mesh Renderer 组件被启用
    • Materials 下,输入要使用材质数量,然后再材质列表中拖动材质。默认情况下,大小为 1 。
    • LightingCastShadows 选在如果投影阴影
    • Probes 下 光照探针列表中,选择渲染器如何使用插值光照探针。默认情况下,渲染器使用一个插值光照探针。

使用高频跟踪手势

高频手部跟踪提供更强大和可靠的手势检测、稳定的手部描绘,以及约 10% 的延迟改进。这为使用手作为输入的用户创建了自然手部运动的无缝复制和更身临其境的体验。使用高频跟踪的会导致抖动略有增加,特别是在弱光条件下。

  1. Inspector 面板 选择 OVRCameraRig
  2. Inspector 面板 Quest FeaturesHandTrackingFrequency 选项中选择 High

获取 Bone ID

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 系统应用相同的交互,

Pinch

捏合是使用手势与 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);

Pointer Pose

OVR Hand 提供手势指针姿势,以便交互可以与 Quest 保持一致。它提供 从手部到跟踪空间中的起点和终点。强烈建议使用 PointerPose 来确定用户在 UI 交互情况下指向的方向。

手部跟踪信息

OVRHand.IsTracked 检测当前手是否可见,并且被 Oculus 设备跟踪。
HandConfidence 设置追踪的相似度。

获取手部模型缩放

HandScale 获取用户手部模型缩放,默认手部模型缩放为 1.0 该值可以随时更改

系统手势

唤起系统手势是一个保留手势,允许用户通过手势唤起 Oculus 菜单,当用户惯用手手掌朝向用户并用食指捏合时,会触发此事件

若要检测惯用手,调用 IsDominantHand 属性。如果返回为 true ,通过调用 IsSystemGestureInProgress 可以检查用户是否正在执行系统手势。

你可能感兴趣的:(UnityXR,unity,游戏引擎)