Android XR

Merancang Konten Spasial di Android XR dengan Unity

Speaker

  • Levana Chen

    Software Engineer

  • Jennifer Stanton

    Software Engineer Senior

Tentang

Tentang konferensi

Temukan cara menambatkan dan mempertahankan pengalaman 3D di dunia nyata menggunakan Unity dan Android XR. Sesi ini membahas framework Spatial Entities, Cloud Anchors, dan Geospatial API, yang menunjukkan cara membangun aplikasi berbasis konteks yang mengingat penempatan fisik dan menyinkronkan data spasial multi-pengguna di seluruh sesi.

Kita akan mempelajari arsitektur di balik entity spasial, memahami cara menambatkan aset digital ke objek fisik, permukaan, dan lokasi geografis. Anda akan mempelajari alur kerja Unity yang praktis untuk memetakan ruang, mempertahankan konten di seluruh sesi, dan menciptakan pengalaman AR/XR bersama yang berbasis lokasi.

Ringkasan

  • AR Foundation menyediakan API pembuatan skrip terpadu di seluruh platform XR menggunakan ekstensi OpenXR. Dengan demikian, Anda dapat merepresentasikan dan mengkueri fitur dunia nyata seperti bidang dan mesh.
  • Anchor persisten menstabilkan konten digital di seluruh sesi dan mulai ulang perangkat. Anda dapat mempertahankannya dengan TrySaveAnchorAsync dan memuat ulang menggunakan GUID yang diserialisasi.
  • Framework Spatial Entities menggantikan ekstensi yang dapat dilacak untuk memberikan dukungan lintas platform dan performa yang lebih baik dalam melacak item seperti kotak pembatas dan penanda.
  • Komponen pengelola harus dinonaktifkan hingga izin Android XR diberikan. Hal ini menghindari kegagalan inisialisasi subsistem yang disebabkan oleh akses terbatas ke data lingkungan yang sensitif.
  • Geospatial API menggunakan layanan ARCore Google Cloud dan VPS untuk memosisikan konten di lokasi luar ruangan di dunia nyata.

Resource

Gemini Notebook

Topik

  • android-xr
  • kesatuan
  • ar-foundation
  • openxr
  • spatial-entities
  • anchor
  • geospatial-api

Transkrip

Pengantar dan ringkasan AR Foundation

  • Oke.

  • Selamat datang, semuanya.

  • Ini adalah kursus Merancang Konten Spasial di Android XR dengan Unity.

  • Nama saya Jennifer Stanton.

  • Saya bekerja di Unity sebagai senior software engineer.

  • Saya bekerja di tim Fitur XR, khususnya di AR Foundation dan paket terkait yang menghadirkan augmented reality dan mixed reality ke Unity.

  • Saya Levana Chen dari tim Game Engine XR Google.

  • Tim kami berfokus untuk menghadirkan plugin dan paket yang memberikan fungsionalitas XR yang ditingkatkan dan integrasi game engine yang lancar.

  • Salah satu tantangan terbesar yang kami dengar dari Anda adalah bahwa mendukung beberapa platform XR dengan codebase yang sama memerlukan banyak pekerjaan.

  • AR Foundation adalah lapisan API extended reality tingkat tinggi Unity.

  • Anda dapat menargetkan beberapa platform XR tanpa perlu menulis ulang kode secara signifikan, mengelola beberapa codebase, dan Anda akan mendapatkan satu API pembuatan skrip untuk fitur AR di platform apa pun.

  • Dengan begitu, Anda dapat berfokus pada pembuatan aplikasi, game, atau pengalaman, dan Unity akan menangani detail platform untuk Anda.

  • Salah satu cara AR Foundation mencapai hal ini adalah melalui ekstensi OpenXR.

  • Ini adalah serangkaian API standar industri terbuka yang ditentukan oleh Khronos Group.

  • OpenXR juga telah membuat Entity Spasial.

  • Ini adalah framework untuk konten digital guna merepresentasikan dan berinteraksi dengan dunia fisik.

  • Entity Spasial menyediakan model terpadu untuk merepresentasikan elemen dunia nyata sebagai objek digital.

  • Saya senang dapat berbagi beberapa info terbaru tentang AR Foundation dengan Anda agar Anda dapat mulai membuat perjalanan Anda untuk menciptakan pengalaman XR.

  • Selanjutnya, saya akan membahas kemampuan AR Foundation agar konten digital Anda dapat berinteraksi dengan dunia nyata.

  • Kemudian, saya akan membahas penyiapan project, termasuk paket dan dependensi lainnya, sehingga Anda dapat menerapkannya dalam project Anda.

  • Kemudian, saya akan mengakhiri dengan membahas beberapa fitur unik Android XR.

