Implementazione personalizzata della fotocamera in Unity —— origine dati frame esterna
Attraverso l'origine dati frame esterna (ExternalFrameSource), gli sviluppatori possono estendere EasyAR Sense con implementazioni personalizzate della fotocamera, supportando così dispositivi head-mounted specifici o altri dispositivi di input. Il seguente contenuto descrive la struttura del tipo e le definizioni delle interfacce per l'origine dati frame esterna.
Prima di iniziare
- Comprendere i concetti di base di fotocamera personalizzata.
- Comprendere i concetti di base, i tipi e la selezione in fase di esecuzione di origine dei frame.
Tipi di sorgenti di frame esterno
---
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
Il diagramma sopra mostra la struttura dei tipi di sorgenti di frame esterno.
Secondo i diversi dati di input, le sorgenti di frame esterno possono essere divise in due categorie principali:
- Estensione per input di immagini e dati di movimento del dispositivo
- Implementato ereditando ExternalDeviceMotionFrameSource: dispositivo e device SDK forniscono funzionalità di tracciamento del movimento 6DoF. La trasformazione della camera virtuale e altri controlli sono gestiti dal device SDK.
- Implementato ereditando ExternalDeviceRotationFrameSource: dispositivo e device SDK forniscono funzionalità di tracciamento della rotazione 3DoF. La trasformazione della camera virtuale e altri controlli sono gestiti dal device SDK.
- Estensione per input di immagini
- Implementato ereditando ExternalImageStreamFrameSource: fornisce solo input di immagini. La trasformazione della camera virtuale e altri controlli sono gestiti da EasyAR.
Quando si integrano queste diverse sorgenti di frame esterno, le funzionalità AR disponibili variano:
- Estensione per input di immagini e dati di movimento ExternalDeviceMotionFrameSource
- Mega
- Tracciamento del movimento (fornito dal dispositivo stesso)
- Mappa spaziale sparsa
- Mappa spaziale densa
- Tracciamento immagini (supporta fusione del movimento)
- Riconoscimento immagini basato su cloud
- Tracciamento oggetti (supporta fusione del movimento)
- Estensione per input di immagini e dati di movimento ExternalDeviceRotationFrameSource
- Mega
- Tracciamento immagini (non supporta fusione del movimento)
- Riconoscimento immagini basato su cloud
- Tracciamento oggetti (non supporta fusione del movimento)
- Estensione per input di immagini ExternalImageStreamFrameSource
- Tracciamento immagini (non supporta fusione del movimento)
- Riconoscimento immagini basato su cloud
- Tracciamento oggetti (non supporta fusione del movimento)
Definizione dell'interfaccia per sorgenti dati frame esterne
Quando si crea una sorgente dati frame esterna, è necessario implementare le interfacce pertinenti. Di seguito vengono descritte la definizione e l'utilizzo di queste interfacce.
Definizione del dispositivo
FrameSource.IsHMD:
Definisce se è un dispositivo HMD
Impostato su true solo e soltanto su dispositivi HMD.
Se il dispositivo è un HMD, le informazioni di diagnostica verranno visualizzate su un pannello 3D davanti alla fotocamera anziché sullo schermo. Alcune funzionalità AR funzionano in modo leggermente diverso sui dispositivi HMD.FrameSource.Display:
Definisce il sistema di visualizzazione
Fornisce informazioni come la rotazione del display corrente.
È possibile utilizzare Display.DefaultSystemDisplay o Display.DefaultHMDDisplay per ottenere le informazioni di visualizzazione predefinite. Solitamente su dispositivi HMD è possibile utilizzare Display.DefaultHMDDisplay.
Nessuna impostazione aggiuntiva.
Disponibilità
- FrameSource.IsAvailable:
Disponibilità (Availability)
Utilizzato per determinare se la fonte dei frame è utilizzabile.
Se una fonte dei frame non è disponibile sul dispositivo corrente o nell'ambiente corrente, questo valore dovrebbe essere false.
Se questo valore è uguale a Optional<bool>.Empty, la FrameSource.CheckAvailability() coroutine viene chiamata; FrameSource.IsAvailable dovrebbe essere aggiornato prima che la coroutine termini.
L'interfaccia di disponibilità viene utilizzata durante l'assemblaggio della sessione; i componenti non disponibili non verranno selezionati e i loro metodi non verranno chiamati durante l'esecuzione della sessione. - FrameSource.CheckAvailability() (opzionale):
Coroutine per verificare la disponibilità della fonte dei frame
Viene chiamata quando FrameSource.IsAvailable è uguale a Optional<bool>.Empty. Il processo di assemblaggio della sessione viene bloccato fino al termine di questa coroutine.
Origine della sessione
ExternalDeviceFrameSource.OriginType:
Tipo di origine- XROrigin: L'SDK del dispositivo utilizza Unity.XR.CoreUtils.XROrigin come origine.
- Custom: L'SDK del dispositivo utilizza un'origine personalizzata. Specificare ExternalDeviceFrameSource.Origin.
- None: L'SDK del dispositivo non definisce un'origine.
L'origine verrà selezionata o creata automaticamente dalla scena, ma non si sposterà.
La sessione supporterà solo la modalità centro SessionOrigin. Gli sviluppatori devono prestare attenzione al posizionamento degli oggetti virtuali, poiché tutti i target e i loro contenuti si sposteranno sempre nel sistema di coordinate di Unity. Alcune funzionalità (ad esempio il sistema fisico) potrebbero non funzionare correttamente. Gli oggetti posizionati nel sistema di coordinate globale di Unity non verranno mai visualizzati nella posizione corretta in nessuna configurazione.
ExternalDeviceFrameSource.Origin:
Oggetto origine
Definisci la tua origine solo quando ExternalDeviceFrameSource.OriginType è Custom. Non è necessario ridefinirla in altri casi.
Fotocamera virtuale
- FrameSource.Camera:
Fotocamera virtuale
La fotocamera non è controllata dalla sessione. La trasformazione della fotocamera, la matrice di proiezione e il rendering dello sfondo dell'immagine dovrebbero essere controllati da codice esterno.
Questa fotocamera viene utilizzata solo su visori per mostrare alcuni testi diagnostici davanti agli occhi.
Non è necessario definire quando ExternalDeviceFrameSource.OriginType è XROrigin. EasyAR utilizzerà automaticamente la fotocamera definita nel framework XR di Unity.
Fotocamera fisica
- FrameSource.DeviceCameras:
Parametri della fotocamera fisica
Fotocamera fisica che fornisce i frame. Se i frame provengono da più fotocamere, l'elenco deve includerle tutte.
Garantire che quando FrameSource.CameraFrameStarted è true, i parametri della fotocamera fisica siano accessibili correttamente. - FrameSource.CameraFrameStarted:
Input frame fotocamera attivo
Restituisce true quando la fotocamera fisica è pronta a inviare dati a EasyAR, false quando si arresta. Se è false, EasyAR non funziona. Quando è true, garantire accesso continuo a FrameSource.DeviceCameras e flusso costante di frame. EasyAR genera un avviso dopo prolungata assenza di frame per facilitare la diagnosi di problemi.
I parametri devono corrispondere a quelli della fotocamera fisica reale.
- FrameSourceCamera.CameraType:
Tipo fotocamera fisica
Per dispositivi come headset (non frontali), selezionare "posteriore". - FrameSourceCamera.CameraOrientation:
Rotazione oraria necessaria per visualizzare l'immagine nell'orientamento naturale del dispositivo
Intervallo: [0, 360). - FrameSourceCamera.FrameSize:
Dimensioni immagine - FrameSourceCamera.FrameRateRange:
Intervallo frame-rate
x: limite inferiore, y: limite superiore. - DeviceFrameSourceCamera.AxisSystem:
Sistema di assi per pose head/fotocamera ed estrinseci
Tutte le matrici devono usare lo stesso sistema. Se i dati non corrispondono a sistemi noti, applicare trasformazioni prima di passarli a EasyAR. - DeviceFrameSourceCamera.Extrinsics:
Parametri estrinseci della fotocamera
Generalmente matrici calibrate. Gli assi devono rispettare DeviceFrameSourceCamera.AxisSystem. Se gli estrinseci o le pose non corrispondono, applicare trasformazioni prima dell'impostazione.
Avvio e interruzione della sessione
- FrameSource.OnSessionStart(ARSession):
Gestisce l'evento di avvio della sessioneValido quando questo frame source è selezionato durante l'assemblaggio della sessione. Può essere utilizzato per inizializzazione differita, eseguendo lavori di inizializzazione specifici per AR in questo metodo. - FrameSource.OnSessionStop():
Gestisce l'evento di interruzione della sessioneValido quando questo frame source è selezionato durante l'assemblaggio della sessione. Può essere utilizzato per distruggere le risorse create in FrameSource.OnSessionStart(ARSession) e durante l'esecuzione della sessione e ripristinare lo stato interno. L'invocazione di questo metodo è garantita prima della distruzione della sessione. Se il frame source viene distrutto prima della sessione, questo metodo non verrà invocato e la sessione entrerà nello stato Broken.
Frame di input
ExternalDeviceMotionFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Pose, MotionTrackingStatus):
Input dati fotogrammi della fotocameraExternalDeviceRotationFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Quaternion):
Input dati fotogrammi della fotocamera
Può essere chiamato in qualsiasi thread, purché le API del device SDK siano thread-safe.
Questi dati devono corrispondere all'esposizione del sensore della fotocamera fisica. Si consiglia di inserire dati a 30 o 60 fps. La frequenza minima accettabile è 2, ma alcuni algoritmi potrebbero risentirne in termini di reattività. Se disponibili, si consiglia di inserire dati a colori, poiché ciò aiuta l'efficacia di Mega.
Per un'efficienza ottimale, è possibile progettare la catena di dati per far passare direttamente i dati YUV grezzi tramite memoria condivisa, passare direttamente il puntatore dei dati a EasyAR e prestare attenzione alla proprietà dei dati.ExternalDeviceMotionFrameSource.HandleRenderFrameData(double, Pose, MotionTrackingStatus):
Input dati fotogrammi di renderingExternalDeviceRotationFrameSource.HandleRenderFrameData(double, Quaternion):
Input dati fotogrammi di rendering
Deve essere chiamato ogni fotogramma di rendering dopo che i dati del dispositivo sono pronti, senza saltare fotogrammi. Questi dati devono corrispondere a quelli che guidano la telecamera virtuale Unity nello stesso fotogramma.
- ExternalFrameSource.TryAcquireBuffer(int):
Tentativo di acquisizione di un blocco di memoria dal pool di memoria
Questo blocco di memoria viene solitamente utilizzato per memorizzare i dati dell'immagine del fotogramma della fotocamera e passarli a EasyAR. - ExternalFrameSource.ReceivedFrameCount:
Conteggio dei fotogrammi della fotocamera ricevuti da EasyAR
EasyAR lo utilizza per verificare l'integrità dell'input dei fotogrammi della fotocamera del dispositivo. Può essere utilizzato per il debug; se questo valore smette di aumentare, solitamente indica che il dispositivo ha interrotto l'invio di dati a EasyAR.
Messaggi Unity
Quando si utilizzano i seguenti messaggi negli script, è importante assicurarsi che venga chiamata l'implementazione della classe base:
Prossimi passi
- Leggi Dati-fotogramma input esterni per informazioni su dati-fotogramma fotocamera e rendering
- Crea un'estensione per Input dati immagine e movimento dispositivo
- Crea un'estensione per Input immagine