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

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

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

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

نوع نتيجة النتيجة الوصف الاتجاه حالة الاستخدام استدعاء الإجراءات
العمق (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 الأساسي لنتيجة النتيجة. على سبيل المثال، سيظل المرساة مرتبطة بالمستوى الذي تم اكتشافه لنتيجة ضربة طائرة، وبالتالي يبدو أنها جزء من العالم الحقيقي.

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