Fitur utama AR Foundation

  • Jadi, beberapa cara AR Foundation merepresentasikan dunia nyata secara digital adalah bidang.

  • Permukaan ini adalah permukaan datar di lingkungan fisik, seperti lantai, dinding, langit-langit, dan bahkan meja dan sofa.

  • Mesh adalah struktur 3D yang merepresentasikan geometri dunia fisik.

  • Lalu, kita juga memiliki cara untuk berinteraksi dengan dunia nyata, yaitu ray cast.

  • Sinar tersebut menentukan tempat sinar berpotongan dengan konten digital.

  • Anggap saja seperti penunjuk laser, dan Anda akan mendapatkan informasi tentang tempat penunjuk laser tersebut bersinar.

  • Kita juga memiliki anchor, yang membantu menstabilkan dan merelokasi titik dalam ruang.

  • Saya akan membahas anchor lebih mendalam nanti dalam presentasi ini.

  • Jadi, keempat fitur ini dianggap sebagai Fitur AR Foundation.

  • Ada juga beberapa fitur lain yang tidak disebutkan dalam slide ini.

  • Bidang dan anchor, khususnya, dianggap sebagai trackable karena memperluas class ARTrackable, dan pengelolanya melacak update dari waktu proses.

  • Jadi, mari kita bahas bidang.

  • Untuk bidang, kita memiliki komponen ARPlane, yang memberikan identifikasi permukaan datar secara real-time.

  • Bidang ini memiliki label semantik yang dapat Anda kueri sehingga Anda tahu apakah bidang Anda adalah lantai, meja, dinding, dan sebagainya.

  • Bidang juga memiliki batas dinamis, sehingga saat pengguna bergerak di dunia nyata dan dapat melihat lebih banyak permukaan, batas bidang akan diperluas, digabungkan, dan disesuaikan secara dinamis dan real-time.

  • Kita juga dapat memasang mesh collider ke bidang untuk menangani fisika.

  • Di sini, Anda dapat melihat contoh deteksi bidang.

  • Ini adalah scene raycast contoh AR Foundation yang berjalan di perangkat Android XR.

  • Fitur ini mendeteksi poligon 2D yang dinamis dan real-time.

  • Anda dapat membuat aplikasi yang memiliki fungsi ini dengan mengikuti panduan penyiapan project kami atau menggunakan salah satu contoh atau template kami.

  • Selanjutnya, kita memiliki mesh.

  • Mesh adalah fitur AR yang menyediakan mesh 3D lingkungan.

  • Kita dapat memasang mesh collider ke mesh yang dihasilkan ini, dan hal ini memungkinkan konten digital Anda berinteraksi dengan objek dunia nyata.

  • Mesh memungkinkan oklusi objek yang meyakinkan.

  • Jadi, objek virtual dapat terlihat berada di belakang objek fisik.

  • Jika objek digital Anda dapat bergerak di ruang, Anda dapat menggunakan geometri yang sama untuk menemukan jalur yang menghindari objek dunia nyata.

  • Selanjutnya, ada ray casting.

  • Ray casting memproyeksikan sinar virtual ke dalam adegan 3D Anda untuk mencari persimpangan tanpa Anda harus mengkhawatirkan matematika yang rumit.

  • Sinar yang diproyeksikan berpotensi berpotongan dengan beberapa objek 3D di lingkungan Anda.

  • Anda dapat mengonfigurasi ray cast agar hanya mengenai jenis konten digital tertentu.

  • Misalnya, Anda dapat mengonfigurasinya agar tidak mengenai bidang dan hanya berpotongan dengan mesh.

