إجراء اختبارات النتائج في تطبيق Android

أجرِ hit-test لتحديد الموضع الصحيح لعنصر ثلاثي الأبعاد في المشهد. ويضمن الموضع الصحيح عرض محتوى الواقع المعزّز بالحجم المناسب (الواضح).

أنواع نتائج النتائج

يمكن أن ينتج عن اختبار النتيجة أربعة أنواع مختلفة من نتائج النتائج، كما هو موضّح في الجدول التالي.

نوع نتيجة النتيجة الوصف الاتجاه حالة الاستخدام طلبات الطريقة
العمق (DepthPoint) يستخدم معلومات العمق من المشهد بأكمله لتحديد العمق والاتجاه الصحيحَين للنقطة. متعامد على السطح الثلاثي الأبعاد وضع كائن افتراضي على سطح عشوائي (وليس فقط على الأرضيات والجدران) يجب تفعيل ArDepthMode لكي تعمل هذه الميزة.

Frame.hitTest(…)، ابحث عن DepthPoint في قائمة الإرجاع
Plane تصطدم بالأسطح الأفقية و/أو العمودية لتحديد العمق والاتجاه الصحيحَين للنقطة متعامد على السطح الثلاثي الأبعاد ضَع جسمًا على سطح مستوٍ (أرضية أو جدار) باستخدام الأبعاد الهندسية الكاملة للطائرة. يجب استخدام الميزان الصحيح على الفور. الإجراء الاحتياطي لاختبار العمق Frame.hitTest(…)، ابحث عن Plane في قائمة الإرجاع.
نقطة مميّزة (Point) تعتمد على الميزات المرئية حول نقطة نقر المستخدم لتحديد الموضع والاتجاه الصحيحَين للنقطة متعامد على السطح الثلاثي الأبعاد وضع جسم على سطح عشوائي (وليس فقط على الأرضيات والجدران) 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) لإجراء اختبار نتيجة باستخدام شعاع عشوائي في إحداثيات الفضاء العالمي بدلاً من نقطة مسافة الشاشة.

إنشاء علامة ارتساء باستخدام نتيجة النتيجة

بعد الحصول على نتيجة نتيجة، يمكنك استخدام وضعية الصورة كإدخال من أجل وضع محتوى الواقع المعزّز في المشهد. استخدِم HitResult.createAnchor() لإنشاء Anchor جديد، مع التأكّد من إرفاق المحتوى بعنصر Trackable الأساسي لنتيجة النتيجة. على سبيل المثال، ستظل علامة ارتساء مرتبطة بالمستوى الذي تم رصده للحصول على نتيجة إصابة طائرة، وبالتالي تظهر وكأنها جزء من العالم الحقيقي.

الخطوات التالية