Table of Contents

Implementasi kamera kustom di Unity - sumber data frame eksternal

Melalui sumber data frame eksternal (ExternalFrameSource), pengembang dapat memperluas implementasi kamera kustom untuk EasyAR Sense agar mendukung headset tertentu atau perangkat input lainnya. Bagian berikut memperkenalkan struktur tipe dan definisi antarmuka sumber data frame eksternal.

Sebelum memulai

Jenis sumber data frame eksternal

---
  config:
    class:
      hideEmptyMembersBox: true
---
classDiagram
  class FrameSource {
    <<abstract>>
  }
  class ExternalFrameSource {
    <<abstract>>
  }
  class ExternalDeviceFrameSource  {
    <<abstract>>
  }
  class ExternalDeviceMotionFrameSource:::EasyAR {
    <<abstract>>
  }
  class ExternalDeviceRotationFrameSource:::EasyAR {
    <<abstract>>
  }
  class ExternalImageStreamFrameSource:::EasyAR {
    <<abstract>>
  }

  ExternalFrameSource --|> FrameSource
  ExternalDeviceFrameSource --|> ExternalFrameSource
  ExternalDeviceMotionFrameSource --|> ExternalDeviceFrameSource
  ExternalDeviceRotationFrameSource --|> ExternalDeviceFrameSource
  ExternalImageStreamFrameSource --|> ExternalFrameSource
  
  classDef EasyAR fill:#6e6ce6,stroke:#333,color:#fff

Diagram di atas menunjukkan struktur tipe sumber data frame eksternal.

Berdasarkan data input yang berbeda, sumber data frame eksternal dapat dibagi menjadi dua kategori utama:

  • Ekstensi input data gambar dan gerakan perangkat
    • Diimplementasikan dengan menurunkan dari ExternalDeviceMotionFrameSource: perangkat dan SDK perangkat menyediakan fungsi pelacakan gerakan 6DoF. Transform kamera virtual dan kontrol lainnya ditangani oleh SDK perangkat.
    • Diimplementasikan dengan menurunkan dari ExternalDeviceRotationFrameSource: perangkat dan SDK perangkat menyediakan fungsi pelacakan rotasi 3DoF. Transform kamera virtual dan kontrol lainnya ditangani oleh SDK perangkat.
  • Ekstensi input gambar
    • Diimplementasikan dengan menurunkan dari ExternalImageStreamFrameSource: hanya menyediakan input gambar. Transform kamera virtual dan kontrol lainnya ditangani oleh EasyAR.

Saat mengintegrasikan beberapa sumber data frame eksternal ini, fitur AR yang dapat digunakan berbeda:

  • Ekstensi input data gambar dan gerakan perangkat ExternalDeviceMotionFrameSource
    • Mega
    • Pelacakan gerakan (disediakan oleh perangkat itu sendiri)
    • Peta ruang jarang
    • Peta ruang padat
    • Pelacakan gambar (mendukung fusi gerakan)
    • Pengenalan gambar cloud
    • Pelacakan objek (mendukung fusi gerakan)
  • Ekstensi input data gambar dan gerakan perangkat ExternalDeviceRotationFrameSource
    • Mega
    • Pelacakan gambar (tidak mendukung fusi gerakan)
    • Pengenalan gambar cloud
    • Pelacakan objek (tidak mendukung fusi gerakan)
  • Ekstensi input gambar ExternalImageStreamFrameSource
    • Pelacakan gambar (tidak mendukung fusi gerakan)
    • Pengenalan gambar cloud
    • Pelacakan objek (tidak mendukung fusi gerakan)

Definisi antarmuka sumber data frame eksternal

Saat membuat sumber data frame eksternal, antarmuka terkait harus diimplementasikan. Berikut adalah definisi antarmuka ini dan cara menggunakannya.

Definisi perangkat

  • FrameSource.IsHMD: Mendefinisikan apakah perangkat adalah headset
    Hanya atur ke true pada perangkat headset.
    Jika perangkat adalah headset, informasi diagnostik akan ditampilkan pada papan 3D di depan kamera, bukan di layar. Beberapa fitur AR mungkin berjalan sedikit berbeda pada perangkat headset.

  • FrameSource.Display: Mendefinisikan sistem tampilan
    Menyediakan informasi seperti rotasi tampilan saat ini.
    Anda dapat menggunakan Display.DefaultSystemDisplay atau Display.DefaultHMDDisplay untuk memperoleh informasi tampilan default. Biasanya pada headset dapat digunakan Display.DefaultHMDDisplay.

Tidak ada pengaturan tambahan.

Ketersediaan

  • FrameSource.IsAvailable: Ketersediaan (Availability)
    Digunakan untuk menentukan apakah frame source dapat digunakan.
    Jika sebuah frame source tidak tersedia pada perangkat atau lingkungan runtime saat ini, nilai ini harus false.
    Jika nilai ini sama dengan Optional<bool>.Empty, coroutine FrameSource.CheckAvailability() akan dipanggil, dan FrameSource.IsAvailable harus diperbarui sebelum coroutine berakhir.
    Antarmuka ketersediaan digunakan saat perakitan session. Komponen yang tidak tersedia tidak akan dipilih dan metodenya tidak akan dipanggil saat session berjalan.
  • FrameSource.CheckAvailability() (opsional): Coroutine untuk memeriksa apakah frame source tersedia
    Dipanggil saat FrameSource.IsAvailable sama dengan Optional<bool>.Empty. Sebelum coroutine ini berakhir, proses perakitan session akan diblokir.

