Jetpack XR के लिए ARCore का इस्तेमाल करके, हाथों से काम करना

Jetpack XR के लिए ARCore, उपयोगकर्ता के हाथों के बारे में जानकारी दे सकता है. साथ ही, हाथों और उनसे जुड़े जोड़ों के पोज़ की जानकारी भी देता है. हाथ के इस डेटा का इस्तेमाल, उपयोगकर्ता के हाथों पर इकाइयों और मॉडल को अटैच करने के लिए किया जा सकता है. उदाहरण के लिए, टूल मेन्यू:

Jetpack XR के लिए ARCore सेशन बनाना

Jetpack XR सेशन के लिए ARCore की मदद से, हाथ की जानकारी ऐक्सेस करें. Session पाने के लिए, सेशन के लाइफ़साइकल को समझना देखें.

हाथ का डेटा वापस पाना

हाथ का डेटा, बाएं और दाएं हाथ के लिए अलग-अलग उपलब्ध होता है. हर जोड़ की पोज़िशन ऐक्सेस करने के लिए, हर हाथ के state का इस्तेमाल करें:

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

हाथों की ये प्रॉपर्टी होती हैं:

  • isActive: हाथ को ट्रैक किया जा रहा है या नहीं.
  • handJoints: हाथ के जोड़ों को पोज़ के हिसाब से मैप करना. हाथ के जोड़ों के पोज़, OpenXR स्टैंडर्ड के हिसाब से तय किए जाते हैं.

अपने ऐप्लिकेशन में हाथ के डेटा का इस्तेमाल करना

उपयोगकर्ता के हाथ के जोड़ों की पोज़िशन का इस्तेमाल, उपयोगकर्ता के हाथों पर 3D ऑब्जेक्ट को ऐंकर करने के लिए किया जा सकता है. उदाहरण के लिए, बाईं हथेली पर मॉडल अटैच करने के लिए:

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

इसके अलावा, अपने दाएँ हाथ की इंडेक्स फ़िंगर की नोक पर मॉडल अटैच करने के लिए:

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