ARCore cho Jetpack XR có thể cung cấp thông tin về bàn tay được phát hiện của người dùng, đồng thời cung cấp thông tin về tư thế cho bàn tay và các khớp liên quan. Dữ liệu về bàn tay này có thể được dùng để đính kèm các thực thể và mô hình vào bàn tay của người dùng, ví dụ: trình đơn công cụ:
Tạo phiên ARCore cho Jetpack XR
Truy cập thông tin về bàn tay thông qua phiên ARCore cho Jetpack XR. Hãy xem phần Tìm hiểu vòng đời của Phiên để lấy Session
.
Truy xuất dữ liệu về bàn tay
Dữ liệu về tay có sẵn riêng cho tay trái và tay phải. Sử dụng state
của mỗi tay để truy cập vào các vị trí tạo dáng cho từng khớp:
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.
}
Kim có các thuộc tính sau:
isActive
: liệu tay có đang được theo dõi hay không.handJoints
: bản đồ các khớp tay đến tư thế. Tư thế khớp tay được chỉ định theo các tiêu chuẩn OpenXR.
Sử dụng dữ liệu về cử chỉ tay trong ứng dụng
Bạn có thể sử dụng vị trí của các khớp tay của người dùng để neo các đối tượng 3D vào tay của người dùng, chẳng hạn như để đính kèm một mô hình vào lòng bàn tay trái:
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))
}
Hoặc để đính kèm một mô hình vào đầu ngón trỏ của tay phải:
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))
}