Skip to content

获得手的信息

获得两只手的信息

csharp
// 获得左手信息
HandInfo leftHand = InputSystem.LeftHand;
// 获得右手信息
HandInfo rightHand = InputSystem.RightHand;

TIP

以下为具体到每个手的信息,均定义在 HandInfo 类中。 开发者需要先基于 InputSystem.LeftHand 和 InputSystem.RightHand 获得左手和右手的 HandInfo 之后才能进一步获得下面的信息。

判断当前是否是裸手交互模式

csharp
if (InputSystem.CurrentActiveControllerType == InputType.Hand)
{
    //开发者逻辑
}
// 如果使用XRMan方式开发,也可以通过下方的方式获取
if (XRMan.Input.Current.Type == InputType.Hand) { 
    //开发者逻辑
}

判断手当前是否存在

TIP

手在大约腹部的位置其实也可以被检测到,此时虽然虚拟视野内看不到手,但是实际上手依然是存在的即 Exist 为 true

csharp
//需要结合当前交互类型判断

//左手当前是否存在
if (InputSystem.LeftHand.Exist)
{
    //开发者逻辑
}
// 如果使用XRMan方式开发,也可以通过下方的方式获取
if (XRMan.Input.Current.Left.Exist) { 
    //开发者逻辑
}

判断手当前是否存在于视野中

csharp
//需要结合当前交互类型判断

//左手掌心点当前是否存在于视野中
if (InputSystem.LeftHand.InView(HandJointType.Palm))
{
    //开发者逻辑
}
// 如果使用XRMan方式开发,也可以通过下方的方式获取
if (XRMan.Input.Hands.Left.InView(HandJointType.Palm))
{
    //开发者逻辑
}

获得手的类型

csharp
HandInfo handInfo = InputSystem.LeftHand;
Debug.Log(handInfo.handType);

获得手的动作

csharp
//输出左手当前做出的动作
Debug.Log(InputSystem.LeftHand.gestureType);

获得关节点信息

获得特定关节点信息

csharp
HandInfo leftHand = InputSystem.LeftHand;
if (leftHand.JointDataExist(HandJointType.Index_4))
{
    Pose indexFingerTip = leftHand.GetJointData(HandJointType.Index_4);
    Debug.Log("左手食指指尖的位置:" + indexFingerTip.position);
    Debug.Log("左手食指指尖的朝向:" + indexFingerTip.rotation);
}

手掌相关信息

字段
类型
说明
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);
}