Jetpack XR-এর জন্য ARCore ব্যবহার করে হাত দিয়ে কাজ করুন

জেটপ্যাক এক্সআর-এর জন্য ARCore ব্যবহারকারীর শনাক্ত করা হাত সম্পর্কে তথ্য প্রদান করতে পারে এবং হাত এবং তাদের সংযুক্ত জয়েন্টগুলির জন্য পোজ তথ্য দেয়। এই হ্যান্ড ডেটা ব্যবহারকারীর হাতে সত্তা এবং মডেল সংযুক্ত করতে ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ, একটি টুল মেনু:

একটি অধিবেশন প্রাপ্ত

একটি Android XR Session মাধ্যমে হাতের তথ্য অ্যাক্সেস করুন। একটি Session পাওয়ার জন্য একটি সেশনের জীবনচক্র বুঝতে দেখুন।

সেশন কনফিগার করুন

এক্সআর সেশনে ডিফল্টরূপে হ্যান্ড ট্র্যাকিং সক্ষম হয় না। হ্যান্ড ডেটা পেতে, সেশনটি কনফিগার করুন:

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! */)
}

হাতের ডেটা পুনরুদ্ধার করুন

হাতের ডেটা বাম এবং ডান হাতের জন্য আলাদাভাবে উপলব্ধ। প্রতিটি জয়েন্টের জন্য পোজ পজিশন অ্যাক্সেস করতে প্রতিটি হাতের state ব্যবহার করুন:

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

হাতের নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  • isActive : হাত ট্র্যাক করা হচ্ছে কিনা।
  • handJoints : পোজ করার জন্য হাতের জয়েন্টগুলির একটি মানচিত্র। হাতের জয়েন্টের ভঙ্গি OpenXR মান দ্বারা নির্দিষ্ট করা হয়।

আপনার অ্যাপে হাতের ডেটা ব্যবহার করুন

ব্যবহারকারীর হাতের জয়েন্টগুলির অবস্থানগুলি ব্যবহারকারীর হাতে 3D বস্তুগুলিকে নোঙ্গর করতে ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ, বাম হাতের তালুতে একটি মডেল সংযুক্ত করতে:

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

অথবা আপনার ডান হাতের তর্জনীর ডগায় একটি মডেল সংযুক্ত করতে:

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