Appearance
获得手的信息
获得两只手的信息
csharp
// 获得左手信息
HandInfo leftHand = ARHandManager.leftHand;
// 获得右手信息
HandInfo rightHand = ARHandManager.rightHand;TIP
以下为具体到每个手的信息,均定义在 HandInfo 类中。 开发者需要先基于 ARHandManager.leftHand 和 ARHandManager.rightHand 获得左手和右手的 HandInfo 之后才能进一步获得下面的信息。
判断当前是否是裸手交互模式
csharp
if (InputSystem.Instance.controllerType == ControllerType.HandTracking)
{
//开发者逻辑
}判断手当前是否存在
TIP
手在大约腹部的位置其实也可以被检测到,此时虽然虚拟视野内看不到手,但是实际上手依然是存在的即 Exist 为 true
csharp
//左手当前是否存在
if (InputSystem.Instance.controllerType == ControllerType.HandTracking && ARHandManager.leftHand.Exist)
{
//开发者逻辑
}判断手当前是否存在于视野中
csharp
//左手掌心点当前是否存在于视野中
if (InputSystem.Instance.controllerType == ControllerType.HandTracking && ARHandManager.leftHand.InView(HandJointType.Palm))
{
//开发者逻辑
}获得手的类型
csharp
HandInfo handInfo = ARHandManager.leftHand;
Debug.Log(handInfo.handType);csharp
public enum HandType
{
Left,
Right,
}获得手的动作
csharp
//输出左手当前做出的动作
Debug.Log(ARHandManager.leftHand.gestureType);csharp
public enum GestureType
{
OpenHand,
Grab,
Pinch,
Point,
Victory,
Call,
}获得关节点信息
获得特定关节点信息
csharp
HandInfo leftHand = ARHandManager.leftHand;
if (leftHand.JointDataExist(HandJointType.Index_4))
{
Pose indexFingerTip = leftHand.GetJointData(HandJointType.Index_4);
Debug.Log("左手食指指尖的位置:" + indexFingerTip.position);
Debug.Log("左手食指指尖的朝向:" + indexFingerTip.rotation);
}关节点枚举定义
csharp
public enum HandJointType
{
Thumb_0,
Thumb_1,
Thumb_2,
/// <summary>
/// 拇指尖
/// </summary>
Thumb_3,
/// <summary>
/// 食指根节点
/// </summary>
Index_1,
Index_2,
Index_3,
/// <summary>
/// 食指尖
/// </summary>
Index_4,
/// <summary>
/// 中指根节点
/// </summary>
Middle_1,
Middle_2,
Middle_3,
/// <summary>
/// 中指指尖
/// </summary>
Middle_4,
Ring_1,
Ring_2,
Ring_3,
/// <summary>
/// 无名指指尖
/// </summary>
Ring_4,
Pinky_0,
/// <summary>
/// 小指根节点
/// </summary>
Pinky_1,
Pinky_2,
Pinky_3,
/// <summary>
/// 小指指尖
/// </summary>
Pinky_4,
/// <summary>
/// 掌心点
/// </summary>
Palm,
/// <summary>
/// 手腕横切线,靠近拇指根节点的点
/// </summary>
Wrist_Thumb,
/// <summary>
/// 手腕横切线,靠近小指根节点的点
/// </summary>
Wrist_Pinky,
/// <summary>
/// 手腕横切线,中点
/// </summary>
Wrist_Middle,
}手掌相关信息
| 字段 | 类型 | 说明 |
|---|---|---|
| palmNormal | Vector3 | 手掌面向的方向 |
| palmDirection | Vector3 | 手掌指尖朝向(从手腕点到中指根节点的方向) |
csharp
HandInfo leftHand = ARHandManager.leftHand;
Debug.Log("手掌面向的方向:" + leftHand.palmNormal);- 判断手掌当前是否朝向头部
csharp
//判断左手掌心与head的连线与手掌palmNormal的夹角是否在60度内
ARHandManager.leftHand.isPalmFacingHead(60);获得射线信息
| 字段 | 类型 | 说明 |
|---|---|---|
| rayPoint_Start | Vector3 | 射线起点的世界坐标 |
| rayPoint_End | Vector3 | 射线终点的世界坐标 |
| rayDirection | Vector3 | 从射线起始点到终止点的射线方向(单位向量) |
手接触相关(包括射线接触和近距离接触两种)
| 字段/属性 | 类型 | 说明 |
|---|---|---|
| IsRayContacting | bool | 指示当前射线是否正打在某个物体上 |
| CurRayContactingTarget | Collider | 当前射线碰到的 Collider(仅仅是射线碰到,并不是射线抓取) |
| IsCloseContacting | bool | 指示手是否正在近距离触碰某个物体(拇指或食指) |
| CurCloseContactingTarget | Collider | 当前正在被近距离触碰的 Collider(仅仅是近距离碰到,并不是近距离抓取) |
| IsContacting | bool | 指示当前射线是否正打在某个物体上或者手是否正在近距离触碰某个物体(拇指或食指) |
| CurContactingTarget | Collider | 当前正在被远距离或近距离碰到的 Collider(仅仅是碰到,并不是抓取) |
手抓取相关(包括射线接触和近距离接触两种)
| 字段/属性 | 类型 | 说明 |
|---|---|---|
| IsRayGrabbing | bool | 指示手正在通过射线抓取物体 |
| CurRayGrabbingTarget | Transform | 当前射线正在抓取的物体 |
| IsCloseGrabbing | bool | 指示手正在通过近距离的方式抓取物体 |
| CurCloseGrabbingTarget | Transform | 当前正在近距离抓取的物体 |
| IsGrabbing | bool | 指示手当前是否正在抓取物体(无论射线还是近距离) |
| CurGrabbingTarget | Transform | 当前手正在抓取的物体(无论射线还是近距离) |
获得双手状态
双手射线抓取状态
csharp
/// <summary>
/// 正在执行双手射线抓取操作
/// </summary>
public static bool isTwoHandRayGrabbing;
void Test()
{
Debug.Log("当前正在执行双手射线抓取操作:" + HandInfo.isTwoHandRayGrabbing);
}双手近距离抓取状态
csharp
/// <summary>
/// 正在执行双手近距离抓取操作
/// </summary>
public static bool isTwoHandCloseGrabbing;
void Test()
{
Debug.Log("当前正在执行双手近距离抓取操作:" + HandInfo.isTwoHandCloseGrabbing);
}