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