Table of Contents

Créer une extension d’entrée de trame externe

Grâce à une source de trame externe (ExternalFrameSource), les développeurs peuvent étendre EasyAR Sense avec des implémentations de caméra personnalisées pour prendre en charge des appareils de tête spécifiques ou d’autres périphériques d’entrée. Le contenu suivant présente la structure des types de source de trame externe et les définitions d’interface.

Avant de commencer

Types de sources de trame externe

---
  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

Le schéma ci-dessus montre la structure des types de sources de trame externe.

Selon les données d’entrée, les sources de trame externe peuvent être divisées en deux catégories :

  • Extension d’entrée d’image et de données de mouvement de l’appareil
    • Réalisée en héritant de ExternalDeviceMotionFrameSource : l’appareil et son SDK fournissent le suivi de mouvement 6DoF. Le transform de la caméra virtuelle et les autres contrôles sont gérés par le SDK de l’appareil.
    • Réalisée en héritant de ExternalDeviceRotationFrameSource : l’appareil et son SDK fournissent le suivi de rotation 3DoF. Le transform de la caméra virtuelle et les autres contrôles sont gérés par le SDK de l’appareil.
  • Extension d’entrée d’image
    • Réalisée en héritant de ExternalImageStreamFrameSource : fournit uniquement une entrée d’image. Le transform de la caméra virtuelle et les autres contrôles sont gérés par EasyAR.

Lors de l’intégration de ces sources de trame externe, les fonctions AR disponibles diffèrent :

  • Extension d’entrée d’image et de données de mouvement de l’appareil ExternalDeviceMotionFrameSource
    • Mega
    • Suivi de mouvement (fourni par l’appareil lui-même)
    • Carte spatiale sparse
    • Carte spatiale dense
    • Suivi d’image (avec fusion de mouvement)
    • Reconnaissance cloud d’image
    • Suivi d’objet (avec fusion de mouvement)
  • Extension d’entrée d’image et de données de mouvement de l’appareil ExternalDeviceRotationFrameSource
    • Mega
    • Suivi d’image (sans fusion de mouvement)
    • Reconnaissance cloud d’image
    • Suivi d’objet (sans fusion de mouvement)
  • Extension d’entrée d’image ExternalImageStreamFrameSource
    • Suivi d’image (sans fusion de mouvement)
    • Reconnaissance cloud d’image
    • Suivi d’objet (sans fusion de mouvement)

Définition de l’interface de la source de trame externe

Lors de la création d’une source de trame externe, vous devez implémenter les interfaces correspondantes. Les sections suivantes présentent ces définitions et leur usage.

Définition de l’appareil

  • FrameSource.IsHMD : définir s’il s’agit d’un casque Définissez à true uniquement sur un appareil de type casque. Si l’appareil est un casque, les informations de diagnostic seront affichées sur un panneau 3D devant la caméra plutôt que sur l’écran. Certaines fonctions AR se comportent différemment sur un casque.

  • FrameSource.Display : définir le système d’affichage Fournit des informations sur la rotation de l’affichage en cours, etc. Vous pouvez utiliser Display.DefaultSystemDisplay ou Display.DefaultHMDDisplay pour obtenir les informations d’affichage par défaut. En général, Display.DefaultHMDDisplay peut être utilisé sur un casque.

Aucun réglage supplémentaire.

Disponibilité

  • FrameSource.IsAvailable : disponibilité Sert à déterminer si la frame source peut être utilisée. Si une frame source n’est pas disponible sur l’appareil ou l’environnement courant, cette valeur doit être false. Si cette valeur est Optional<bool>.Empty, la coroutine FrameSource.CheckAvailability() est appelée, et FrameSource.IsAvailable doit être mise à jour avant la fin de la coroutine. L’interface de disponibilité est utilisée lors de l’assemblage de la session. Les composants non disponibles ne seront pas sélectionnés et leurs méthodes ne seront pas appelées à l’exécution.
  • FrameSource.CheckAvailability() (optionnel) : coroutine de vérification de disponibilité Appelée lorsque FrameSource.IsAvailable vaut Optional<bool>.Empty. Le processus d’assemblage de la session est bloqué jusqu’à la fin de cette coroutine.

Origine de session

  • ExternalDeviceFrameSource.OriginType : type d’origine

    • XROrigin : le SDK de l’appareil utilise Unity.XR.CoreUtils.XROrigin comme origine.
    • Custom : le SDK de l’appareil utilise une origine personnalisée. Il faut alors préciser ExternalDeviceFrameSource.Origin.
    • None : le SDK de l’appareil ne définit pas d’origine. L’origine sera alors automatiquement choisie ou créée dans la scène, mais ne se déplacera pas. La session ne prendra en charge que le mode centré SessionOrigin. Le développeur de l’application doit être très prudent quant au placement des objets virtuels, car tous les targets et leur contenu se déplaceront toujours dans le système de coordonnées Unity, et une partie du contenu utilisateur (par exemple le système physique) ne fonctionnera pas correctement. Les objets placés dans le système de coordonnées monde Unity ne pourront jamais s’afficher correctement dans aucune configuration.
  • ExternalDeviceFrameSource.Origin : objet origine Définissez votre propre origine uniquement lorsque ExternalDeviceFrameSource.OriginType vaut Custom.