Penyiapan paket dan dependensi

  • Sekarang, mari kita lihat paket yang relevan.

  • Semua paket ini bekerja sama untuk berkomunikasi satu sama lain dan menciptakan pengalaman XR yang lengkap.

  • Seperti yang telah disebutkan, AR Foundation menangani fitur seperti bidang dan anchor.

  • Plugin OpenXR menangani API native di berbagai platform XR, jadi Anda sebaiknya menggunakan paket ini jika perangkat Anda menggunakan OpenXR.

  • Plugin OpenXR dapat dipasangkan secara opsional dengan paket OpenXR Spatial Entities untuk mengakses ekstensi Spatial Entities secara khusus, dan akan dibahas lebih lanjut nanti.

  • Jika Anda tahu bahwa Anda akan menargetkan perangkat Android XR secara khusus, seperti headset XR dan kacamata XR berkabel, paket Android XR Unity OpenXR diperlukan untuk itu.

  • Dan karena semua ini mengikuti pola plugin, dampak pada kode Anda akan tetap minimal.

  • Tidak semua fitur tersedia di semua paket AR Foundation.

  • Misalnya, jika Anda melihat diagram ini, meshing saat ini tidak tersedia dalam paket Unity OpenXR Spatial Entities.

  • XR Plug-in Management memungkinkan Anda mengelola fitur OpenXR yang dipilih dalam project Anda.

  • Jadi, jika Anda berada di editor Unity, buka Edit, Setelan Project, lalu XR Plug-in Management akan berada di sidebar kiri.

  • Di sini, Anda dapat menemukan fitur dan grup fitur OpenXR, sehingga Anda dapat memilih dan membatalkan pilihan fitur dan grup fitur yang ingin disertakan dalam build.

  • Misalnya, dalam screenshot ini, kita melihat semua yang disertakan dengan paket OpenXR Android XR.

  • Kemudian, Anda dapat memadupadankannya dengan entity spasial, misalnya, jika Anda mau.

  • Jadi, ini adalah jendela Package Manager.

  • Kami telah menandai beberapa paket yang mungkin Anda lihat dalam penyiapan project XR standar.

  • Seperti yang Anda lihat, kami memiliki AR Foundation, yang telah disebutkan.

  • Kami juga memiliki plugin OpenXR.

  • Kami memiliki paket Android XR.

  • Kami juga telah menyoroti beberapa platform lain karena Anda tentu dapat membuat project yang dikompilasi ke beberapa platform.

  • Lalu, di kanan bawah, kita juga memiliki beberapa paket lainnya.

  • Composition Layers, yang berfungsi dengan perangkat OpenXR; Core Utils, yang sangat berguna untuk apa pun yang terkait dengan XR; lalu XR Hands dan XR Interaction Toolkit untuk mendapatkan input Anda, yang cukup penting.

  • Selanjutnya, kita akan membahas validasi project.

  • Jadi, sekali lagi, ini adalah bagian dari XR Plug-in Management.

  • Validasi project dapat mendeteksi fitur duplikat, serta masalah lain dalam project yang perlu Anda perbaiki agar dapat berjalan.

  • Namun, dalam screenshot ini, saya telah menandai fitur duplikat.

  • Jadi, pada dasarnya ini berarti dua fitur yang sama, seperti anchor, mungkin bidang dan raycast di sini.

  • Pengguna telah memilih untuk menyertakan duplikat fitur ini dari beberapa paket, dan pengguna hanya diminta untuk memilih salah satunya.

Anchor lokal dan persistensi

  • Jadi, hal ini membawa kita ke anchor lokal dan persistensi.

  • Anchor memastikan bahwa konten digital tetap berada di lokasi yang diinginkan di lingkungan, terlepas dari perubahan status pelacakan sesi AR.

  • Platform AR otomatis memperbarui pose anchor dari waktu ke waktu untuk memastikan anchor tetap berada di posisi yang konsisten, dan anchor adalah cara terbaik untuk memastikan konten Anda tetap berada di tempatnya jika Anda menjauh dari anchor, lalu kembali ke arahnya.

  • Lalu, bagaimana jika pengguna menutup aplikasi dan memulai ulang nanti, lalu kembali ke aplikasi dalam sesi terpisah?

  • Anchor persisten memungkinkan Anda menyimpan anchor dalam sesi AR, lalu memuatnya dalam sesi berikutnya.

  • Data ini bertahan selama siklus proses aplikasi dan mulai ulang perangkat.

  • Gambar di sini adalah contoh anchor persisten kami dalam project AR Foundation Samples.

  • Scene contoh memiliki menu yang memiliki semua fungsi yang didukung di platform tersebut, seperti menyimpan dan memuat anchor.

  • Dan hal ini membawa kita ke siklus proses anchor persisten.

  • Pertama, Anda akan membuat anchor secara lokal, sehingga belum disimpan di mana pun, tidak disimpan ke penyimpanan persisten, hanya anchor lokal.

  • Kemudian, Anda akan menyimpannya ke penyimpanan.

  • Setelah itu, Anda dapat memulai ulang aplikasi, lalu memuatnya dari penyimpanan.

  • Beberapa platform, termasuk Android XR, juga mendukung penghapusan atau pembatalan persistensi anchor.

  • Penyedia Spatial Entities mendukung pemuatan otomatis semua anchor yang disimpan sehingga Anda tidak perlu meminta setiap anchor secara manual berdasarkan ID-nya.

  • Di setelan XR Plug-in Management, Anda dapat memilih opsi Automatically Load Saved Anchors di fitur Spatial Entities: Anchors.

  • Dan menyimpan anchor hanya memerlukan beberapa baris kode.

  • Pertama, kita mulai di editor Unity dan pastikan scene Anda sudah siap dengan menambahkan komponen AR Anchor Manager ke objek game XR Origin.

  • Pengelola terus memperbarui tampilan dengan anchor yang dilacak dari runtime.

  • Jadi, mari kita bahas kodenya.

  • Untuk menambahkan anchor, Anda cukup memanggil TryAddAnchorAsync dan meneruskan pose tempat Anda ingin menempatkan anchor.

    async void CreateAnchorAsync(ARAnchorManager manager, Pose pose) {
        var result = await manager.TryAddAnchorAsync(pose);
        if (result.status.IsError()) {
            // handle error
            return;
        }
        var anchor = result.value;
    }
  • Selanjutnya, kita akan membahas cara menghapus anchor.

    void RemoveAnchor(ARAnchorManager manager, ARAnchor anchor) {
        var result = manager.TryRemoveAnchor(anchor.trackableId);
        if (result.status.IsError()) {
            // handle error
            return;
        }
    }
    
    void DestroyAnchorComponent(ARAnchor anchor) {
        Destroy(anchor);
    }
  • Dan sama halnya, ini hanya satu baris kode.

  • Anda memanggil TryRemoveAnchor, lalu meneruskan ID anchor yang dapat dilacak.

  • Saat dibuat, anchor sudah diberi ID yang dapat dilacak.

  • Lalu, kita punya TrySaveAnchorAsync.

    async void SaveAnchorAsync(ARAnchorManager manager, ARAnchor anchor) {
        var result = await manager.TrySaveAnchorAsync(anchor);
        if (result.status.IsError()) {
            // handle error
            return;
        }
    
        // Save this value, then return it as an input parameter
        SerializableGuid guid = result.value;
    }
  • Anda meneruskan anchor AR sebagai input.

  • Fungsi ini menampilkan SerializableGuid yang mengidentifikasi anchor di penyimpanan persisten.

  • Anda dapat menggunakan GUID nanti saat memuat anchor.

  • Hal ini membawa kita ke pemuatan anchor.

    async void LoadAnchorAsync(ARAnchorManager manager, SerializableGuid guid) {
        var result = await manager.TryLoadAnchorAsync(guid);
        if (result.status.IsError()) {
            // handle error
            return;
        }
    
        ARAnchor anchor = result.value;
    }
  • Fungsi yang akan dipanggil di sini adalah TryLoadAnchorAsync, dan Anda meneruskan GUID yang diserialisasi dari sebelumnya.

  • Tindakan ini akan menampilkan anchor AR sebagai hasilnya.

  • Dan selesai.

  • Fungsi ini memungkinkan Anda mengelola anchor lokal dan persisten dengan mudah.

  • Jadi, pelacakan anchor adalah tugas yang cukup mahal di sebagian besar platform AR.

  • Saat menggunakan anchor, pertimbangkan praktik terbaik berikut: hindari membuat beberapa anchor yang sangat berdekatan, pertimbangkan apakah Anda dapat menggunakan anchor di sekitar daripada membuat anchor lain, hapus anchor saat Anda tidak lagi menggunakannya, dan terakhir, jika Anda mengaktifkan fitur AR lain untuk membantu menghitung pose yang diinginkan untuk anchor, pertimbangkan apakah Anda dapat menonaktifkan fitur tersebut setelah anchor berhasil dibuat.

  • Sekarang, saya akan menyerahkan presentasi ini kepada Levana.

