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

相关内容

热门资讯

飞天茅台,又涨了100块,陈华... 作者:王一行 不到四个月,飞天茅台又涨价了。 加上3月31日那次涨价,今年飞天茅台的出厂价和零售价累...
银行理财收益缩水,机构集体喊话... 【大河财立方 记者 吴海舒 杨萨】“我自己买股票都没它能亏”,某社交平台上,一位网友晒出了自己购买的...
蒙商银行行长牛冠荣拟任内蒙古自... 蒙商银行行长牛冠荣拟任内蒙古自治区党委管理领导班子企业正职 人民财讯7月25日电,内蒙古自治区党委组...
首发经济破局 激活消费新动能 在昆明顺城购物中心,占地1800平方米的蜜雪冰城旗舰店人气爆棚,门口排满了前来打卡的消费者;蜡笔小新...
原创 谁... 坐在深圳南山的写字楼里往窗外看,无人机送外卖、机器人巡逻、满街的新能源车,很多外地人第一次来都会愣一...
“硬件创新基础设施”嘉立创今日... 7月24日,深圳嘉立创科技集团股份有限公司(以下简称“嘉立创”)正式启动网上网下发行申购,申购简称为...
深化产教融合 推进数智育人 哈... 7月23日,由阿里国际人工智能人才孵化中心(以下简称“阿里国际AITIC”)主办的“智启未来·数智赋...
陈春玉够“稳”,但魔法原子还“... 今年上半年,魔法原子获得了春晚的热度,但是也受到了人事和商业化的质疑。面对外界疑问,陈春玉依靠扎实的...
实物黄金和纸黄金的交易成本如何... 在黄金投资领域,实物黄金和纸黄金是较为常见的两种投资方式,而了解它们的交易成本计算方法对于投资者来说...
这些绩优股发布拟增持计划(附股... 7月以来,上市公司密集发布拟增持计划。与此同时,德明利、广钢气体、柯力传感等多家公司还发布了承诺不减...
特斯拉一周跌没18%,马斯克自... 马斯克这周不好过——特斯拉周五跌超2%,本周累跌近18%,创2022年以来最大单周跌幅;SpaceX...
原创 世... 文|江月白 编辑|江月白 近期中东局势再度掀起波澜,也门胡塞武装突然宣布封锁红海的曼德海峡,这一举...
农业农村部:乡村消费韧性持续凸... 本报记者 刘萌 7月24日,国新办举行新闻发布会介绍2026年上半年农业农村经济运行情况。农业农村部...
一杯鲜啤引爆夏夜狂欢 如东啤酒... 扬子晚报讯(记者 郭小川 通讯员 王军)如火的夏夜,怎能少了一杯清凉爽口的鲜啤?连日来,夜色中的如东...
原创 通... 时间定了,下周油价大涨!2026年汽柴油第10次上涨在即,时间将于7月31日24时准时调价,倒计时仅...
Waymo计划独立进入两地Ro... 7 月 25 日消息,据《金融时报》报道,Alphabet 旗下自动驾驶出租车企业 Waymo 在一...
日均狂赚2.39亿!宁德时代拿... 图片来源:图虫 7月24日晚,宁德时代(300750.SZ)披露2026年半年报,报告期内,公司实现...
长鑫科技下周一上市:合肥产投集... 长鑫科技下周一上市,大股东 合肥产投 都有哪些布局? 长鑫上市,合肥产投能赚多少? 作为长鑫科技发起...
ETF市场周报 | 市场回升趋... 市场回顾: 本周(2026年7月20日-7月24日),A股市场触底反弹,前4日整体走势强劲,周五略有...
美股开盘:指数涨跌不一 ,存储... 7月24日晚间,美股三大指数开盘后涨跌不一。截至发稿,标普500指数涨0.24%,道指涨0.32%,...