برای تعیین قرارگیری صحیح یک شی 3 بعدی در صحنه خود یک تست ضربه انجام دهید. قرارگیری صحیح تضمین می کند که محتوای AR در اندازه مناسب (ظاهری) ارائه می شود.
انواع نتیجه را بزنید
همانطور که در جدول زیر نشان داده شده است، یک تست ضربه می تواند چهار نوع مختلف از نتایج ضربه را به دست دهد.
نوع نتیجه را بزنید | توضیحات | جهت گیری | مورد استفاده | فراخوانی روش |
---|---|---|---|---|
عمق ( AR_TRACKABLE_DEPTH_POINT ) | از اطلاعات عمق کل صحنه برای تعیین عمق و جهت صحیح یک نقطه استفاده می کند | عمود بر سطح سه بعدی | یک شی مجازی را روی یک سطح دلخواه (نه فقط روی زمین و دیوار) قرار دهید. | برای این کار باید ArDepthMode فعال باشد.ArFrame_hitTest ، ArDepthPoint را در لیست برگشتی بررسی کنید |
هواپیما ( AR_TRACKABLE_PLANE ) | برای تعیین عمق و جهت صحیح نقطه، به سطوح افقی و/یا عمودی برخورد می کند | عمود بر سطح سه بعدی | یک شی را با استفاده از هندسه کامل هواپیما روی یک صفحه (کف یا دیوار) قرار دهید. فوراً به مقیاس صحیح نیاز دارید. جایگزینی برای آزمون ضربه عمق | ArFrame_hitTest ، ArPlane s را در لیست برگشت بررسی کنید |
نقطه ویژگی ( AR_TRACKABLE_POINT ) | برای تعیین موقعیت و جهت گیری صحیح یک نقطه، به ویژگی های بصری در اطراف نقطه ضربه کاربر متکی است | عمود بر سطح سه بعدی | یک شی را روی یک سطح دلخواه (نه فقط روی زمین و دیوار) قرار دهید. | ArFrame_hitTest ، ArPoint را در لیست برگشتی بررسی کنید |
قرار دادن فوری ( AR_TRACKABLE_INSTANT_PLACEMENT_POINT ) | از فضای صفحه برای قرار دادن محتوا استفاده می کند. در ابتدا از عمق تخمینی ارائه شده توسط برنامه استفاده می کند. فورا کار می کند، اما زمانی که ARCore بتواند هندسه صحنه واقعی را تعیین کند ژست و عمق واقعی تغییر می کند. | +Y به سمت بالا، مخالف گرانش | یک شی را بر روی یک صفحه (کف یا دیوار) با استفاده از هندسه کامل هواپیما قرار دهید، جایی که قرارگیری سریع بسیار مهم است، و تجربه می تواند عمق و مقیاس اولیه ناشناخته را تحمل کند. | ArFrame_hitTestInstantPlacement |
یک تست ضربه استاندارد انجام دهید
برای انجام تست ضربه با ArFrame_hitTest
تماس بگیرید.
ArHitResultList* hit_result_list = NULL; ArHitResultList_create(ar_session, &hit_result_list); CHECK(hit_result_list); if (is_instant_placement_enabled) { ArFrame_hitTestInstantPlacement(ar_session, ar_frame, x, y, k_approximate_distance_meters, hit_result_list); } else { ArFrame_hitTest(ar_session, ar_frame, x, y, hit_result_list); }
نتایج ضربه را بر اساس نوع مورد علاقه خود فیلتر کنید. برای مثال، اگر میخواهید روی ArPlane
تمرکز کنید:
int32_t hit_result_list_size = 0; ArHitResultList_getSize(ar_session, hit_result_list, &hit_result_list_size); // 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. ArHitResult* ar_hit_result = NULL; for (int32_t i = 0; i < hit_result_list_size; ++i) { ArHitResult* ar_hit = NULL; ArHitResult_create(ar_session, &ar_hit); ArHitResultList_getItem(ar_session, hit_result_list, i, ar_hit); if (ar_hit == NULL) { LOGE("No item was hit."); return; } ArTrackable* ar_trackable = NULL; ArHitResult_acquireTrackable(ar_session, ar_hit, &ar_trackable); ArTrackableType ar_trackable_type = AR_TRACKABLE_NOT_VALID; ArTrackable_getType(ar_session, ar_trackable, &ar_trackable_type); // Creates an anchor if a plane was hit. if (ar_trackable_type == AR_TRACKABLE_PLANE) { // Do something with this hit result. For example, create an anchor at // this point of interest. ArAnchor* anchor = NULL; ArHitResult_acquireNewAnchor(ar_session, ar_hit, &anchor); // TODO: Use this anchor in your AR experience. ArAnchor_release(anchor); ArHitResult_destroy(ar_hit); ArTrackable_release(ar_trackable); break; } ArHitResult_destroy(ar_hit); ArTrackable_release(ar_trackable); } ArHitResultList_destroy(hit_result_list);
یک تست ضربه با استفاده از یک پرتو و جهت دلخواه انجام دهید
تستهای ضربه معمولاً بهعنوان پرتوهای دستگاه یا دوربین دستگاه در نظر گرفته میشوند، اما میتوانید از ArFrame_hitTestRay
برای انجام آزمایش ضربه با استفاده از یک پرتو دلخواه در مختصات فضای جهان به جای نقطه فضای صفحه نمایش استفاده کنید.
یک Anchor را به HitResult وصل کنید
هنگامی که یک نتیجه موفق به دست آوردید، می توانید از حالت آن به عنوان ورودی برای قرار دادن محتوای AR در صحنه خود استفاده کنید. از ArHitResult_acquireNewAnchor
برای ایجاد یک Anchor جدید در محل ضربه استفاده کنید.
بعدش چی
- برنامه نمونه
hello_ar_c
را در GitHub بررسی کنید.