Android XR SDK untuk Unity

  • Terima kasih, Jennifer.

  • Selanjutnya, mari kita bahas kontribusi Google dalam perjalanan Android XR di Unity.

  • Jadi, selain plugin Unity OpenXR yang telah diperkenalkan Jennifer sejauh ini, Google menyediakan Android XR SDK untuk Unity dengan kemampuan tambahan yang tersedia di platform Android XR.

  • SDK ini berisi banyak fitur dan paket, dan dalam pembahasan ini, kita akan berfokus pada paket Android XR Extension for Unity.

  • Jadi, mirip dengan Android XR OpenXR dan Entity Spasial OpenXR, paket Android XR Extension for Unity sebenarnya adalah penyedia OpenXR.

  • Arsitektur paket ini terlihat seperti ini, dan dapat bekerja secara paralel atau independen.

  • Jadi, seperti semua penyedia OpenXR lainnya, paket Google dibuat langsung di antarmuka OpenXR standar.

  • Jadi, di sini kami menampilkan sejumlah fitur sebagai perbandingan di antara semua penyedia lainnya.

  • Jadi, Anda dapat membantu Anda membuat keputusan tentang kapan dan mengapa harus memilih salah satu daripada yang lain.

  • Jadi, Anda mungkin memiliki pertanyaan tentang penanda entity spasial dan yang dapat dilacak yang ditampilkan dalam tabel ini.

  • Jadi, berikut catatan sampingnya: jadi, bagi mereka yang sudah membangun aplikasi dan pengalaman di Android XR sebelumnya, kami telah menghadirkan fitur ini melalui ekstensi yang dapat dilacak dan hanya berfungsi di Android XR.

  • Kemudian, seperti yang disebutkan Jennifer, kami bekerja sebagai grup terbuka OpenXR, lalu merilis Spatial Entities Extension di sisi kanan dan memberikan pengalaman lintas platform yang konsisten.

  • Saat ini, kami menghentikan penggunaan ekstensi yang dapat dilacak dan beralih ke framework Spatial Entities.

  • Tidak hanya karena performanya yang jauh lebih baik, tetapi juga karena dukungan lintas platformnya.

