Jetpack XR için ARCore'u kullanarak ellerinizle çalışma

Jetpack XR için ARCore, kullanıcının algılanan elleri hakkında bilgi sağlayabilir ve eller ile ilişkili eklemler için duruş bilgisi verir. Bu el verileri, kullanıcının ellerine öğe ve modeller (ör. bir araç menüsü) eklemek için kullanılabilir:

Oturum edinme

Android XR Session aracılığıyla el bilgilerine erişin. Session almak için Oturumların yaşam döngüsünü anlama başlıklı makaleyi inceleyin.

Oturumu yapılandırma

El takibi, XR oturumlarında varsayılan olarak etkin değildir. El verilerini almak için oturumu yapılandırın:

val newConfig = session.config.copy(
    handTracking = Config.HandTrackingMode.Enabled
)
when (val result = session.configure(newConfig)) {
    is SessionConfigureConfigurationNotSupported ->
        TODO(/* Some combinations of configurations are not valid. Handle this failure case. */)
    is SessionConfigurePermissionsNotGranted ->
        TODO(/* The required permissions in result.permissions have not been granted. */)
    is SessionConfigureSuccess -> TODO(/* Success! */)
}

El verilerini alma

El verileri sol ve sağ el için ayrı olarak kullanılabilir. Her eklemin poz konumlarına erişmek için her elin state simgesini kullanın:

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

Eller aşağıdaki özelliklere sahiptir:

  • isActive: Elin izlenip izlenmediği.
  • handJoints: El eklemlerinin pozlarla eşleştirildiği bir harita. El eklemi pozları OpenXR standartları ile belirtilir.

Uygulamanızda el verilerini kullanma

Kullanıcının el eklemlerinin konumları, 3D nesneleri kullanıcının ellerine sabitlemek için kullanılabilir. Örneğin, bir modeli sol avuç içine eklemek için:

val palmPose = leftHandState.handJoints[HandJointType.PALM] ?: return

// 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 =
    scenecoreSession.perceptionSpace.transformPoseTo(
        palmPose,
        scenecoreSession.activitySpace,
    )
val newPosition = transformedPose.translation + transformedPose.down * 0.05f
palmEntity.setPose(Pose(newPosition, transformedPose.rotation))

Dilerseniz sağ elinizin işaret parmağının ucuna bir model eklemek için:

val tipPose = rightHandState.handJoints[HandJointType.INDEX_TIP] ?: return

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

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