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:

Jetpack XR için ARCore oturumu oluşturma

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

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 { // or Hand.right(session)
  // Hand state has been updated.
  // Use the state of hand joints to update an entity's position.
}

Eller aşağıdaki özelliklere sahiptir:

  • isActive: Elin izlenip izlenmediği.
  • handJoints: El eklemlerinin pozlarla eşlendiğ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:

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

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

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