Jetpack XR için ARCore ile çalışma

Jetpack XR için ARCore, uygulamaların düşük düzeyli sahne anlama primitifleri ve hareket izlemeyi kullanarak temel artırılmış gerçeklik (AR) kavramlarıyla çalışmasını sağlar. AR deneyimleri oluştururken ve düzlemsel verileri kullanmanız veya içeriği uzayda sabit bir konuma sabitlemeniz gerektiğinde Jetpack XR için ARCore'u kullanın.

Oturumların yaşam döngüsünü anlama

Jetpack XR için ARCore tarafından izlenen tüm nesnelere bir Oturum üzerinden erişilmelidir. Etkinlik yaşam döngüsüne benzer şekilde, oturum nesnelerinin de yaşam döngüsü vardır. Bu yaşam döngüsü, uygulamanızın oturum nesnesi özelliklerini kullanımına göre sürdürülmelidir. Uygulamanız tek bir XR etkinliği içeriyorsa yaşam döngüsü bilincine sahip bir bileşen kullanarak oturumun yaşam döngüsünü yönetmeyi düşünebilirsiniz.

Oturum Oluşturma

Oturum oluşturulduktan sonra kullanılabilir. Oturum oluşturmak için kullanıcının uygulamanıza android.permission.SCENE_UNDERSTANDING izni vermesi gerekir.

Oturum oluşturmak için:

when (val result = Session.create(owner)) {
  is SessionCreateSuccess -> {
    session = result.session
  }
  is SessionCreatePermissionsNotGranted -> {
   // Request android.permission.SCENE_UNDERSTANDING.
  }
}

Oturum oluşturma işleminin neden başarısız olabileceğine dair nedenler için SessionCreateResult bölümüne bakın.

Oturumu devam ettirme

Bir oturumu devam ettirmek için uygulamanız, Jetpack XR için ARCore'dan gelen durum değişikliklerini işlemeye hazır olmalıdır. Bu işlem çoğu durumda etkinliğinizin onResume() geri çağırma işlevinde yapılır ancak uygulamanız, işlemeyi kullanıcı etkileşimine kadar ertelemek isteyebilir.

Aşağıdaki kod snippet'inde, bir oturumun devam ettirilmesiyle ilgili bir örnek gösterilmektedir.

when (val result = session.resume()) {
  is SessionResumeSuccess -> {
    // Session has been created successfully.
    // Attach any successful handlers here.
  }
  is SessionResumePermissionsNotGranted -> {
    // Request android.permission.SCENE_UNDERSTANDING.
}

Oturumların devam etmesinin neden başarısız olabileceğine dair daha fazla bilgi için SessionResumeResult bölümüne bakın.

Oturumu duraklatma

Etkinliğiniz arka plana gittiğinde Session.pause() simgesini kullanarak oturumu duraklatın. Bir oturum duraklatıldığında, algı sisteminin durumu korunarak oturum devam ettirilene kadar izleme geçici olarak durdurulur.

Oturumları silme

Bir oturumu kalıcı olarak silmek için Session.destroy() değerini kullanın. Bu işlem, oturum tarafından kullanılan kaynakları serbest bırakır ve tüm oturum durumlarını yok eder.

Algılanan uçakların durumunu alma

Jetpack XR için ARCore, uçağın durumunu bildiren bir StateFlow aracılığıyla uçağın durumunu sağlar. Bir oturumda uçağa abone olmak, uçaklar eklendiğinde, güncellendiğinde veya kaldırıldığında uygulamanızı bilgilendirir.

Plane.subscribe(session).collect { planes ->
 // Planes have changed; update plane rendering
}

Düzlemin aşağıdaki özellikleri vardır:

  • label: Belirli bir Plane için anlamsal açıklama. Wall, Floor, Ceiling veya Table olabilir.
  • centerPose: Tespit edilen düzlem merkezinin duruşu.
  • extents: Tespit edilen düzlem boyutları (metre cinsinden).
  • vertices: Düzleme yaklaşık bir dışbükey poligonun köşelerinin listesi.

Uçaklara karşı isabet testi yapma

İsabet testi, bir ışının oturum tarafından izlenen nesnelerle kesişim noktasını hesaplama yöntemidir. İsabet testi, bir tabloyu işaretleyip bu konuma bir nesne yerleştirmek için yaygın olarak kullanılır. İsabet testi yapmak, isabet eden nesnelerin listesini oluşturur. Diğer bir deyişle, isabet testi ilk nesne isabetinde durmaz. Ancak genellikle yalnızca belirli bir türdeki ilk nesne isabeti ilginizi çekebilir.

İsabet testi yapmak için Interaction.hitTest() ile Ray kullanın:

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
}

