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

आगे क्या होगा