ARCore per Jetpack XR può fornire informazioni sulle mani rilevate dall'utente e sulle pose delle mani e delle articolazioni associate. Questi dati sulle mani possono essere utilizzati per associare entità e modelli alle mani di un utente, ad esempio un menu strumenti:
Creare una sessione ARCore per Jetpack XR
Accedi alle informazioni sulla mano tramite una sessione ARCore per Jetpack XR. Consulta la sezione Comprendere il ciclo di vita di una sessione per ottenere un Session
.
Recuperare i dati della mano
I dati relativi alle mani sono disponibili separatamente per la mano sinistra e la mano destra. Usa state
di ogni mano per accedere alle posizioni delle pose per ogni articolazione:
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.
}
Le mani hanno le seguenti proprietà:
isActive
: indica se la mano è in fase di monitoraggio.handJoints
: una mappa delle articolazioni delle mani alle pose. Le pose delle articolazioni delle mani sono specificate dagli standard OpenXR.
Utilizzare i dati delle mani nella tua app
Le posizioni delle articolazioni delle mani di un utente possono essere utilizzate per ancorare oggetti 3D alle mani dell'utente, ad esempio per attaccare un modello al palmo sinistro:
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))
}
In alternativa, per collegare un modello alla punta del dito indice della mano destra:
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))
}