برای تعیین قرارگیری صحیح یک شی 3 بعدی در صحنه خود یک تست ضربه انجام دهید. قرارگیری صحیح تضمین می کند که محتوای AR در اندازه مناسب (ظاهری) ارائه می شود.
انواع نتیجه را بزنید
همانطور که در جدول زیر نشان داده شده است، یک تست ضربه می تواند چهار نوع مختلف از نتایج ضربه را به دست دهد.
نوع نتیجه را بزنید | توضیحات | جهت گیری | مورد استفاده | فراخوانی روش |
---|---|---|---|---|
عمق ( DepthPoint ) | از اطلاعات عمق کل صحنه برای تعیین عمق و جهت صحیح یک نقطه استفاده می کند | عمود بر سطح سه بعدی | یک شی مجازی را روی یک سطح دلخواه (نه فقط روی زمین و دیوار) قرار دهید. | برای این کار باید ArDepthMode فعال باشد.Frame.hitTest(…) را در لیست برگشتی، DepthPoint را بررسی کنید |
Plane | برای تعیین عمق و جهت صحیح نقطه، به سطوح افقی و/یا عمودی برخورد می کند | عمود بر سطح سه بعدی | یک شی را با استفاده از هندسه کامل هواپیما روی یک صفحه (کف یا دیوار) قرار دهید. فوراً به مقیاس صحیح نیاز دارید. جایگزینی برای آزمون ضربه عمق | Frame.hitTest(…) Plane در لیست بازگشتی بررسی کنید |
نقطه ویژگی ( Point ) | برای تعیین موقعیت و جهت گیری صحیح یک نقطه، به ویژگی های بصری در اطراف نقطه ضربه کاربر متکی است | عمود بر سطح سه بعدی | یک شی را روی یک سطح دلخواه (نه فقط روی زمین و دیوار) قرار دهید. | Frame.hitTest(…) ، Point s را در لیست برگشتی بررسی کنید |
Instant Placement ( InstantPlacementPoint ) | از فضای صفحه برای قرار دادن محتوا استفاده می کند. در ابتدا از عمق تخمینی ارائه شده توسط برنامه استفاده می کند. فورا کار می کند، اما زمانی که ARCore بتواند هندسه صحنه واقعی را تعیین کند ژست و عمق واقعی تغییر می کند. | +Y به سمت بالا، مخالف گرانش | یک شی را بر روی یک صفحه (کف یا دیوار) با استفاده از هندسه کامل هواپیما قرار دهید، جایی که قرارگیری سریع بسیار مهم است، و تجربه می تواند عمق و مقیاس اولیه ناشناخته را تحمل کند. | Frame.hitTestInstantPlacement(float, float, float) |
یک تست ضربه استاندارد انجام دهید
با استفاده از ابزار TapHelper
برای به دست آوردن MotionEvent
از نمای AR، Frame.hitTest()
را برای اجرای یک تست ضربه فراخوانی کنید.
جاوا
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. }
کاتلین
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
s تمرکز کنید:
جاوا
// 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; } }
کاتلین
// 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 ایجاد کنید
هنگامی که یک نتیجه موفق به دست آوردید، می توانید از حالت آن به عنوان ورودی برای قرار دادن محتوای AR در صحنه خود استفاده کنید. از HitResult.createAnchor()
برای ایجاد یک Anchor
جدید استفاده کنید و اطمینان حاصل کنید که محتوا به Trackable
زیرین نتیجه ضربه متصل می شود. به عنوان مثال، لنگر برای نتیجه ضربه هواپیما به هواپیمای شناسایی شده متصل میماند، بنابراین به نظر میرسد که بخشی از دنیای واقعی است.
بعدش چی
- برنامه های نمونه
hello_ar_java
وhello_ar_kotlin
را در GitHub بررسی کنید.