अपने Android ऐप्लिकेशन में हिट-टेस्ट करना

अपने सीन में किसी 3D ऑब्जेक्ट की सही जगह तय करने के लिए, हिट-टेस्ट करें. सही प्लेसमेंट यह पक्का करता है कि एआर कॉन्टेंट को उचित (साफ़ तौर पर) आकार में रेंडर किया गया हो.

हिट नतीजे के टाइप

हिट-टेस्ट से चार अलग-अलग तरह के हिट नतीजे मिल सकते हैं, जैसा कि नीचे दी गई टेबल में दिखाया गया है.

हिट के नतीजे का टाइप ब्यौरा ओरिएंटेशन इस्तेमाल के बारे में जानकारी मेथड कॉल
गहराई (DepthPoint) किसी पॉइंट की सही गहराई और ओरिएंटेशन का पता लगाने के लिए, पूरे सीन की गहराई से जानकारी का इस्तेमाल करता है 3D सतह के लंबवत वर्चुअल ऑब्जेक्ट को किसी आर्बिट्रेरी सतह पर रखें (सिर्फ़ फ़र्श और दीवारों पर ही नहीं) यह सुविधा काम कर सके, इसके लिए ArDepthMode को चालू करना होगा.

Frame.hitTest(…), सामान लौटाने की सूची में DepthPoint देखें
Plane किसी पॉइंट की सही गहराई और ओरिएंटेशन का पता लगाने के लिए, वह हॉरिज़ॉन्टल और/या वर्टिकल सतह को हिट करता है 3D सतह के लंबवत प्लेन की पूरी ज्यामिति का इस्तेमाल करके, किसी समतल जगह (फ़्लोर या दीवार) पर कोई चीज़ रखें. स्केल की ज़रूरत तुरंत है. डेप्थ हिट-टेस्ट के लिए फ़ॉलबैक Frame.hitTest(…), सामान लौटाने की सूची में Plane देखें
फ़ीचर पॉइंट (Point) किसी पॉइंट की सही पोज़िशन और ओरिएंटेशन का पता लगाने के लिए, उपयोगकर्ता के टैप करने की जगह के आस-पास की विज़ुअल सुविधाओं के आधार पर काम करता है 3D सतह के लंबवत किसी ऑब्जेक्ट को किसी आर्बिट्रेरी सतह पर रखें (सिर्फ़ फ़र्श और दीवारों पर नहीं) Frame.hitTest(…), सामान लौटाने की सूची में Point देखें
झटपट प्लेसमेंट (InstantPlacementPoint) कॉन्टेंट दिखाने के लिए स्क्रीन स्पेस का इस्तेमाल करता है. शुरुआत में यह ऐप्लिकेशन से मिली अनुमानित गहराई का इस्तेमाल करता है. तुरंत काम करता है, लेकिन जब ARCore वास्तविक सीन की ज्यामिति का पता लगा लेगा, तो आस-पास का पोज़ और वास्तविक गहराई बदल जाएगी +Y ऊपर की ओर, गुरुत्वाकर्षण के विपरीत हवाई जहाज़ की पूरी ज्यामिति का इस्तेमाल करके सतह (फ़्लोर या दीवार) पर कोई वस्तु रखें, जहां तेज़ प्लेसमेंट ज़रूरी है. साथ ही अनुभव, अज्ञात गहराई और स्केल को सहन कर सकता है Frame.hitTestInstantPlacement(float, float, float)

स्टैंडर्ड हिट-टेस्ट करना

हिट-टेस्ट करने के लिए Frame.hitTest() को कॉल करें. इसके लिए, TapHelper यूटिलिटी का इस्तेमाल करें, ताकि MotionEvent को एआर व्यू से देखा जा सके.

Java

MotionEvent tap = tapHelper.poll();
if (tap == null) {
  return;
}

if (usingInstantPlacement) {
  // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
  // how far away the anchor will be placed, relative to the camera's view.
  List<HitResult> hitResultList =
      frame.hitTestInstantPlacement(tap.getX(), tap.getY(), APPROXIMATE_DISTANCE_METERS);
  // Hit-test results using Instant Placement will only have one result of type
  // InstantPlacementResult.
} else {
  List<HitResult> hitResultList = frame.hitTest(tap);
  // TODO: Filter hitResultList to find a hit result of interest.
}

Kotlin

val tap = tapHelper.poll() ?: return
val hitResultList =
  if (usingInstantPlacement) {
    // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
    // how far away the anchor will be placed, relative to the camera's view.
    frame.hitTestInstantPlacement(tap.x, tap.y, APPROXIMATE_DISTANCE_METERS)
    // Hit-test results using Instant Placement will only have one result of type
    // InstantPlacementResult.
  } else {
    frame.hitTest(tap)
  }

आपको जिस टाइप के हिट चाहिए उनके हिसाब से हिट के नतीजों को फ़िल्टर करें. उदाहरण के लिए, अगर आपको DepthPoint पर फ़ोकस करना है:

Java

// Returned hit-test results are sorted by increasing distance from the camera or virtual ray's
// origin.
// The first hit result is often the most relevant when responding to user input.
for (HitResult hit : hitResultList) {
  Trackable trackable = hit.getTrackable();
  if (trackable instanceof DepthPoint) { // Replace with any type of trackable type
    // Do something with this hit result. For example, create an anchor at this point of
    // interest.
    Anchor anchor = hit.createAnchor();
    // TODO: Use this anchor in your AR experience.
    break;
  }
}

Kotlin

// Returned hit-test results are sorted by increasing distance from the camera or virtual ray's
// origin.
// The first hit result is often the most relevant when responding to user input.
val firstHitResult =
  hitResultList.firstOrNull { hit ->
    when (val trackable = hit.trackable!!) {
      is DepthPoint -> true // Replace with any type of trackable type
      else -> false
    }
  }
if (firstHitResult != null) {
  // Do something with this hit result. For example, create an anchor at this point of interest.
  val anchor = firstHitResult.createAnchor()
  // TODO: Use this anchor in your AR experience.
}

आर्बिट्रेरी किरण और दिशा का इस्तेमाल करके हिट-टेस्ट करना

हिट-टेस्ट को आम तौर पर डिवाइस या डिवाइस के कैमरे से ली गई किरणों के तौर पर देखा जाता है. हालांकि, आपके पास स्क्रीन-स्पेस पॉइंट के बजाय, दुनिया के अंतरिक्ष के निर्देशांकों में आर्बिट्रेरी रे का इस्तेमाल करके हिट-टेस्ट करने के लिए, Frame.hitTest(float[], int, float[], int) का इस्तेमाल करने का विकल्प है.

हिट नतीजे का इस्तेमाल करके ऐंकर बनाएं

हिट नतीजा मिलने के बाद, अपने सीन में एआर (ऑगमेंटेड रिएलिटी) कॉन्टेंट डालने के लिए, इनपुट के तौर पर उसके पोज़ का इस्तेमाल किया जा सकता है. नया Anchor बनाने के लिए, HitResult.createAnchor() का इस्तेमाल करें. इससे यह पक्का किया जा सकेगा कि कॉन्टेंट, हिट नतीजे के मौजूदा Trackable से अटैच हो. उदाहरण के लिए, किसी प्लेन हिट नतीजे के लिए ऐंकर, पहचाने गए प्लेन से जुड़ा रहेगा और इस तरह वह असली दुनिया का हिस्सा दिखेगा.

आगे क्या होगा