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

প্রযোজ্য XR ডিভাইস
এই নির্দেশিকা আপনাকে এই ধরণের XR ডিভাইসের অভিজ্ঞতা তৈরি করতে সাহায্য করবে।
XR হেডসেট
তারযুক্ত XR চশমা

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

একটি সেশন অ্যাক্সেস করুন

আপনার অ্যাপ তৈরি করতে পারে এমন একটি Jetpack XR রানটাইম Session মাধ্যমে হাতের তথ্য অ্যাক্সেস করুন।

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

XR সেশনে ডিফল্টরূপে হ্যান্ড ট্র্যাকিং সক্ষম করা থাকে না। হ্যান্ড ডেটা পেতে, সেশনটি কনফিগার করুন এবং HandTrackingMode.BOTH মোড সেট করুন:

val newConfig = session.config.copy(
    handTracking = Config.HandTrackingMode.BOTH
)
when (val result = session.configure(newConfig)) {
    is SessionConfigureSuccess -> TODO(/* Success! */)
    else ->
        TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */)
}

হাতের তথ্য উদ্ধার করুন

বাম এবং ডান হাতের জন্য আলাদাভাবে হাতের তথ্য পাওয়া যায়। প্রতিটি জয়েন্টের ভঙ্গি অবস্থান অ্যাক্সেস করতে প্রতিটি হাতের 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)
}

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

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

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

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

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

// the down direction points in the same direction as the palm
val angle = Vector3.angleBetween(palmPose.rotation * Vector3.Down, Vector3.Up)
palmEntity.setEnabled(angle > Math.toRadians(40.0))

val transformedPose =
    session.scene.perceptionSpace.transformPoseTo(
        palmPose,
        session.scene.activitySpace,
    )
val newPosition = transformedPose.translation + transformedPose.down * 0.05f
palmEntity.setPose(Pose(newPosition, transformedPose.rotation))

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

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

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

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

হাতের মৌলিক অঙ্গভঙ্গি সনাক্ত করুন

হাতের জয়েন্টের ভঙ্গি ব্যবহার করে হাতের মৌলিক অঙ্গভঙ্গি সনাক্ত করুন। প্রদত্ত ভঙ্গি হিসেবে নিবন্ধিত হওয়ার জন্য জয়েন্টগুলি কোন পরিসরে থাকা উচিত তা নির্ধারণ করতে হাতের জয়েন্টের নিয়মাবলী দেখুন।

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

val thumbTip = handState.handJoints[HandJointType.HAND_JOINT_TYPE_THUMB_TIP] ?: return false
val thumbTipPose = session.scene.perceptionSpace.transformPoseTo(thumbTip, session.scene.activitySpace)
val indexTip = handState.handJoints[HandJointType.HAND_JOINT_TYPE_INDEX_TIP] ?: return false
val indexTipPose = session.scene.perceptionSpace.transformPoseTo(indexTip, session.scene.activitySpace)
return Vector3.distance(thumbTipPose.translation, indexTipPose.translation) < 0.05

আরও জটিল অঙ্গভঙ্গির একটি উদাহরণ হল "থামুন" অঙ্গভঙ্গি। এই অঙ্গভঙ্গিতে, প্রতিটি আঙুল প্রসারিত করা উচিত, অর্থাৎ, প্রতিটি আঙুলের প্রতিটি জয়েন্ট মোটামুটি একই দিকে নির্দেশিত হওয়া উচিত:

val threshold = toRadians(angleInDegrees = 30f)
fun pointingInSameDirection(joint1: HandJointType, joint2: HandJointType): Boolean {
    val forward1 = handState.handJoints[joint1]?.forward ?: return false
    val forward2 = handState.handJoints[joint2]?.forward ?: return false
    return Vector3.angleBetween(forward1, forward2) < threshold
}
return pointingInSameDirection(HandJointType.HAND_JOINT_TYPE_INDEX_PROXIMAL, HandJointType.HAND_JOINT_TYPE_INDEX_TIP) &&
    pointingInSameDirection(HandJointType.HAND_JOINT_TYPE_MIDDLE_PROXIMAL, HandJointType.HAND_JOINT_TYPE_MIDDLE_TIP) &&
    pointingInSameDirection(HandJointType.HAND_JOINT_TYPE_RING_PROXIMAL, HandJointType.HAND_JOINT_TYPE_RING_TIP)

হাতের অঙ্গভঙ্গির জন্য কাস্টম সনাক্তকরণ তৈরি করার সময় নিম্নলিখিত বিষয়গুলি মনে রাখবেন:

  • ব্যবহারকারীদের যেকোনো অঙ্গভঙ্গির ভিন্ন ভিন্ন ব্যাখ্যা থাকতে পারে। উদাহরণস্বরূপ, কেউ কেউ আঙ্গুলগুলো বাইরে বের করে দেখানোর জন্য "থামুন" অঙ্গভঙ্গি বিবেচনা করতে পারেন, আবার কেউ কেউ আঙ্গুলগুলো কাছাকাছি রাখাকে আরও স্বজ্ঞাত বলে মনে করতে পারেন।
  • কিছু অঙ্গভঙ্গি বজায় রাখা অস্বস্তিকর হতে পারে। এমন স্বজ্ঞাত অঙ্গভঙ্গি ব্যবহার করুন যা ব্যবহারকারীর হাতে চাপ না দেয়।

ব্যবহারকারীর গৌণ হাত নির্ধারণ করুন

অ্যান্ড্রয়েড সিস্টেম ব্যবহারকারীর প্রাথমিক হাতে সিস্টেম নেভিগেশন রাখে, যেমনটি ব্যবহারকারী সিস্টেম পছন্দগুলিতে নির্দিষ্ট করে। সিস্টেম নেভিগেশন অঙ্গভঙ্গির সাথে দ্বন্দ্ব এড়াতে আপনার কাস্টম অঙ্গভঙ্গির জন্য সেকেন্ডারি হাত ব্যবহার করুন:

val handedness = Hand.getPrimaryHandSide(activity.contentResolver)
val secondaryHand = if (handedness == Hand.HandSide.LEFT) Hand.right(session) else Hand.left(session)
val handState = secondaryHand?.state ?: return
detectGesture(handState)


OpenXR™ এবং OpenXR লোগো হল The Khronos Group Inc. এর মালিকানাধীন ট্রেডমার্ক এবং চীন, ইউরোপীয় ইউনিয়ন, জাপান এবং যুক্তরাজ্যে ট্রেডমার্ক হিসেবে নিবন্ধিত।