İçeriği alanda sabit bir konuma sabitleme

Sanal nesnelere gerçek dünyada bir konum vermek için Anchor kullanın. Sabitleme nesnesi, uygulamanızın fiziksel alandaki sabit bir konumu takip etmesine yardımcı olur.

Bir Pose kullanılarak bir ankraj oluşturulur. Bu ankraj, mevcut bir Trackable'e göre yorumlanabilir veya yorumlanamaz.

İzlenebilir öğeye göre bir ana başlık oluşturma

Bir sabitleyici, Plane gibi bir Trackable'ye göre oluşturulduğunda, sabitleyici, alanda hareket ederken bağlı Trackable'yi takip eder.

val anchor = trackable.createAnchor(pose)

İzlenebilir olmadan bir ana sayfa bağlantısı oluşturma

Trackable öğesine bağlı olmayan bir ana başlık oluşturmak için:

when (val result = Anchor.create(session, pose)) {
  is AnchorCreateSuccess -> // ...
  else -> // handle failure
}

Bir öğeyi bir ankaraya ekleme

Bu konumda bir model oluşturmak için GltfModel oluşturun ve duruşunu ankrajın duruşuna ayarlayın. Sabitleyicinin TrackingState değeri Stopped olduğunda modelin gizlendiğinden emin olun.

// 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'i anlama

Her Trackable öğesinin, kullanılmadan önce kontrol edilmesi gereken bir TrackingState'si vardır. Tracking TrackableState değerine sahip bir Trackable'nin Pose değeri sistem tarafından etkin bir şekilde güncellenir. Paused olan bir Trackable gelecekte Tracking olabilir, ancak Stopped olan bir Trackable hiçbir zaman Tracking olmaz.

Sabit noktaları oturumlar boyunca koruma

Kalıcı olmayan bir ankraj, oturum sona erdikten sonra kaybolur. Uygulamanız, bir ankarayı kalıcı hale getirerek bu ankarayı özel uygulama verilerinde hatırlar. Bu ankraj, sonraki bir oturumda alınabilir ve dünyanın aynı konumuna sabitlenir.

Sabit bir yer işareti oluşturmak için burada gösterildiği gibi anchor.persist() simgesini kullanın:

val uuid = anchor.persist()

Uygulamanız, gelecekteki bir oturumda UUID kullanarak ankörü alabilir:

when (val result = Anchor.load(session, uuid)) {
  is AnchorCreateSuccess -> // Loading was successful. The anchor is stored in result.anchor.
  else -> // handle failure
}

Artık sabitleyiciye ihtiyacınız kalmadığında unpersist() numaralı telefonu arayın. Bu işlem, ankörü uygulamanızın depolama alanından kaldırır ve belirtilen UUID'yi Anchor.load() çağrıları için alınamaz hale getirir.

Anchor.unpersist(session, uuid)

Uygulamanız, kalıcı hale getirilmiş ve uygulamanızın depolama alanında hâlâ bulunan tüm ankrajların listesini de isteyebilir:

val uuids = Anchor.getPersistedAnchorUuids(session)