Caméra virtuelle

  • FrameSource.Camera : caméra virtuelle La caméra n’est pas contrôlée par la session, et son transform, sa matrice de projection ainsi que le rendu du fond d’image doivent être gérés par le code externe. Cette caméra n’est utilisée que sur les casques, pour afficher certains textes de diagnostic devant l’utilisateur. Si ExternalDeviceFrameSource.OriginType vaut XROrigin, il n’est pas nécessaire de la définir, car EasyAR utilisera automatiquement la caméra définie dans le framework Unity XR.

Caméra physique

  • FrameSource.DeviceCameras : paramètres de caméra physique Fournit la caméra physique à l’origine des données de trame caméra. Si les données proviennent de plusieurs caméras, la liste doit inclure toutes les caméras physiques. Il faut s’assurer que les bons paramètres de caméra physique sont disponibles lorsque FrameSource.CameraFrameStarted vaut true.
  • FrameSource.CameraFrameStarted : indique si l’entrée des trames caméra a commencé Retourne true lorsque la caméra physique est prête et que les données peuvent être entrées dans EasyAR, et false après l’arrêt de la caméra physique. Lorsque FrameSource.CameraFrameStarted vaut false, EasyAR ne fonctionne pas. Lorsque FrameSource.CameraFrameStarted vaut true, il faut garantir que les données FrameSource.DeviceCameras sont accessibles et que les trames caméra sont entrées de manière continue dans EasyAR. Si EasyAR détecte une absence prolongée d’entrée de trames caméra, un avertissement s’affichera pour aider à isoler le problème.

Les paramètres de caméra physique doivent correspondre à ceux de la vraie caméra de l’appareil.

  • FrameSourceCamera.CameraType : type de caméra physique Pour une caméra non frontale, comme sur un casque, choisissez généralement la caméra arrière.
  • FrameSourceCamera.CameraOrientation : angle de rotation horaire lorsque l’image de la caméra physique est affichée dans l’orientation naturelle de l’appareil Plage [0, 360).
  • FrameSourceCamera.FrameSize : taille de l’image
  • FrameSourceCamera.FrameRateRange : plage de fréquence d’images Définit x comme borne inférieure de la plage et y comme borne supérieure.
  • DeviceFrameSourceCamera.AxisSystem : système d’axes utilisé pour le pose de la tête / de la caméra physique et les extrinsèques de la caméra physique Toutes les matrices doivent utiliser le même système d’axes. Si les données ne correspondent pas à un système connu, il faut effectuer une transformation d’axes avant de les transmettre à EasyAR.
  • DeviceFrameSourceCamera.Extrinsics : extrinsèques de la caméra physique En général, il s’agit de la matrice d’étalonnage. Ses axes doivent être conformes à la définition de DeviceFrameSourceCamera.AxisSystem. Si la définition des axes des extrinsèques diffère de celle du pose réel ou ne correspond pas à la définition de DeviceFrameSourceCamera.AxisSystem, une transformation d’axes doit être effectuée avant de définir cette valeur.

Démarrage et arrêt de la session

  • FrameSource.OnSessionStart(ARSession) : gérer l’événement de démarrage de la session Valide lorsque cette frame source est sélectionnée lors de l’assemblage de la session. Peut être utilisé pour une initialisation différée et pour effectuer dans cette méthode l’initialisation spécifique à l’AR.
  • FrameSource.OnSessionStop() : gérer l’événement d’arrêt de la session Valide lorsque cette frame source est sélectionnée lors de l’assemblage de la session. Cette méthode peut détruire les ressources créées par FrameSource.OnSessionStart(ARSession) et pendant l’exécution de la session, puis restaurer l’état interne. Cette méthode est garantie d’être appelée avant la destruction de la session. Si la frame source est détruite avant la session, elle ne sera pas appelée, et la session entrera dans l’état Broken.

Trame d’entrée

  • ExternalFrameSource.TryAcquireBuffer(int) : essayer d’obtenir un bloc mémoire depuis le pool Ce bloc mémoire est généralement utilisé pour stocker les données d’image des trames caméra et les entrer dans EasyAR.
  • ExternalFrameSource.ReceivedFrameCount : compteur de trames caméra reçues par EasyAR EasyAR l’utilise pour vérifier l’état de santé de l’entrée des trames caméra de l’appareil. Cela peut être utilisé en débogage : si cette valeur n’augmente plus, cela signifie généralement que l’appareil a cessé d’entrer des données dans EasyAR.

Messages Unity

Lorsque vous utilisez les messages suivants dans un script, veillez à appeler l’implémentation de la classe de base :

Étapes suivantes

Sujets associés