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
- Pahami konsep dasar kamera kustom.
- Pahami konsep dasar, jenis, dan metode pemilihan runtime dari sumber data frame.
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.
- FrameSourceCamera.CameraType:
Jenis kamera fisik
Dalam kasus kamera yang umumnya bukan kamera depan, seperti pada headset, pilih kamera belakang. - FrameSourceCamera.CameraOrientation:
Sudut rotasi searah jarum jam yang diperlukan saat gambar kamera fisik ditampilkan pada arah alami perangkat
Rentangnya adalah [0, 360). - FrameSourceCamera.FrameSize:
Ukuran gambar - FrameSourceCamera.FrameRateRange:
Rentang frame rate
Mendefinisikan x sebagai batas bawah rentang frame rate dan y sebagai batas atas rentang frame rate. - DeviceFrameSourceCamera.AxisSystem:
Sistem sumbu koordinat yang digunakan oleh pose kepala/kamera fisik dan ekstrinsik kamera fisik
Semua matriks harus menggunakan sistem sumbu koordinat yang sama. Jika definisi data yang digunakan tidak sesuai dengan sistem yang dikenal, lakukan transformasi sumbu koordinat sebelum mengirimkannya ke EasyAR. - DeviceFrameSourceCamera.Extrinsics:
Ekstrinsik kamera fisik
Umumnya berupa matriks hasil kalibrasi. Sumbu koordinatnya harus sesuai dengan definisi DeviceFrameSourceCamera.AxisSystem. Jika definisi sumbu koordinat ekstrinsik berbeda dari definisi sumbu koordinat pose sebenarnya, atau keduanya tidak sesuai dengan definisi DeviceFrameSourceCamera.AxisSystem, lakukan transformasi sumbu koordinat sebelum menetapkan nilai ini.
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
ExternalDeviceMotionFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Pose, MotionTrackingStatus):
Memasukkan data frame kameraExternalDeviceRotationFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Quaternion):
Memasukkan data frame kamera
Dapat dipanggil dari thread apa pun selama API SDK perangkat aman untuk thread.
Data ini harus konsisten dengan data saat sensor kamera melakukan exposure. Disarankan memasukkan data 30 atau 60 fps. Frame rate minimum yang dapat diterima adalah 2, tetapi waktu respons sebagian algoritma akan terpengaruh. Jika dapat diperoleh, disarankan memasukkan data berwarna, karena ini membantu efek Mega.
Untuk efisiensi terbaik, seluruh rantai data dapat dirancang agar data YUV mentah diteruskan langsung melalui shared memory dan pointer data langsung dikirim ke EasyAR, sambil memperhatikan kepemilikan data.ExternalDeviceMotionFrameSource.HandleRenderFrameData(double, Pose, MotionTrackingStatus):
Memasukkan data frame renderExternalDeviceRotationFrameSource.HandleRenderFrameData(double, Quaternion):
Memasukkan data frame render
Pastikan metode ini dipanggil pada setiap frame render setelah data perangkat siap, tanpa melewatkan frame. Data ini harus konsisten dengan data kamera virtual Unity saat ini dalam frame yang sama yang menggerakkan rendering.
- 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
- Baca data frame input eksternal untuk memahami data frame kamera dan data frame render
- Buat ekstensi input data gambar dan gerakan perangkat
- Buat ekstensi input gambar