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, sehingga mendukung perangkat headset tertentu atau perangkat input lainnya. Konten berikut menjelaskan 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 perbedaan data input, sumber data frame eksternal dapat dibagi menjadi dua kategori utama:

  • Perluasan input data gambar dan gerakan perangkat
    • Diimplementasikan dengan mewarisi ExternalDeviceMotionFrameSource: Perangkat dan SDK perangkat menyediakan fungsi pelacakan gerakan 6DoF. Transform kamera virtual dan kontrol lainnya ditangani oleh SDK perangkat.
    • Diimplementasikan dengan mewarisi ExternalDeviceRotationFrameSource: Perangkat dan SDK perangkat menyediakan fungsi pelacakan rotasi 3DoF. Transform kamera virtual dan kontrol lainnya ditangani oleh SDK perangkat.
  • Perluasan input gambar
    • Diimplementasikan dengan mewarisi ExternalImageStreamFrameSource: Hanya menyediakan input gambar. Transform kamera virtual dan kontrol lainnya ditangani oleh EasyAR.

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

  • Perluasan 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)
  • Perluasan input data gambar dan gerakan perangkat ExternalDeviceRotationFrameSource
    • Mega
    • Pelacakan gambar (tidak mendukung fusi gerakan)
    • Pengenalan gambar cloud
    • Pelacakan objek (tidak mendukung fusi gerakan)
  • Perluasan 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. Di bawah ini dijelaskan definisi antarmuka ini beserta cara penggunaannya.

Definisi perangkat

  • FrameSource.IsHMDMenentukan apakah perangkat adalah head-mounted display
    Diatur ke true hanya jika perangkat adalah head-mounted display.
    Jika perangkat adalah head-mounted display, informasi diagnostik akan ditampilkan pada papan 3D di depan kamera, bukan di layar. Beberapa fitur AR berjalan sedikit berbeda pada perangkat head-mounted display.

  • FrameSource.DisplayMenentukan sistem tampilan
    Menyediakan informasi seperti rotasi tampilan saat ini.
    Dapat menggunakan Display.DefaultSystemDisplay atau Display.DefaultHMDDisplay untuk mendapatkan informasi tampilan default.
    Biasanya Display.DefaultHMDDisplay dapat digunakan pada head-mounted display.

Tidak ada pengaturan tambahan.

Ketersediaan

  • FrameSource.IsAvailable: Ketersediaan (Availability)
    Digunakan untuk menentukan apakah frame source dapat digunakan.
    Jika sebuah frame source tidak tersedia di perangkat atau lingkungan operasi saat ini, nilainya harus false.
    Jika nilainya sama dengan Optional<bool>.Empty, coroutine FrameSource.CheckAvailability() akan dipanggil, dan FrameSource.IsAvailable harus diperbarui sebelum coroutine selesai.
    Antarmuka ketersediaan digunakan selama perakitan session, komponen yang tidak tersedia tidak akan dipilih dan metodenya tidak akan dipanggil saat session berjalan.
  • FrameSource.CheckAvailability() (opsional): Coroutine untuk memeriksa ketersediaan frame source
    Dipanggil ketika FrameSource.IsAvailable sama dengan Optional<bool>.Empty. Proses perakitan session akan diblokir hingga coroutine ini selesai.

Titik asal sesi

  • ExternalDeviceFrameSource.OriginTypeTipe titik asal

    • XROrigin:SDK perangkat menggunakan Unity.XR.CoreUtils.XROrigin sebagai titik asal.
    • Custom:SDK perangkat menggunakan titik asal kustom. Perlu menentukan ExternalDeviceFrameSource.Origin.
    • None:SDK perangkat tidak mendefinisikan titik asal. Titik asal akan dipilih atau dibuat secara otomatis dari scene, tetapi tidak akan bergerak.
      Sesinya hanya akan mendukung mode pusat SessionOrigin. Pengembang aplikasi harus berhati-hati dengan cara mereka menempatkan objek virtual karena semua target dan konten di bawah target akan selalu bergerak dalam sistem koordinat Unity, dan beberapa konten pengguna (seperti sistem fisika) tidak akan berfungsi dengan benar. Objek apa pun yang ditempatkan dalam sistem koordinat dunia Unity tidak akan pernah muncul di posisi yang benar dalam konfigurasi apa pun.
  • ExternalDeviceFrameSource.OriginObjek titik asal
    Tentukan titik asal Anda sendiri hanya dan hanya ketika ExternalDeviceFrameSource.OriginType adalah Custom, tidak diperlukan definisi ulang di waktu lain.

