Table of Contents

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

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.IsHMDDefinisce 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.DisplayDefinisce 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.

Avvio e interruzione della sessione

  • FrameSource.OnSessionStart(ARSession): Gestisce l'evento di avvio della sessione Valido 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 sessione Valido 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

  • 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

Temi correlati