ARCore برای Jetpack XR به برنامهها اجازه میدهد تا با مفاهیم اولیه واقعیت افزوده (AR)، با استفاده از مفاهیم اولیه درک صحنه و ردیابی حرکت کار کنند. هنگام ایجاد تجربیات AR از ARCore برای Jetpack XR استفاده کنید و باید از داده های مسطح استفاده کنید یا محتوا را به یک مکان ثابت در فضا متصل کنید.
چرخه زندگی Session را درک کنید
همه اشیاء ردیابی شده توسط ARCore برای Jetpack XR باید از طریق یک Session قابل دسترسی باشند. مشابه چرخه حیات Activity ، اشیاء Session همچنین دارای چرخه حیاتی هستند که باید مطابق با استفاده برنامه شما از ویژگیهای یک شی Session حفظ شود. اگر برنامه شما دارای یک فعالیت فعال با XR است، چرخه عمر Session را با استفاده از یک مؤلفه Lifecycle-aware مدیریت کنید.
یک جلسه ایجاد کنید
قبل از اینکه بتوان از آن استفاده کرد باید یک Session ایجاد کرد. برای ایجاد یک جلسه، کاربر باید مجوز android.permission.SCENE_UNDERSTANDING
را به برنامه شما اعطا کرده باشد .
برای ایجاد یک جلسه:
when (val result = Session.create(owner)) {
is SessionCreateSuccess -> {
session = result.session
}
is SessionCreatePermissionsNotGranted -> {
// Request android.permission.SCENE_UNDERSTANDING.
}
}
SessionCreateResult
برای دلایل عدم ایجاد Session ببینید.
یک جلسه را از سر بگیرید
از سرگیری یک جلسه باید زمانی انجام شود که برنامه شما برای مدیریت تغییرات وضعیت از ARCore برای Jetpack XR آماده باشد. در بسیاری از موارد، این کار در پاسخ به تماس onResume()
Activity شما انجام می شود، اما برنامه شما ممکن است بخواهد پردازش را تا زمان تعامل کاربر به تعویق بیندازد.
قطعه کد زیر نمونه ای از از سرگیری یک جلسه را نشان می دهد.
when (val result = session.resume()) {
is SessionResumeSuccess -> {
// Session has been created successfully.
// Attach any successful handlers here.
}
is SessionResumePermissionsNotGranted -> {
// Request android.permission.SCENE_UNDERSTANDING.
}
SessionResumeResult
برای دلایل عدم از سرگیری Session ببینید.
یک جلسه را متوقف کنید
وقتی فعالیت شما به پسزمینه رفت، با استفاده از Session.pause()
Session را متوقف کنید. توقف موقت یک جلسه، ردیابی را تا زمان از سرگیری جلسه متوقف می کند و وضعیت سیستم ادراک را حفظ می کند.
یک جلسه را از بین ببرید
برای حذف دائمی یک جلسه، از Session.destroy()
استفاده کنید. این کار منابع در حال استفاده توسط جلسه را آزاد می کند و تمام حالت های جلسه را از بین می برد.
وضعیت هواپیماهای درک شده را بازیابی کنید
ARCore برای Jetpack XR وضعیت هواپیماها را از طریق StateFlow
ارائه می دهد که وضعیت هواپیماها را منتشر می کند. اشتراک در هواپیماها در یک جلسه به برنامه شما اطلاع می دهد که هواپیماها اضافه شوند، به روز شوند یا حذف شوند.
Plane.subscribe(session).collect { planes ->
// Planes have changed; update plane rendering
}
یک هواپیما دارای ویژگی های زیر است:
-
label
: توصیف معنایی یکPlane
معین. می تواندWall
،Floor
،Ceiling
یاTable
باشد. -
centerPose
: موقعیت مرکز هواپیمای شناسایی شده. -
extents
: ابعاد هواپیمای شناسایی شده، بر حسب متر. -
vertices
: فهرستی از رئوس چند ضلعی محدب که به صفحه تقریب میزند.
انجام تست ضربه در برابر هواپیما
تست ضربه روشی برای محاسبه تقاطع پرتو با اشیایی است که توسط جلسه ردیابی می شوند. یک کاربرد متداول تست ضربه زدن، اشاره به یک میز و قرار دادن یک شی در آن مکان است. انجام یک تست ضربه منجر به لیستی از اشیاء ضربه می شود. به عبارت دیگر، یک تست ضربه در اولین ضربه شی متوقف نمی شود. با این حال، اغلب شما ممکن است فقط به اولین ضربه شی از یک نوع خاص علاقه مند باشید.
برای انجام یک تست ضربه، از Interaction.hitTest()
با یک Ray
استفاده کنید:
val results = Interaction.hitTest(session, ray)
// When interested in the first Table hit:
val tableHit = results.firstOrNull {
val trackable = it.trackable
trackable is Plane && trackable.state.value.label == Plane.Label.Table
}
محتویات را به یک مکان ثابت در فضا متصل کنید
برای دادن موقعیت به اشیاء مجازی در دنیای واقعی، از Anchor
استفاده کنید. یک شی لنگر به برنامه شما کمک می کند مکان ثابتی را در فضای فیزیکی ردیابی کند.
یک لنگر با استفاده از Pose
ایجاد میشود که میتواند نسبت به Trackable
موجود تفسیر شود یا نه.
یک لنگر نسبت به Trackable ایجاد کنید
هنگامی که یک لنگر نسبت به Trackable
ایجاد می شود، مانند یک Plane
، که باعث می شود لنگر هنگام حرکت در فضا، Trackable
متصل را دنبال کند.
val anchor = trackable.createAnchor(pose)
یک لنگر بدون Trackable ایجاد کنید
برای ایجاد یک لنگر که به یک Trackable
متصل نیست:
when (val result = Anchor.create(session, pose)) {
is AnchorCreateSuccess -> // ...
else -> // handle failure
}
یک موجودیت را به یک لنگر متصل کنید
برای رندر کردن یک مدل در این مکان، یک GltfModel
ایجاد کنید و حالت آن را روی حالت لنگر تنظیم کنید. مطمئن شوید که مدل پنهان است وقتی که Anchor's TrackingState
Stopped
است.
// renderSession is androidx.xr.core.Session
anchor.state.collect { state ->
if (state.trackingState == TrackingState.Tracking) {
gltfEntity.setPose(
renderSession.perceptionSpace.transformPoseTo(state.pose, renderSession.activitySpace)
)
} else if (state.trackingState == TrackingState.Stopped) {
entity.setHidden(true)
}
}
TrackingState را درک کنید
هر Trackable
یک TrackingState
دارد که باید قبل از استفاده بررسی شود. یک Trackable
که دارای TrackableState
of Tracking
است، Pose
آن به طور فعال توسط سیستم به روز می شود. یک Trackable
که Paused
است ممکن است در آینده به Tracking
تبدیل شود، در حالی که چیزی که Stopped
است هرگز به Tracking
تبدیل نخواهد شد.
در طول جلسات، یک لنگر را حفظ کنید
لنگری که تداوم ندارد پس از از بین رفتن یک جلسه ناپدید می شود. با تداوم یک لنگر، برنامه شما موقعیت آن لنگر را در داده های برنامه خصوصی خود به خاطر می آورد. این لنگر را می توان در جلسه بعدی بازیابی کرد و در همان مکان در جهان لنگر انداخت.
برای تداوم یک anchor، از anchor.persist()
همانطور که در اینجا نشان داده شده است استفاده کنید:
val uuid = anchor.persist()
برنامه شما میتواند با استفاده از UUID
در جلسه آینده، لنگر را بازیابی کند:
when (val result = Anchor.load(session, uuid)) {
is AnchorCreateSuccess -> // Loading was successful. The anchor is stored in result.anchor.
else -> // handle failure
}
وقتی دیگر نیازی به انکر ندارید، unpersist()
را فراخوانی کنید. این لنگر را از حافظه برنامه شما حذف می کند و UUID داده شده را برای تماس با Anchor.load()
غیر قابل بازیابی می کند.
Anchor.unpersist(session, uuid)
برنامه شما همچنین میتواند فهرستی از تمام لنگرهایی را که همچنان در فضای ذخیرهسازی برنامه شما وجود دارند، درخواست کند:
val uuids = Anchor.getPersistedAnchorUuids(session)