Membangun dengan entity spasial

  • Kemudian, mari kita pelajari entitas spasial lebih lanjut.

  • Jadi, selain yang telah disebutkan Jennifer tentang bidang, ray casting, anchor, Anda juga dapat menemukan fitur ini didukung oleh penyedia entity spasial, seperti penanda, yang dapat mendeteksi, mendekode kode batang 2D standar, dan melacak posisinya dalam ruang 3D, serta gambar yang akan mengenali grafik 2D yang diketahui dan melacaknya dalam ruang 3D.

  • Kemudian, kotak pembatas, yang akan mengidentifikasi objek fisik, seperti keyboard, laptop, atau mouse, dan melacak kotak pembatasnya dalam pose 3D.

  • Dan dalam contoh berikutnya, kita akan mengonfigurasi fitur kotak pembatas yang disediakan oleh paket Ekstensi Google.

  • Jadi, tampilan ini hampir sama untuk semua fitur OpenXR.

  • Jadi, Anda hanya perlu beralih ke platform Android XR terlebih dahulu, lalu mengaktifkan penyedia OpenXR dan memilih fitur OpenXR yang ingin Anda gunakan untuk mem-build, misalnya, fitur kotak pembatas entity spasial yang ditampilkan di sini, lalu memperbaiki masalah validasi project.

  • Hal ini akan membantu Anda menemukan semua dependensi yang diperlukan oleh fitur tertentu, lalu menyelesaikan konflik yang disebabkan oleh beberapa fitur yang berkontribusi pada subsistem yang sama.

  • Terkadang Anda Sebagian besar Anda hanya perlu memilih satu fitur jika ingin menggunakan, misalnya, anchor, bidang, atau kotak pembatas di sini.

  • Terakhir, Anda dapat membuat scene contoh atau scene pengujian.

  • Untuk mengakses objek yang dapat dilacak saat runtime, Anda cukup menambahkan komponen AR Bounding Box Manager, yang mirip dengan AR Anchor Manager, lalu menggunakan antarmuka AR Foundation untuk mengaksesnya.

  • Atau, Anda juga dapat mengimpor contoh entity spasial yang disediakan oleh paket ekstensi kami sebagai template untuk memulai.

  • Berikut perbedaan utama saat Anda menggunakan fitur AR Foundation di Android XR.

  • Untuk membantu memahami lingkungan di sekitar pengguna, aplikasi Anda biasanya memerlukan akses ke data sensitif di sekitar lingkungan.

  • Dan untuk melindungi pengguna, Android XR membatasi sistem-- akses data di balik izin.

  • Anda mungkin sudah familier dengan hal itu, seperti panggilan izin Android normal, seperti akses kamera atau akses lokasi, dan hal-hal semacam itu.

  • Kemudian, praktik terbaik di sini adalah menonaktifkan komponen pengelola saat memulai, baik dari editor, seperti yang dapat Anda lihat di sisi kanan, atau dari skrip, seperti peristiwa Awake.

    void Awake() {
        planeManager = GetComponent<ARPlaneManager>();
        planeManager.enabled = false;
        boundingBoxManager = GetComponent<ARBoundingBoxManager>();
        boundingBoxManager.enabled = false;
        permissionUtil = GetComponent<AndroidXRPermissionUtil>();
    }
    
    void OnEnable() {
        StartCoroutine(WaitForPermissions());
    }
  • Kemudian, setelah memberikan semua izin yang diperlukan, Anda dapat mengaktifkan pengelola dari skrip, seperti yang dilakukan helper WaitForPermissions di sini.

    IEnumerator WaitForPermissions() {
        planeManager.enabled = false;
        boundingBoxManager.enabled = false;
    
        yield return new WaitUntil(() =>
            permissionUtil.AllPermissionGranted());
    
        // Enable after granted permissions and
        // restart subsystems.
        planeManager.enabled = true;
        boundingBoxManager.enabled = true;
    
        // Save permission status.
        permissionGranted = true;
    }
  • Dengan demikian, Anda dapat menghindari kegagalan inisialisasi subsistem yang disebabkan oleh izin yang tidak memadai.

  • Dan ini adalah fitur khusus di sini.

  • Seperti yang dijelaskan Jennifer tentang anchor menggunakan AR Foundation, untuk memperluas kemampuan anchor di Android XR, paket kami juga menyediakan fitur baru yang disebut anchor yang dapat dibagikan.

  • Fitur ini mereplikasi fungsi anchor AR Foundation yang saat ini didukung dan juga dilengkapi dengan beberapa fungsi tambahan, seperti anchor geospasial.

  • Seperti yang dapat Anda bayangkan, anchor adalah jembatan nyata yang menghubungkan dunia virtual dan fisik.

  • Meskipun Jennifer telah menjelaskan cara membuat, menyimpan, dan memuatnya, semua ini terjadi di ruang lokal, seperti ruang keluarga pengguna Anda.

  • Namun, bagaimana dengan negara lainnya?

  • Dan bagaimana kita bisa membagikannya satu sama lain?

