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 birPlane
için anlamsal açıklama.Wall
,Floor
,Ceiling
veyaTable
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)