برای Jetpack XR با ARCore کار کنید

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)