Titik asal session

  • ExternalDeviceFrameSource.OriginType: Jenis titik asal

    • XROrigin: SDK perangkat menggunakan Unity.XR.CoreUtils.XROrigin sebagai titik asal.
    • Custom: SDK perangkat menggunakan titik asal kustom. ExternalDeviceFrameSource.Origin perlu ditentukan.
    • None: SDK perangkat tidak mendefinisikan titik asal. Pada saat ini titik asal akan otomatis dipilih atau dibuat dari scene, tetapi tidak akan dipindahkan.
      session hanya akan mendukung mode pusat SessionOrigin. Pengembang aplikasi harus sangat berhati-hati tentang cara menempatkan objek virtual, karena semua target dan konten di bawah target akan selalu bergerak dalam sistem koordinat Unity, dan sebagian konten pengguna, seperti sistem fisika, tidak akan dapat bekerja dengan normal. Semua objek yang ditempatkan dalam koordinat dunia Unity tidak mungkin ditampilkan pada posisi yang benar dalam konfigurasi apa pun.
  • ExternalDeviceFrameSource.Origin: Objek titik asal
    Hanya definisikan titik asal sendiri saat ExternalDeviceFrameSource.OriginType adalah Custom; pada waktu lain tidak perlu didefinisikan ulang.

Kamera virtual

  • FrameSource.Camera: Kamera virtual
    Kamera tidak dikontrol oleh session. Transform kamera, matriks proyeksi, dan rendering latar belakang gambar harus dikontrol oleh kode eksternal.
    Kamera ini hanya digunakan pada headset untuk menampilkan beberapa teks diagnostik di depan mata.
    Saat ExternalDeviceFrameSource.OriginType adalah XROrigin, tidak perlu didefinisikan; EasyAR akan otomatis menggunakan kamera yang didefinisikan dalam framework Unity XR.

Kamera fisik

  • FrameSource.DeviceCameras: Parameter kamera fisik
    Menyediakan kamera fisik untuk data frame kamera. Jika data frame kamera disediakan oleh beberapa kamera, daftar ini harus memuat semua kamera fisik.
    Pastikan parameter kamera fisik yang benar dapat diperoleh saat FrameSource.CameraFrameStarted bernilai true.
  • FrameSource.CameraFrameStarted: Apakah frame kamera mulai dimasukkan
    Mengembalikan true setelah kamera fisik siap dan dapat memasukkan data ke EasyAR, lalu mengembalikan false setelah kamera fisik berhenti berjalan. Saat FrameSource.CameraFrameStarted bernilai false, EasyAR tidak akan bekerja. Saat FrameSource.CameraFrameStarted bernilai true, data FrameSource.DeviceCameras harus dijamin dapat diakses dan data frame kamera harus terus-menerus dimasukkan ke EasyAR. Setelah EasyAR mendeteksi bahwa tidak ada input frame kamera untuk waktu yang lama, peringatan akan muncul untuk membantu pengguna memisahkan masalah saat fungsi tidak merespons.

Parameter kamera fisik harus sama dengan kamera perangkat nyata.

Memulai dan menghentikan session

  • FrameSource.OnSessionStart(ARSession): Menangani event session start
    Berlaku saat frame source ini dipilih saat perakitan session.
    Dapat digunakan untuk inisialisasi tertunda dan melakukan pekerjaan inisialisasi khusus AR dalam metode ini.
  • FrameSource.OnSessionStop(): Menangani event session stop
    Berlaku saat frame source ini dipilih saat perakitan session.
    Dalam metode ini, resource yang dibuat oleh FrameSource.OnSessionStart(ARSession) dan selama session berjalan dapat dihancurkan, dan status internal dapat dipulihkan. Metode ini dijamin dipanggil sebelum session dihancurkan. Jika frame source dihancurkan sebelum session, metode ini tidak akan dipanggil, dan session akan masuk ke status Broken.

Frame input

  • ExternalFrameSource.TryAcquireBuffer(int): Mencoba memperoleh blok memori dari memory pool
    Blok memori ini biasanya digunakan untuk menyimpan data gambar frame kamera dan memasukkannya ke EasyAR.
  • ExternalFrameSource.ReceivedFrameCount: Jumlah frame kamera yang diterima EasyAR
    EasyAR menggunakannya untuk memeriksa kesehatan input frame kamera perangkat. Ini dapat digunakan saat debugging. Jika nilai ini berhenti bertambah, biasanya berarti perangkat berhenti memasukkan data ke EasyAR.

Pesan Unity

Saat menggunakan pesan berikut dalam skrip, perhatikan untuk memastikan implementasi kelas dasar dipanggil:

Langkah berikutnya

Topik terkait