Kamera virtual

  • FrameSource.CameraVirtual camera
    Kamera tidak dikendalikan oleh sesi. Transformasi kamera, matriks proyeksi, dan rendering latar gambar harus dikendalikan oleh kode eksternal.
    Hanya digunakan di headset untuk menampilkan teks diagnostik di depan mata.
    Tidak perlu didefinisikan saat ExternalDeviceFrameSource.OriginType adalah XROrigin. EasyAR secara otomatis akan menggunakan kamera yang didefinisikan dalam kerangka XR Unity.

Kamera fisik

  • FrameSource.DeviceCameras: Parameter kamera fisik
    Menyediakan kamera fisik yang memberikan data frame kamera. Jika data frame kamera disediakan oleh beberapa kamera, daftar harus mencakup semua kamera fisik.
    Perlu memastikan bahwa parameter kamera fisik dapat diperoleh dengan benar saat FrameSource.CameraFrameStarted bernilai true.
  • FrameSource.CameraFrameStarted: Apakah frame kamera sudah mulai diinput
    Mengembalikan true setelah kamera fisik siap dan dapat menginput data ke EasyAR, mengembalikan false setelah kamera fisik berhenti beroperasi. Saat FrameSource.CameraFrameStarted bernilai false, EasyAR tidak akan bekerja. Saat FrameSource.CameraFrameStarted bernilai true, harus dipastikan data FrameSource.DeviceCameras dapat diakses dan terus menerus menginput data frame kamera ke EasyAR. Jika EasyAR mendeteksi tidak ada input frame kamera dalam waktu lama, peringatan akan muncul untuk membantu pengguna memutuskan pemisahan masalah saat fungsi tidak merespons.

Parameter kamera fisik harus sama dengan kamera perangkat nyata.

Memulai dan menghentikan sesi

  • FrameSource.OnSessionStart(ARSession): Menangani peristiwa mulai sesi
    Berlaku ketika frame source ini dipilih saat perakitan sesi.
    Dapat digunakan untuk inisialisasi tertunda, lakukan pekerjaan inisialisasi khusus AR dalam metode ini.
  • FrameSource.OnSessionStop(): Menangani peristiwa berhenti sesi
    Berlaku ketika frame source ini dipilih saat perakitan sesi.
    Dapat digunakan dalam metode ini untuk menghancurkan sumber daya yang dibuat oleh FrameSource.OnSessionStart(ARSession) dan selama sesi berjalan, serta mengembalikan status internal. Metode ini dijamin akan dipanggil sebelum sesi dihancurkan. Jika frame source dihancurkan sebelum sesi, metode ini tidak akan dipanggil, dan sesi akan masuk ke status Broken.
  • ExternalFrameSource.TryAcquireBuffer(int)Mencoba memperoleh blok memori dari kolam memori
    Blok memori ini biasanya digunakan untuk menyimpan data gambar frame kamera dan memasukkannya ke EasyAR.
  • ExternalFrameSource.ReceivedFrameCountJumlah frame kamera yang diterima oleh EasyAR
    EasyAR menggunakannya untuk memeriksa kesehatan masukan frame kamera perangkat. Dapat digunakan untuk debugging; jika angka ini berhenti bertambah, biasanya berarti perangkat telah berhenti memasukkan data ke EasyAR.

Pesan unity

Saat menggunakan pesan berikut dalam skrip, pastikan implementasi kelas dasar dipanggil:

Langkah selanjutnya

Topik terkait