Oculus 手势追踪
admin
2024-03-22 16:44:47
0

手部设置入门

设置相机

  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 可以检查用户是否正在执行系统手势。

相关内容

热门资讯

大疆状告美国FCC 文︱陆弃 大疆创新将美国联邦通信委员会(FCC)推上法庭,这不仅是一场企业与监管机关间的程序对抗,更...
新春坚守“医”线 守护万家安康 2026年新春佳节 万家灯火,阖家团圆 年味在氤氲的烟火气中弥漫 祈愿融进暖意融融的叙谈里 而同一时...
AMD与Nutanix建立战略... IT之家 2 月 26 日消息,AMD 与超融合企业 Nutanix 当地时间 25 日共同宣布,双...
深圳传音控股股份有限公司 20... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...
银行“开抢”压岁钱 春节过后,孩子们的红包往哪存?近日,多家银行推出儿童专属存款产品,利率略高于普通存款利率,起存门槛也...
工行官宣,宋建华离任 【导读】工商银行高级业务总监宋建华因年龄原因离任 中国基金报记者 嘉合 2月25日,工商银行发布公告...
打造新场景新业态 政策加码挖潜... 来源:滚动播报 (来源:经济参考报) 2月24日召开的国务院常务会议研究推进银发经济和养老服务发展有...
从年味里看春节消费新图景 从年味里看春节消费新图景 2月20日,游客在位于天津的国家海洋博物馆“未来海洋”展厅参观。 春...
原创 羽... 文丨郭小兴 编辑丨百进 来源丨新商悟 (本文约为1200字) 在消费电子行业增速放缓的关口,一家企业...
欧洲能否向乌克兰派兵?“得等普... 【文/观察者网 陈思佳】当地时间2月24日,俄乌冲突四周年之际,乌克兰总统泽连斯基在基辅欢迎了欧洲多...
1月泰国大米出口同比下降17.... 来源:中国新闻网 中新社曼谷2月25日电(李映民 刘宇博)泰国大米出口商协会主席查伦25日表示,20...
金价银价,双双大涨 大河财立方消息,2月23日,受美国关税政策的不确定性及避险情绪影响推动,国际金价银价开盘再度双双走高...
春天养肝正当时,记住这三点,一... 这两天出门,大伙儿有没有发现?风变软了,不似冬天那般刺骨,路边的树枝也悄悄冒了嫩芽,地气一点点往上走...
【网络股指数ETF收涨约2.3... 【网络股指数ETF收涨约2.3%,领跑美股行业ETF】周三(2月25日),网络股指数ETF收涨2.2...
“哑铃型”结构显现 白酒市场如... 来源:滚动播报 (来源:北京商报) 随着春节假期结束,白酒市场逐渐步入消费淡季。今年春节假期,白酒市...
AI产业链方向低位震荡,人工智... 2月25日,AI产业链方向低位震荡,光通信、AIGC、AI算力等板块承压。截至收盘,中证人工智能主题...
大疆起诉美监管,数据看清资金连... 近期国产无人机龙头大疆正式起诉美国联邦通信委员会,挑战其将产品列入“受管制清单”的决定。消息一出,不...
欧盟终结小额免税政策!7月1日... 近日,欧盟最新跨境电商进口监管改革方案正式生效,核心变革在于废除长期实施的“价值低于150欧元小包裹...
个税年度汇算,今起预约! 据国家税务总局通告,2025年度个人所得税综合所得汇算清缴办理时间为2026年3月1日至6月30日。...
智洋创新终止收购灵明光子控股权... 2月25日晚间,智洋创新(SH688191,停牌)发布公告,宣布终止筹划以发行股份、可转债或现金等方...