Table of Contents

Obtenir les résultats d'exécution de la session

Pendant l'exécution de la session, le transform de certains objets dans la scène est modifié, ainsi que l'image de la caméra, etc. Parfois, ces modifications ne répondent pas encore aux besoins de l'application, et il peut être nécessaire d'obtenir les résultats d'exécution de chaque frame de la session pour un traitement secondaire. Cet article explique comment obtenir et utiliser ces données de résultats.

Avant de commencer

Obtenir les mises à jour de InputFrame

Vous pouvez utiliser l'événement InputFrameUpdate pour obtenir les mises à jour de InputFrame. Cet événement est déclenché uniquement lorsque InputFrame change dans les données de sortie de chaque frame de la session.

Note

InputFrameUpdate n'est valide que dans les sessions où le rendu est effectué par EasyAR. En général, il n'est pas valide lors de l'utilisation d'AR Foundation ou d'un casque, et il faut utiliser les méthodes fournies par ces bibliothèques tierces pour obtenir les mises à jour des données.

Avec InputFrame, vous pouvez obtenir l'image de la caméra physique, les paramètres de la caméra, l'horodatage, la transformation de la caméra physique par rapport au système de coordonnées mondial et l'état de suivi, etc. Cependant, comme la transformation de la caméra est déjà appliquée par la session à la caméra virtuelle et à d'autres objets, il n'est généralement pas nécessaire d'obtenir la transformation de la caméra via InputFrame.

Obtenir l'image de la caméra physique de la frame actuelle

Vous pouvez utiliser la méthode InputFrame.image() pour obtenir les données d'image de la caméra physique de type Image.

Par exemple, le code suivant peut obtenir l'image de la caméra physique lors de la mise à jour de InputFrame :

Session.InputFrameUpdate += (inputFrame) => {
    using (var image = inputFrame.image())
    {
    }
};
Attention

Lors de l'utilisation des données de type Image et d'autres données de type classe obtenues à partir de celle-ci, il est essentiel de s'assurer que Dispose() est appelé correctement (l'instruction using dans le code ci-dessus garantit cela), sinon des problèmes tels que des fuites de mémoire ou même l'arrêt des mises à jour de l'image peuvent survenir.

Si vous devez conserver InputFrame ou Image pour la frame suivante, vous devez augmenter la valeur de ARAssembly.ExtraBufferCapacity en fonction de la quantité de données conservée, sinon l'obtention des données peut échouer en raison d'un manque de mémoire tampon.

Si vous devez conserver InputFrame, vous devez également appeler la méthode Clone() pour créer une copie de référence, puis appeler Dispose() sur la copie lorsque vous n'en avez plus besoin.

Comme la fréquence d'images de la caméra physique est généralement inférieure à la fréquence de rendu, l'événement InputFrameUpdate n'est pas déclenché à chaque frame de rendu. De même, le rendu de l'image de la caméra physique n'est pas mis à jour à chaque frame de rendu. Le contenu de l'image pour toutes les frames de rendu jusqu'au prochain déclenchement de InputFrameUpdate est cohérent avec l'image du InputFrame actuel.

Note

L'image dans InputFrame est toujours cohérente avec l'image de fond de la caméra virtuelle de la frame actuelle, mais le rendu de l'image de fond peut subir une mise à l'échelle et un recadrage, il est donc normal que la taille ou la proportion de l'image obtenue ne corresponde pas à celle affichée à l'écran.

Il est également important de noter que les données d'image renvoyées par InputFrame.image() sont accessibles au CPU, ce n'est pas une texture GPU. Si vous avez besoin d'utiliser les données d'image sur le GPU, vous devez les télécharger dans une texture GPU, ou obtenir directement une texture GPU via l'interface CameraImageRenderer.RequestTargetTexture(Action<Camera, RenderTexture>).

[Optionnel] Intercepter le rendu de l'image de la caméra physique

Vous pouvez utiliser ARAssembly.CameraImageRenderer pour contrôler le dessin de l'image de la caméra physique.

Le code suivant peut arrêter le dessin de l'image de la caméra physique :

if (Session.Assembly != null && Session.Assembly.CameraImageRenderer.OnSome)
{
    Session.Assembly.CameraImageRenderer.Value.enabled = false;
}

Notez qu'il faut d'abord vérifier si ARAssembly.CameraImageRenderer existe.

Note

Ce n'est que dans les sessions où le rendu est effectué par EasyAR que vous pouvez arrêter les mises à jour de l'image avec la méthode ci-dessus. En général, cela n'est pas valide lors de l'utilisation d'AR Foundation ou d'un casque, et il faut utiliser les méthodes fournies par ces bibliothèques tierces pour implémenter les fonctionnalités correspondantes.

Après avoir arrêté le dessin de l'image de la caméra physique, l'application peut obtenir les données d'image de la caméra physique via InputFrame et utiliser ces données pour un dessin personnalisé.

Obtenir les mises à jour de transform

Vous pouvez obtenir les données de transform des objets dans la scène après chaque mise à jour de la session via l'événement PostSessionUpdate.

Note

Pour certaines fonctionnalités (comme Mega), même si l'image ne change pas et qu'aucune mise à jour de service n'est explicitement demandée, le calcul AR s'exécute à chaque frame de rendu. Par conséquent, si vous avez besoin d'obtenir toutes les modifications de transform, vous devez obtenir les données de transform à chaque frame, et non pas seulement à certaines frames.