Geospatial API

  • Di sinilah Geospatial API berperan.

  • Dengan fitur ini, Anda dapat membuat anchor geospasial berdasarkan lokasi di dunia nyata, seperti toko buku favorit atau tempat pertemuan di taman yang luas.

  • Jadi, Geospatial API dapat memberi Anda pelacak posisi geografis yang akurat melalui VPS, yang juga dikenal sebagai sistem pemosisian virtual, seperti GPS, tetapi menggunakan data Street View luar ruangan untuk memberikan hasil pelacakan yang jauh lebih akurat.

  • Jadi, beberapa dari Anda mungkin sudah tidak asing lagi dengan tampilan ini jika Anda pernah menggunakan fitur geospasial ARCore sebelumnya.

  • Jadi, untuk mengakses Geospatial API di Android XR, kita harus terhubung terlebih dahulu ke backend yang dihosting di Google Cloud Platform.

  • Karena backend geospasial sebenarnya didukung oleh layanan ARCore di Google Cloud, Anda dapat mengikuti langkah yang sama persis untuk mengonfigurasi project cloud Google dengan akses ARCore API.

  • Semua ini kemudian akan memungkinkan penggunaan fitur Google Cloud Android XR yang disediakan oleh paket ekstensi kami.

  • Setelah mengaktifkan Geospatial API dan mengambil kunci API dari project Google Cloud, Anda dapat mengaktifkan fitur ini dan mengonfigurasi autentikasi melalui menu setelan OpenXR yang ditampilkan di sini, dan-- atau sebagai alternatif, Anda dapat mengonfigurasinya secara manual melalui API pembuatan skrip yang disebut TrySetAuthenticationAsync.

    async Task TrySetAuthentication() {
        googleCloudFeature =
            OpenXRSettings.Instance
                .GetFeature<XRGoogleCloudFeature>();
        var result = await googleCloudFeature
            .TrySetAuthenticationAsync(
                strategy, credential);
        if (result.IsSuccess()) {
            // Ready to use for geospatial tracker.
        } else if (result.IsUnsupported())  {
            // Google Cloud feature is not supported
        } else if (result.IsKeylessError()) {
            // Confirm if keyless has been set up properly.
        } else {
            // Handling other common OpenXR errors.
        }
    }
  • Perlu diperhatikan bahwa platform Android XR saat ini hanya mendukung autentikasi kunci API, tetapi dukungan kredensial lainnya akan segera hadir di masa mendatang.

  • Jadi, setelah melakukan autentikasi, Anda dapat menggunakan pengelola geospasial untuk mengakses kemampuan geospasial.

  • Sangat disarankan untuk memeriksa Google Maps terlebih dahulu terkait cakupan VPS sebelum integrasi.

  • Oleh karena itu, Anda juga harus memiliki akses jaringan saat menggunakan fitur ini.

  • Jadi, XR Geospatial Manager berfungsi mirip dengan komponen AR Session yang disediakan oleh AR Foundation.

  • Jadi, class ini dilengkapi dengan properti status statis untuk menunjukkan dukungan sistem dan status pelacakan pelacak geospasial.

  • Anda dapat mendaftarkan peristiwa perubahan status dengan callback seperti ini.

    void OnGeospatialStateChanged(XRGeospatialStateChangedEventArgs eventArgs) {
        bool isInitFailed = eventArgs.CurrState == XRGeospatialState.InitializationFailed;
        if (isInitFailed && XRGeospatialManager.InitializationResult.IsCloudAuthError()) {
            // Handle cloud authentication issues.
        } else if (isInitFailed) {
            // Check XRGeospatialManager.InitializationResult for other common OpenXR errors.
        } else {
            // Iterate runtime state change, and handle accordingly.
        }
    }
    
    private void OnEnable() {
        XRGeospatialManager.OnStateChanged += OnGeospatialStateChanged;
    }
  • Setelah status geospasial berjalan, Anda dapat menggunakan instance pengelola ini untuk semua fungsi berikut.

  • Pertama, misalnya untuk memeriksa ketersediaan VPS dengan lokasi GPS yang diberikan, di sini kita menggunakan API lokasi Unity untuk mendapatkan nilai GPS, lalu memeriksa ketersediaan VPS.

    async Task CheckVPSAvailability(CancellationToken token) {
        var location = Input.location.lastData;
        try {
            var result = await geospatialManager.TryCheckVPSAvailabilityAsync(
                location.latitude, location.longitude);
            token.ThrowIfCancellationRequested();
            if (result.status.nativeStatusCode == (int)XrResultAndroid.GeospatialCoordinateInvalid) {
                // Invalid coordinates, try with another location.
            } else if (result.status.IsError()) {
                // Handle common OpenXR error: result.status.ToOpenXRStatus()
            }  else if (result.value == XRVPSAvailability.Available)  {
                // You may use this pose to attach geospatial anchors.
                var currentGeospatialPose = new XRGeospatialPose(location);
            }
        }
    }
  • Jadi, ini pada dasarnya adalah pengganti jika Anda tidak ingin memeriksa dukungan VPS melalui peta, tetapi Anda harus pergi ke luar ruangan untuk memeriksa status GPS yang sebenarnya.

  • Kemudian, Anda juga dapat mengonversi pose antara pose Unity dan pose geospasial dengan TryLocate.

    // Geospatial Pose -> Unity Pose
    var geospatialPose =
        new XRGeospatialPose(Input.location.lastData);
    if (geospatialManager.TryLocate(
            geospatialPose, out XRPoseResult result)) {
        if (result.IsPositionValid ||
            result.IsPositionTracked) {
            transform.position = result.Pose.position;
        }
        if (result.IsRotationValid ||
            result.IsRotationTracked) {
            transform.rotation = result.Pose.rotation;
        }
    }
    // Unity Pose -> Geospatial Pose
    Pose pose = new Pose(
        transform.position, transform.rotation);
    if (geospatialManager.TryLocate(
          pose, out XRGeospatialPoseResult result)) {
        if (result.IsPositionValid ||
            result.IsRotationValid) {
            // You may use for anchor attachment.
        }
    }
  • Dengan mengambil hasil dari pemeriksaan VPS atau konversi pose, Anda dapat memasang anchor spasial ke pose geospasial tertentu atau pada jenis permukaan yang diketahui, seperti medan atau atap.

    async void PlaceAnchor(XRGeospatialPose pose) {
        try {
            Result<ARShareableAnchor> anchorResult;
            XRGeospatialSurfaceType typeToPlace = /* Choose your target type */;
            if (typeToPlace == XRGeospatialSurfaceType.Default) {
                anchorResult = geospatialManager.TryAttachGeospatialAnchor(pose);
            } else {
                pose.Altitude = 0;
                anchorResult = await geospatialManager.TryAttachSurfaceAnchorAsync(typeToPlace, pose);
            }
            if (anchorResult.status.IsSuccess()) {
                // ARShareableAnchorManager will track the anchor and update it.
            } else {
                // Handle OpenXR failures.
            }
        }
    }
  • Kemudian, saat Anda menggabungkan semua ini, Anda dapat membangun pengalaman spasial yang benar-benar ajaib dengan dunia nyata sebagai fokus utamanya.

  • Jadi di sini, kita menempatkan panah untuk mengarahkan audiens ke tempat yang ditargetkan di dunia nyata.

  • Oke.

  • Jadi, Android XR SDK bukan satu-satunya paket yang kami sediakan untuk developer Unity.

  • Android XR SDK dari Google untuk Unity kini juga menyertakan Android XR Interaction Framework dan paket Android XR Audio.

  • Kami juga sangat antusias untuk memperluas Android XR SDK dengan lebih banyak dukungan fitur dan menyertakan lebih banyak Spatial Entity.

