ps.先前已经用过手势跟踪了,这里将官方文档进行翻译,从而更好的理解手势跟踪
介绍
NRSDK的手部跟踪功能可以跟踪手部关键点的位置,并实时识别手部姿势。手部姿势显示在第一人称视图中,用于与在世界中的虚拟对象进行沉浸的交互。
能力
- NRSDK可以通过世界坐标系追踪手,并注释23个关键点的位置和方向
- NRSDK目前支持任意一只手的六个手势;(ps.目前好像是7个)
- 在跟踪手部姿势的同时,NRSDK也返回到是否有手部被跟踪的状态
- NRSDK提供左手/右手检测功能
- 当使用手作为输入时,手的姿势会驱动激光光标指针,其行为与标准控制器光标类似
手势
一般手势
选择手势
- 只要食指和拇指捏在一起(不管其他手指的姿势如何),就被认为是捏的姿势。
- 以上手势都将被识别为捏/选择。
系统手势
- 保持这个手势1.2秒,即可调出主菜单。
- 左手和右手都会被识别。
手指指挥棒
与控制器类似,NRSDK为每只手提供一个指针,以便与目标进行交互。可以从每只手的HandState
获得指针姿势以及指针姿势是否正在被跟踪。
指针姿势必须满足以下条件才能正确跟踪:
- 手被认出了
- 手掌方向指向前方
基本指针样式包含在位于Assets>NRSDK>Prefabs>Hands
的NRHand_R
和NRHand_L
预制件中。您还可以根据指针姿势和相关数据,结合NRPointerRaycaster
中的一些数据,自定义指针的样式。
关节
NRSDK手部跟踪系统为每个识别的手部姿势(位置和方向)识别手部23个关键点的位置。
索引
关节方向
要求和限制
设备兼容性
Hand Tracking(手势跟踪)已在以下Android手机上进行了全面测试:
- Nreal Dev-Kit
- OnePlus:9R / 7T / 8T / 8 Pro 5G
- LG:V60 / V50S ThinQ 5G / V50 ThinQ 5G / G9 (Velvet 5G) / Wing
- SONY:Xperia 5 II / Xperia 1
- SAMSUNG:Galaxy Note20 5G / Galaxy S10+ / Galaxy S20+ 5G / Galaxy Z Fold 2 5G / Galaxy S21 5G / Galaxy Note20 Ultra / Galaxy Note10+ 5G / Galaxy A90 5G
- OPPO: Find X2 / Find x2 Pro / Find x3 Pro
- ZTE Axon 10 pro
- Black Shark 2 Pro
手部跟踪也可以在除上述设备之外的设备上运行,但稳定性无法保证。有关完整的兼容性列表,请参阅设备兼容性。
背景和摄像头
- Hand Tracking(手部跟踪) SDK使用on-board(板上的)摄像头来检测手,因此请确保从摄像头中可以看到手。
- 避免复杂的背景,纯色背景优先;
- 避免在相机框架中出现背光或弱光,或不平衡的照明条件;
手势
- 避免双手手指堆叠或交错;
- 避免不同的人的手;
- 避免快速移动;
- 关节的方向有可能被识别为转换的。如果出现这种情况,请将你的手从可见的区域移开,然后再次将它们移回。
开发者指南
手动跟踪的常见用法
简单的示例用例:
//如果输入来源成功转到手部跟踪,返回“true”
bool switchToHandTracking = NRInput.SetInputSource(InputSourceEnum.Hands);
//如果输入来源成功转到控制器,返回“true”
bool switchToController = NRInput.SetInputSource(InputSourceEnum.Controller);
//如果手部跟踪正在运行,返回“true”
bool isRunning = NRInput.Hands.IsRunning;
//返回右手的NRHand
NRHand hand = NRInput.Hands.GetHand(HandEnum.RightHand);
//如果用户现在正在执行系统手势,则返回true
bool isPerformingSystemGesture = NRInput.Hands.IsPerformingSystemGesture();
HandState(手部状态)的详细信息:
//返回右手的HandState
HandState handState = NRInput.Hands.GetHandState(HandEnum.RightHand);
//返回这只手是左手还是右手
HandEnum handEnum = handState.handEnum;
//如果该手被追踪,则返回true
bool isTracked = handState.isTracked;
//返回手射线指针的起点的Pose
Pose pointerPose = handState.pointerPose;
//如果手射线指针的姿势有效,则返回ture
bool pointerValid = handState.pointerPoseValid;
//如果这只手正在捏,则返回true
bool isPinching = handState.isPinching;
//returns the current pinch strength value of hand. The range is from 0 to 1
float pinchStrength = handState.pinchStrength;
//返回手的当前捏的力量的值。范围从0到1
HandGesture handGesture = handState.currentGesture;
//返回包含拇指指尖关节的位置和方向的Pose
Pose thumbTipPose = handState.GetJointPose(HandJointID.ThumbTip);
启用手部跟踪
-
使用NRSDK在Unity中创建一个新项目。有关更多设置说明,请参阅Getting Started with NRSDK(NRSDK入门)。
-
从场景层次中删除“Main Camera”。
-
从
Assets>NRSDK>Prefabs>NRCameraRig
中查找NRCameraRig
和NRInput
预置件。将它们拖动到场景层次。
-
在层次窗口中选择
NRInput
游戏对象以打开Inspector
窗口,然后选择Hands
作为Input Source Type(输入源类型)
。
-
从
Assets>NRSDK>Prefabs>Hands
中查找NRHand_R
和NRHand_L
。将它们相应地添加为NRInput
中Left and Right anchor(左右锚点)
的子游戏对象。
6. 现在您已经准备好进行手部跟踪,请参阅Tutorial: Manipulating an Object(教程:操纵对象)以添加更多与对象的交互。
样例包含在Unity package
中。有关详细信息,请参阅Assets>NRSDK>Demos>HandTracking
。