使用 ARCore for Jetpack XR 與手部互動

ARCore for Jetpack XR 可提供使用者偵測到的手部資訊,並提供手部和相關關節的姿勢資訊。這類手部資料可用於將實體和模型附加至使用者的手部,例如工具選單:

建立 ARCore 工作階段 (適用於 Jetpack XR)

透過 ARCore for Jetpack XR 工作階段存取手部資訊。請參閱「瞭解工作階段的生命週期」一文,瞭解如何取得 Session

擷取手部資料

手部資料可分別針對左手和右手提供。使用每隻手的 state 存取每個關節的姿勢位置:

Hand.left(session).state.collect { // or Hand.right(session)
  // Hand state has been updated.
  // Use the state of hand joints to update an entity's position.
}

手部具有下列屬性:

  • isActive:是否追蹤手部。
  • handJoints:手部關節與姿勢的對應表。手部關節姿勢由 OpenXR 標準指定。

在應用程式中使用手部資料

使用者手部關節的位置可用來將 3D 物件錨定至使用者的手上,例如將模型附加到左手掌上:

Hand.left(session)?.state?.collect { leftHandState ->
  val palmPose = leftHandState.handJoints[HandJointType.PALM] ?: return@collect

  // the down direction points in the same direction as the palm
  val angle = Vector3.angleBetween(palmPose.rotation * Vector3.Down, Vector3.Up)
  palmEntity.setHidden(angle > Math.toRadians(40.0))

  val transformedPose =
    session.perceptionSpace.transformPoseTo(
      palmPose,
      session.activitySpace,
    )
  val newPosition = transformedPose.translation + transformedPose.down*0.05f
  palmEntity.setPose(Pose(newPosition, transformedPose.rotation))
}

如要將模型附加到右手食指指尖,請按照下列步驟操作:

Hand.right(session)?.state?.collect { rightHandState ->
  val tipPose = rightHandState.handJoints[HandJointType.INDEX_TIP] ?: return@collect

  // the forward direction points towards the finger tip.
  val angle = Vector3.angleBetween(tipPose.rotation * Vector3.Forward, Vector3.Up)
  indexEntity.setHidden(angle > Math.toRadians(40.0))

  val transformedPose =
    session.perceptionSpace.transformPoseTo(
      tipPose,
      session.activitySpace,
    )
  val position = transformedPose.translation + transformedPose.forward * 0.03f
  val rotation = Quaternion.fromLookTowards(transformedPose.up, Vector3.Up)
  indexEntity.setPose(Pose(position, rotation))
}