Rangkuman dan referensi

  • Baiklah, kita sudah sampai di akhir sesi.

  • Anda dapat mengikuti roadmap Unity secara online untuk melihat apa yang akan hadir berikutnya.

  • Jangan lupa, kami memiliki Unity 7, Unity generasi berikutnya, yang akan hadir awal tahun depan.

  • Sementara itu, Anda dapat mencoba alat ini dan membuat project menggunakan template Mixed Reality atau melihat project contoh AR Foundation di GitHub kami.

  • Selain itu, untuk mempelajari lebih lanjut Spatial Entity dan dukungan paket Unity kami, Anda dapat membuka halaman di situs developer Android.

  • Terima kasih, semuanya.

  • Kami tidak sabar melihat apa yang dapat Anda buat dengan AR Foundation dan Spatial Entity di Android XR.

Kode

Cuplikan kode

Cuplikan C# pada 10:34 di "Anchor lokal dan persistensi"
async void CreateAnchorAsync(ARAnchorManager manager, Pose pose) {
    var result = await manager.TryAddAnchorAsync(pose);
    if (result.status.IsError()) {
        // handle error
        return;
    }
    var anchor = result.value;
}
Cuplikan C# pada menit 10:43 di "Anchor lokal dan persistensi"
void RemoveAnchor(ARAnchorManager manager, ARAnchor anchor) {
    var result = manager.TryRemoveAnchor(anchor.trackableId);
    if (result.status.IsError()) {
        // handle error
        return;
    }
}

void DestroyAnchorComponent(ARAnchor anchor) {
    Destroy(anchor);
}
Cuplikan C# pada menit 11:00 di "Anchor lokal dan persistensi"
async void SaveAnchorAsync(ARAnchorManager manager, ARAnchor anchor) {
    var result = await manager.TrySaveAnchorAsync(anchor);
    if (result.status.IsError()) {
        // handle error
        return;
    }

    // Save this value, then return it as an input parameter
    SerializableGuid guid = result.value;
}
Cuplikan C# pada menit 11:17 di "Anchor lokal dan persistensi"
async void LoadAnchorAsync(ARAnchorManager manager, SerializableGuid guid) {
    var result = await manager.TryLoadAnchorAsync(guid);
    if (result.status.IsError()) {
        // handle error
        return;
    }

    ARAnchor anchor = result.value;
}
Cuplikan C# pada menit 16:45 di "Membangun dengan entity spasial"
void Awake() {
    planeManager = GetComponent<ARPlaneManager>();
    planeManager.enabled = false;
    boundingBoxManager = GetComponent<ARBoundingBoxManager>();
    boundingBoxManager.enabled = false;
    permissionUtil = GetComponent<AndroidXRPermissionUtil>();
}