Obtenir le transform de la caméra virtuelle

Vous pouvez obtenir le transform de la caméra dans la scène via ARAssembly.Camera.

Session.PostSessionUpdate += () =>
{
    var position = Session.Assembly.Camera.transform.position;
    var rotation = Session.Assembly.Camera.transform.rotation;
};

Obtenir le transform de la target

Vous pouvez obtenir le transform de la target dans la scène via l'objet target spécifique que vous utilisez. Par exemple, pour le suivi d'image, cette target est l'objet sur lequel se trouve le composant ImageTargetController.

Session.PostSessionUpdate += () =>
{
    var position = target.transform.position;
    var rotation = target.transform.rotation;
};

[Optionnel] Obtenir le pose

Le pose est une structure de données qui décrit la position et l'orientation d'un objet, généralement composée de la position et de la rotation. Dans les applications AR, le pose est généralement utilisé pour décrire la position et l'orientation de la caméra physique ou d'une cible de suivi par rapport à un système de référence.

Unity ne fournit pas les données brutes de pose, car le pose est généralement utilisé pour piloter le mouvement des objets dans la scène, ce que la session accomplit automatiquement. Pour le calcul de contenu et le rendu, le transform suffit généralement.

Important

Avant de lire les méthodes ci-dessous, veuillez reconsidérer si les données de transform des objets tels que la caméra et les cibles de suivi dans la scène répondent déjà à vos besoins. En général, des données de pose supplémentaires ne sont pas nécessaires.

Si vous avez vraiment besoin de données de pose pour une raison quelconque, vous pouvez calculer la valeur de pose requise à partir du transform dans l'événement PostSessionUpdate. En général, le transform relatif entre la target et la camera obtenu dans PostSessionUpdate est le pose.

Le code suivant montre comment obtenir le transform de la camera et de la target, et calculer le pose relatif entre elles :

Session.PostSessionUpdate += () =>
{
    Pose cameraToWorld = new(Session.Assembly.Camera.transform.position, Session.Assembly.Camera.transform.rotation);
    Pose targetToWorld = new(target.transform.position, target.transform.rotation);
    Pose worldToTarget = new()
    {
        position = Quaternion.Inverse(targetToWorld.rotation) * (-targetToWorld.position),
        rotation = Quaternion.Inverse(targetToWorld.rotation)
    };
    Pose cameraToTarget = cameraToWorld.GetTransformedBy(worldToTarget);
};
Attention

Si vous utilisez simultanément AR Foundation, un casque ou d'autres bibliothèques tierces qui s'exécutent également, celles-ci peuvent également modifier le transform de la caméra dans la scène. Vous devez vous assurer que la logique de mise à jour de ces bibliothèques est terminée avant d'effectuer les calculs de pose associés, sinon les résultats peuvent être incorrects. Dans un tel scénario, le pose relatif entre la target et l'origine dans PostSessionUpdate reste précis.

[Optionnel] Intercepter les mises à jour de transform

Lorsque la fonctionnalité AR s'exécute, le transform des objets tels que la caméra et les cibles de suivi dans Unity est généralement mis à jour automatiquement par la session. Ces processus de mise à jour garantissent l'exactitude et la cohérence du rendu AR, donc aucune méthode ne peut intercepter ces mises à jour.

Cependant, si vous avez besoin de personnaliser la logique de mise à jour du transform d'un objet, vous pouvez le faire en écoutant l'événement PostSessionUpdate. Cela nécessite une méthode assez fastidieuse :

  1. Bien qu'en général, le contenu de rendu doive être attaché en tant qu'enfant ou composant supplémentaire aux objets contrôlés par la session, si vous avez besoin de personnaliser la mise à jour du transform d'un objet, vous devez retirer cet objet de la hiérarchie des objets contrôlés par la session. Autrement dit, ces objets ne doivent pas être des enfants des objets contrôlés par la session.
  2. Dans l'événement PostSessionUpdate, enregistrez le transform de l'objet que vous souhaitez mettre à jour de manière personnalisée.
  3. Enfin, dans l'événement PostSessionUpdate, mettez à jour le transform de ces objets en utilisant votre logique personnalisée en fonction des données fournies par la session.
Note

L'utilisation de l'événement PostSessionUpdate est nécessaire car ce n'est qu'après ce moment que la session cessera de manipuler les objets de la scène.

Notez que cette méthode ne peut pas être utilisée pour modifier la caméra, car une logique plus complexe est nécessaire pour gérer la mise à jour personnalisée de la caméra.

De plus, cette méthode ne peut être utilisée que pour personnaliser la mise à jour du transform des objets, et non pour modifier le transform des objets contrôlés par la session. Si le transform des objets contrôlés par la session est modifié de l'extérieur, la session écrasera ces modifications lors de la prochaine mise à jour de frame, ce qui peut affecter la précision de certains calculs.

Attention

L'utilisation de cette méthode nécessite que vous garantissiez l'exactitude du transform de l'objet, sinon cela peut entraîner des erreurs de rendu AR.

Si vous utilisez simultanément AR Foundation, un casque ou d'autres bibliothèques tierces, celles-ci peuvent également modifier le transform des objets dans la scène. Vous devez vous assurer que leur logique de mise à jour n'entre pas en conflit avec votre logique personnalisée, sinon des résultats imprévisibles peuvent survenir.

Sujets connexes