Membuat anchor dengan ARCore untuk Jetpack XR

Perangkat XR yang kompatibel
Panduan ini membantu Anda membangun pengalaman untuk jenis perangkat XR ini.
Headset XR
Kacamata XR Berkabel

Anchor menjelaskan lokasi dan orientasi di dunia nyata. Melampirkan objek ke anchor membantu objek tampak ditempatkan secara realistis di dunia nyata dan membantu aplikasi Anda menghemat daya karena tidak perlu menjalankan logika setiap frame.

Mengakses sesi

Buat anchor melalui ARCore untuk Jetpack XR Session. Jika Anda meningkatkan kualitas UI spasial menggunakan Jetpack Compose untuk XR, akses sesi dari Jetpack Compose untuk XR. Jika Anda menggunakan entity spasial dari library Jetpack SceneCore, akses sesi dari Jetpack XR Runtime.

Mengonfigurasi sesi

Membuat dan memuat anchor tidak memerlukan konfigurasi sesi. Namun, persistensi anchor tidak diaktifkan secara default pada sesi XR. Untuk mempertahankan dan memuat anchor dari penyimpanan lokal, konfigurasikan sesi dan tetapkan mode AnchorPersistenceMode.LOCAL:

val newConfig = Config.Builder(session.config)
    .setAnchorPersistence(AnchorPersistenceMode.LOCAL)
    .build()
when (val result = session.configure(newConfig)) {
    is SessionConfigureSuccess -> TODO(/* Success! */)
    else ->
        TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */)
}

Menyematkan konten anchor ke lokasi di ruang

Anchor dibuat menggunakan Pose, yang dapat diinterpretasikan relatif terhadap Anchorable yang ada atau ditetapkan di dunia. An Anchorable adalah Trackable yang dapat memiliki anchor yang dilampirkan.

Membuat anchor relatif terhadap Anchorable

Saat anchor dibuat relatif terhadap Anchorable, seperti Plane, anchor akan mengikuti Anchorable terlampir saat bergerak melalui ruang.

val anchor = plane.createAnchor(pose)

Membuat anchor yang ditetapkan di dunia

Untuk membuat anchor yang ditetapkan di dunia, jangan lampirkan ke Anchorable. Hanya gunakan jenis anchor ini untuk titik yang mengambang di ruang karena perkiraan sesi tentang lokasi objek yang tidak dapat dipindahkan berubah dari waktu ke waktu:

val anchor = Anchor.create(session, pose)

Melampirkan entity ke anchor

Untuk merender model di lokasi ini, buat GltfModel dan tetapkan induknya ke AnchorSpace.

AnchorSpace.create(session, anchor).apply {
    parent = session.scene.activitySpace
    addChild(entity)
}

Memahami TrackingState

Setiap Trackable memiliki TrackingState yang harus diperiksa sebelum digunakan. Sebuah Trackable yang memiliki TrackableState dari Tracking memiliki Pose yang diperbarui secara aktif oleh sistem. Trackable yang Paused mungkin akan menjadi Tracking di masa mendatang, sedangkan Stopped tidak akan pernah menjadi Tracking.

Mempertahankan Anchor di seluruh sesi

Anchor yang tidak dipertahankan akan hilang setelah sesi dihancurkan. Dengan mempertahankan anchor, aplikasi Anda akan mengingat posisi anchor tersebut dalam data aplikasi pribadinya. Anchor ini dapat diambil dalam sesi berikutnya dan disematkan di lokasi yang sama di dunia.

Untuk mempertahankan anchor, gunakan Anchor.persist() seperti yang ditunjukkan di sini:

val uuid = anchor.persist()

Aplikasi Anda dapat mengambil anchor menggunakan UUID dalam sesi mendatang:

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

Jika Anda tidak lagi memerlukan anchor, panggil unpersist(). Tindakan ini akan menghapus anchor dari penyimpanan aplikasi Anda dan membuat UUID yang diberikan tidak dapat diambil untuk panggilan ke Anchor.load().

Anchor.unpersist(session, uuid)

Aplikasi Anda juga dapat meminta daftar semua anchor yang telah dipertahankan dan masih ada di penyimpanan aplikasi Anda:

val uuids = Anchor.getPersistedAnchorUuids(session)