Implementazione di una fotocamera personalizzata in Unity - Sorgente frame esterna
Attraverso la sorgente frame esterna (ExternalFrameSource), gli sviluppatori possono estendere EasyAR Sense con un'implementazione di fotocamera personalizzata per supportare specifici visori o altri dispositivi di input. Di seguito sono descritti la struttura dei tipi e le definizioni delle interfacce della sorgente frame esterna.
Prima di iniziare
- Conoscere le nozioni di base di fotocamera personalizzata.
- Conoscere concetti, tipi e modalità di selezione a runtime della sorgente frame.
Tipi di sorgente frame esterna
---
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 delle sorgenti frame esterne.
In base ai diversi dati di input, le sorgenti frame esterne si dividono in due categorie principali:
- Estensione di input per immagini e dati di movimento del dispositivo
- Implementata ereditando da ExternalDeviceMotionFrameSource: il dispositivo e il suo SDK forniscono un tracking del movimento 6DoF. Il transform della fotocamera virtuale e gli altri controlli sono gestiti dall'SDK del dispositivo.
- Implementata ereditando da ExternalDeviceRotationFrameSource: il dispositivo e il suo SDK forniscono un tracking della rotazione 3DoF. Il transform della fotocamera virtuale e gli altri controlli sono gestiti dall'SDK del dispositivo.
- Estensione di input per immagini
- Implementata ereditando da ExternalImageStreamFrameSource: fornisce solo input immagine. Il transform della fotocamera virtuale e gli altri controlli sono gestiti da EasyAR.
Quando si integrano queste sorgenti frame esterne, le funzionalità AR disponibili sono diverse:
- Estensione di input per immagini e dati di movimento del dispositivo ExternalDeviceMotionFrameSource
- Mega
- Tracking del movimento (fornito dal dispositivo stesso)
- Mappa spaziale sparsa
- Mappa spaziale densa
- Tracking immagine (con motion fusion)
- Riconoscimento immagini cloud
- Tracking oggetti (con motion fusion)
- Estensione di input per immagini e dati di movimento del dispositivo ExternalDeviceRotationFrameSource
- Mega
- Tracking immagine (senza motion fusion)
- Riconoscimento immagini cloud
- Tracking oggetti (senza motion fusion)
- Estensione di input per immagini ExternalImageStreamFrameSource
- Tracking immagine (senza motion fusion)
- Riconoscimento immagini cloud
- Tracking oggetti (senza motion fusion)
Definizione dell'interfaccia della sorgente frame esterna
Quando si crea una sorgente frame esterna, è necessario implementare le interfacce pertinenti. Di seguito sono descritte le definizioni e il loro uso.
Definizione del dispositivo
- FrameSource.IsHMD:
Definisce se si tratta di un visoreImpostare a true solo sui dispositivi HMD. Se il dispositivo è un visore, le informazioni di diagnostica verranno mostrate su un pannello 3D davanti alla fotocamera anziché sullo schermo. Alcune funzionalità AR possono comportarsi in modo leggermente diverso sui dispositivi HMD. - FrameSource.Display:
Definisce il sistema di displayFornisce informazioni come la rotazione del display corrente. Usare Display.DefaultSystemDisplay o Display.DefaultHMDDisplay per ottenere le informazioni di display predefinite. Di norma, sui visori si può usare Display.DefaultHMDDisplay.
Nessuna impostazione aggiuntiva.
Disponibilità
- FrameSource.IsAvailable:
DisponibilitàUsato per determinare se la sorgente frame è utilizzabile. Se una sorgente frame non è disponibile sul dispositivo o nell'ambiente corrente, questo valore deve essere false. Se il valore è Optional.Empty, verrà chiamata la coroutine FrameSource.CheckAvailability(). FrameSource.IsAvailable deve essere aggiornato prima della fine della coroutine. L'interfaccia di disponibilità viene usata durante l'assemblaggio della sessione. I componenti non disponibili non verranno selezionati e i loro metodi non verranno chiamati a runtime. - FrameSource.CheckAvailability() (opzionale):
Coroutine che verifica la disponibilità della sorgente frameChiamata quando FrameSource.IsAvailable è uguale a Optional.Empty. Il processo di assemblaggio della sessione resterà bloccato fino al termine di questa coroutine.
Origine della sessione
- ExternalDeviceFrameSource.OriginType:
Tipo di origine- XROrigin: l'SDK del dispositivo usa Unity.XR.CoreUtils.XROrigin come origine.
- Custom: l'SDK del dispositivo usa un'origine personalizzata. È necessario specificare ExternalDeviceFrameSource.Origin.
- None: l'SDK del dispositivo non definisce un'origine. In questo caso l'origine verrà selezionata o creata automaticamente dalla scena, ma non si muoverà. La sessione supporterà solo la modalità centrale SessionOrigin. Gli sviluppatori devono fare molta attenzione a come posizionano gli oggetti virtuali, perché tutti i target e i contenuti sotto i target si muoveranno sempre nel sistema di coordinate di Unity, e alcuni contenuti utente (come i sistemi fisici) non funzioneranno correttamente. Gli oggetti posizionati nel sistema di coordinate del mondo Unity non appariranno mai nella posizione corretta in nessuna configurazione.
- ExternalDeviceFrameSource.Origin:
Oggetto originedefinire la propria origine solo quando ExternalDeviceFrameSource.OriginType è Custom. Non è necessario ridefinirla negli altri casi.
Fotocamera virtuale
- FrameSource.Camera:
Fotocamera virtualeLa fotocamera non è controllata dalla sessione. Il transform e la matrice di proiezione della fotocamera, così come il rendering dello sfondo immagine, devono essere controllati da codice esterno. Questa fotocamera viene usata solo sui visori per mostrare testo diagnostico davanti agli occhi. Quando ExternalDeviceFrameSource.OriginType è XROrigin, non è necessaria alcuna definizione. EasyAR userà automaticamente la fotocamera definita nel framework Unity XR.
Fotocamera fisica
- FrameSource.DeviceCameras:
Parametri della fotocamera fisicaFornisce la fotocamera fisica che genera i frame della fotocamera. Se i frame provengono da più fotocamere, la lista deve includere tutte le fotocamere fisiche. È necessario assicurarsi di poter ottenere i parametri corretti della fotocamera fisica quando FrameSource.CameraFrameStarted è true. - FrameSource.CameraFrameStarted:
Se l'invio dei frame della fotocamera è iniziatoRestituisce true quando la fotocamera fisica è pronta e può inviare dati a EasyAR, e false quando la fotocamera smette di funzionare. Quando FrameSource.CameraFrameStarted è false, EasyAR non funzionerà. Quando è true, è necessario garantire che i dati di FrameSource.DeviceCameras siano accessibili e che i frame della fotocamera vengano inviati a EasyAR senza interruzioni. Se EasyAR rileva che i frame della fotocamera non arrivano per molto tempo, mostrerà un avviso per aiutare l'utente a isolare il problema quando una funzione non risponde.
I parametri della fotocamera fisica devono corrispondere alla fotocamera reale del dispositivo.
- FrameSourceCamera.CameraType:
Tipo di fotocamera fisicaIn genere, nei casi in cui la fotocamera non è frontale, come sui visori, si usa la fotocamera posteriore. - FrameSourceCamera.CameraOrientation:
Angolo di rotazione oraria necessario per mostrare l'immagine della fotocamera nella direzione naturale del dispositivoL'intervallo è [0, 360). - FrameSourceCamera.FrameSize:
Dimensione immagine - FrameSourceCamera.FrameRateRange:
Intervallo di frame rateDefinisce x come limite inferiore e y come limite superiore dell'intervallo. - DeviceFrameSourceCamera.AxisSystem:
Sistema di assi usato per il pose di testa/fotocamera fisica e per gli extrinsics della fotocamera fisicaTutte le matrici devono usare lo stesso sistema di assi. Se i dati usati non corrispondono a un sistema noto, è necessario eseguire la trasformazione degli assi prima di passarli a EasyAR. - DeviceFrameSourceCamera.Extrinsics:
Extrinsics della fotocamera fisicaIn genere si tratta di una matrice calibrata. Il suo sistema di assi deve rispettare la definizione di DeviceFrameSourceCamera.AxisSystem. Se la definizione degli assi degli extrinsics differisce da quella del pose reale o non è coerente con la definizione di DeviceFrameSourceCamera.AxisSystem, è necessario eseguire la trasformazione degli assi prima di impostare questo valore.
Avvio e arresto della sessione
- FrameSource.OnSessionStart(ARSession):
Gestisce l'evento di avvio della sessioneValido quando questa sorgente frame è stata selezionata durante l'assemblaggio della sessione. Può essere usato per l'inizializzazione differita e per eseguire in questo metodo l'inizializzazione specifica per l'AR. - FrameSource.OnSessionStop():
Gestisce l'evento di arresto della sessioneValido quando questa sorgente frame è stata selezionata durante l'assemblaggio della sessione. In questo metodo si possono distruggere le risorse create in FrameSource.OnSessionStart(ARSession) e durante l'esecuzione della sessione, ripristinando lo stato interno. Questo metodo viene garantito prima della distruzione della sessione. Se la sorgente frame viene distrutta prima della sessione, non verrà chiamato e la sessione entrerà nello stato Broken.
Input frame
ExternalDeviceMotionFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Pose, MotionTrackingStatus):
Invia i dati del frame della fotocameraExternalDeviceRotationFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Quaternion):
Invia i dati del frame della fotocameraPuò essere chiamato da qualsiasi thread, purché le API dell'SDK del dispositivo siano thread-safe. Questi dati devono corrispondere a quelli rilevati al momento dell'esposizione del sensore della fotocamera fisica. Si consiglia di inviare dati a 30 o 60 fps. Il frame rate minimo accettabile è 2, ma i tempi di risposta di alcuni algoritmi ne risentiranno. Quando possibile, si consiglia di inviare dati colore, perché aiuta il risultato di Mega. Per ottenere la massima efficienza, è possibile progettare l'intera catena dati in modo che i dati YUV grezzi passino direttamente tramite memoria condivisa e che il puntatore dei dati venga passato direttamente a EasyAR, facendo attenzione alla proprietà dei dati.ExternalDeviceMotionFrameSource.HandleRenderFrameData(double, Pose, MotionTrackingStatus):
Invia i dati del frame di renderingExternalDeviceRotationFrameSource.HandleRenderFrameData(double, Quaternion):
Invia i dati del frame di renderingÈ necessario chiamarlo a ogni frame di rendering dopo che i dati del dispositivo sono pronti, senza saltare frame. Questi dati devono corrispondere a quelli della fotocamera virtuale Unity corrente dello stesso frame di guida.
- ExternalFrameSource.TryAcquireBuffer(int):
Prova ad acquisire un blocco di memoria dal poolQuesto blocco di memoria viene normalmente usato per memorizzare i dati immagine dei frame della fotocamera e inviarli a EasyAR. - ExternalFrameSource.ReceivedFrameCount:
Conteggio dei frame della fotocamera ricevuti da EasyAREasyAR lo usa per controllare lo stato dell'input dei frame della fotocamera del dispositivo. È utile in fase di debug: se questo valore smette di crescere, in genere significa che il dispositivo ha smesso di inviare dati a EasyAR.
Messaggi Unity
Quando si usano i messaggi seguenti nello script, assicurarsi di chiamare l'implementazione della classe base:
Passi successivi
- Leggere Frame di input esterni per conoscere i dati dei frame della fotocamera e dei frame renderizzati
- Creare estensioni di input per immagini e movimento del dispositivo
- Creare un'estensione di input per immagini