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

अपने सीन में 3D ऑब्जेक्ट का सही प्लेसमेंट पता करने के लिए, hit-test करें. सही प्लेसमेंट से यह पक्का होता है कि एआर कॉन्टेंट सही (दिखने वाले) साइज़ में रेंडर हो.

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

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

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

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

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

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

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 से जुड़ रहा हो. उदाहरण के लिए, प्लेन हिट नतीजे के लिए ऐंकर लगाए गए प्लेन से जुड़ा रहेगा, इसलिए असली दुनिया का हिस्सा दिखता है.

आगे क्या होगा