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
- Memahami konsep dasar custom camera.
- Memahami konsep dasar, jenis-jenis, dan cara pemilihan saat proses frame data source.
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.IsHMD:
Menentukan 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.Display:
Menentukan 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.OriginType:
Tipe 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.Origin:
Objek 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.Camera:
Virtual 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.
- FrameSourceCamera.CameraType:
Tipe kamera fisik
Umumnya untuk kasus non-kamera depan, seperti pada headset, pilih kamera belakang. - FrameSourceCamera.CameraOrientation:
Sudut rotasi searah jarum jam yang diperlukan untuk menampilkan gambar kamera fisik dalam orientasi alami perangkat
Rentang [0, 360). - FrameSourceCamera.FrameSize:
Dimensi gambar - FrameSourceCamera.FrameRateRange:
Rentang frame rate
Definisikan x sebagai batas bawah rentang frame rate dan y sebagai batas atas rentang frame rate. - DeviceFrameSourceCamera.AxisSystem:
Sistem sumbu yang digunakan untuk pose kepala/kamera fisik serta ekstrinsik kamera fisik
Semua matriks harus menggunakan sistem sumbu yang sama. Jika definisi data yang digunakan tidak sesuai dengan sistem yang diketahui, perlu dilakukan transformasi sumbu sebelum diteruskan ke EasyAR. - DeviceFrameSourceCamera.Extrinsics:
Ekstrinsik kamera fisik
Biasanya berupa matriks yang dikalibrasi. Sistem sumbunya harus sesuai dengan definisi DeviceFrameSourceCamera.AxisSystem. Jika definisi sumbu ekstrinsik berbeda dengan definisi sumbu pose aktual atau keduanya tidak sesuai dengan definisi DeviceFrameSourceCamera.AxisSystem, perlu dilakukan transformasi sumbu sebelum menetapkan nilai ini.
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.
ExternalDeviceMotionFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Pose, MotionTrackingStatus):
Memasukkan data frame kameraExternalDeviceRotationFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Quaternion):
Memasukkan data frame kamera
Dapat dipanggil di thread mana pun, selama API SDK perangkat aman untuk thread.
Data ini harus konsisten dengan data saat sensor kamera fisik terekspos. Disarankan memasukkan data pada 30 atau 60 fps. Laju frame minimum yang dapat diterima adalah 2, tetapi waktu respons beberapa algoritma akan terpengaruh. Selama tersedia, disarankan memasukkan data berwarna, karena ini membantu efek Mega.
Untuk efisiensi optimal, Anda dapat merancang rantai data agar data YUV mentah langsung melewati memori bersama dan meneruskan penunjuk data langsung ke EasyAR, serta memperhatikan kepemilikan data.ExternalDeviceMotionFrameSource.HandleRenderFrameData(double, Pose, MotionTrackingStatus):
Memasukkan data frame renderExternalDeviceRotationFrameSource.HandleRenderFrameData(double, Quaternion):
Memasukkan data frame render
Harus dipastikan dipanggil setiap frame render setelah data perangkat siap, tanpa melewatkan frame. Data ini harus konsisten dengan data yang menggerakkan kamera virtual Unity saat ini dalam frame yang sama.
- 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.ReceivedFrameCount:
Jumlah 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
- Baca External input frame data untuk memahami data frame kamera dan data frame rendering
- Buat ekstensi input data gambar dan gerakan perangkat
- Buat ekstensi input gambar