Table of Contents

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

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 visore Impostare 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 display Fornisce 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 frame Chiamata 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 origine definire la propria origine solo quando ExternalDeviceFrameSource.OriginType è Custom. Non è necessario ridefinirla negli altri casi.

Fotocamera virtuale

  • FrameSource.Camera: Fotocamera virtuale La 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 fisica Fornisce 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 è iniziato Restituisce 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 fisica In 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 dispositivo L'intervallo è [0, 360).
  • FrameSourceCamera.FrameSize: Dimensione immagine
  • FrameSourceCamera.FrameRateRange: Intervallo di frame rate Definisce 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 fisica Tutte 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 fisica In 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 sessione Valido 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 sessione Valido 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

  • ExternalFrameSource.TryAcquireBuffer(int): Prova ad acquisire un blocco di memoria dal pool Questo 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 EasyAR EasyAR 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

Argomenti correlati