void OnEnable() {
    StartCoroutine(WaitForPermissions());
}
Cuplikan C# pada menit 16:58 di "Membangun dengan entity spasial"
IEnumerator WaitForPermissions() {
    planeManager.enabled = false;
    boundingBoxManager.enabled = false;

    yield return new WaitUntil(() =>
        permissionUtil.AllPermissionGranted());

    // Enable after granted permissions and
    // restart subsystems.
    planeManager.enabled = true;
    boundingBoxManager.enabled = true;

    // Save permission status.
    permissionGranted = true;
}
Cuplikan C# pada menit 19:12 di "Geospatial API"
async Task TrySetAuthentication() {
    googleCloudFeature =
        OpenXRSettings.Instance
            .GetFeature<XRGoogleCloudFeature>();
    var result = await googleCloudFeature
        .TrySetAuthenticationAsync(
            strategy, credential);
    if (result.IsSuccess()) {
        // Ready to use for geospatial tracker.
    } else if (result.IsUnsupported())  {
        // Google Cloud feature is not supported
    } else if (result.IsKeylessError()) {
        // Confirm if keyless has been set up properly.
    } else {
        // Handling other common OpenXR errors.
    }
}
Cuplikan C# pada 20:24 di "Geospatial API"
void OnGeospatialStateChanged(XRGeospatialStateChangedEventArgs eventArgs) {
    bool isInitFailed = eventArgs.CurrState == XRGeospatialState.InitializationFailed;
    if (isInitFailed && XRGeospatialManager.InitializationResult.IsCloudAuthError()) {
        // Handle cloud authentication issues.
    } else if (isInitFailed) {
        // Check XRGeospatialManager.InitializationResult for other common OpenXR errors.
    } else {
        // Iterate runtime state change, and handle accordingly.
    }
}

private void OnEnable() {
    XRGeospatialManager.OnStateChanged += OnGeospatialStateChanged;
}
Cuplikan C# pada menit 20:38 di "Geospatial API"
async Task CheckVPSAvailability(CancellationToken token) {
    var location = Input.location.lastData;
    try {
        var result = await geospatialManager.TryCheckVPSAvailabilityAsync(
            location.latitude, location.longitude);
        token.ThrowIfCancellationRequested();
        if (result.status.nativeStatusCode == (int)XrResultAndroid.GeospatialCoordinateInvalid) {
            // Invalid coordinates, try with another location.
        } else if (result.status.IsError()) {
            // Handle common OpenXR error: result.status.ToOpenXRStatus()
        }  else if (result.value == XRVPSAvailability.Available)  {
            // You may use this pose to attach geospatial anchors.
            var currentGeospatialPose = new XRGeospatialPose(location);
        }
    }
}
Cuplikan C# pada menit 21:03 di "Geospatial API"
// Geospatial Pose -> Unity Pose
var geospatialPose =
    new XRGeospatialPose(Input.location.lastData);
if (geospatialManager.TryLocate(
        geospatialPose, out XRPoseResult result)) {
    if (result.IsPositionValid ||
        result.IsPositionTracked) {
        transform.position = result.Pose.position;
    }
    if (result.IsRotationValid ||
        result.IsRotationTracked) {
        transform.rotation = result.Pose.rotation;
    }
}
Cuplikan C# pada menit 21:03 di "Geospatial API"
// Unity Pose -> Geospatial Pose
Pose pose = new Pose(
    transform.position, transform.rotation);
if (geospatialManager.TryLocate(
      pose, out XRGeospatialPoseResult result)) {
    if (result.IsPositionValid ||
        result.IsRotationValid) {
        // You may use for anchor attachment.
    }
}
Cuplikan C# pada menit 21:11 di "Geospatial API"
async void PlaceAnchor(XRGeospatialPose pose) {
    try {
        Result<ARShareableAnchor> anchorResult;
        XRGeospatialSurfaceType typeToPlace = /* Choose your target type */;
        if (typeToPlace == XRGeospatialSurfaceType.Default) {
            anchorResult = geospatialManager.TryAttachGeospatialAnchor(pose);
        } else {
            pose.Altitude = 0;
            anchorResult = await geospatialManager.TryAttachSurfaceAnchorAsync(typeToPlace, pose);
        }
        if (anchorResult.status.IsSuccess()) {
            // ARShareableAnchorManager will track the anchor and update it.
        } else {
            // Handle OpenXR failures.
        }
    }
}