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))
}