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