Partager via


Comprendre SessionOrigin

SessionOrigin est une implémentation relativement nouvelle, introduite dans AR Foundation, mais l’idée est apparue dans les caméras depuis des décennies dans les moteurs de rendu. Vous connaissez peut-être le nœud MRTK PlaySpace. Il est très puissant, mais malheureusement mal expliqué et donc mal compris.

Qu’est-ce que SessionOrigin ?

SessionOrigin est simplement un objet Transform auquel la caméra est attachée. En clair, il permet le placement de la caméra dans la scène virtuelle. Plus subtilement, il définit un espace de coordonnées spécial.

Comme c’est généralement le cas avec la relation parent-enfant de transformation dans Unity (et tous les moteurs de rendu modernes), le « déplacement » du parent « déplace » l’enfant. Le terme « déplacement », dans ce contexte, signifie qu’une modification de la composition globale du parent modifie les coordonnées globales de l’enfant et, lorsque les coordonnées globales d’un objet changent, cet objet semble avoir été déplacé par rapport aux objets dont les coordonnées globales n’ont pas changé.

La caméra est plutôt spéciale dans ce sens, car elle n’est pas rendue. Elle détermine le point de vue du renderer. Un exemple concret pourrait clarifier cela.

Exemple le plus simple de SessionOrigin

Imaginez une scène très simple dans laquelle la caméra est à l’origine au départ (comme c’est normalement le cas dans les applications de réalité augmentée), et une seule sphère rouge est placée sur l’axe Z 10 mètres devant l’appareil (position = (0,0,10)).

Scène virtuelle la plus simple

Pour une raison quelconque, imaginez que nous voulons que l’utilisateur démarre à 1 mètre de la sphère à la place.

Nous avons deux options intéressantes :

  1. Déplacer la caméra vers la nouvelle position (0,0,9).
  2. Déplacer la sphère vers la nouvelle position (0,0,1).

Deux options

Il est assez évident que les deux options sont finalement équivalentes sans autre contexte. Dans les deux cas, au départ, la sphère est 1 mètre devant la caméra. La seule différence réside dans les coordonnées globales absolues des deux objets. Leurs coordonnées relatives, autrement dit le vecteur entre les deux, sont les mêmes dans les deux cas.

Si vous souhaitez utiliser l’option 1, que pouvons-nous faire ? Si nous définissons les coordonnées de la caméra, elles seront remplacées par le système de suivi. Au lieu de cela, nous attachons la caméra à un objet parent, puis nous déplaçons le parent. Le dispositif de suivi définit la composition locale de la caméra, qui la déplace par rapport au parent. Le parent est maintenant SessionOrigin.

Pourquoi déplacer la caméra au lieu de la sphère ?

Dans ce cas simple, les deux options sont clairement interchangeables. Mais souvenez-vous que « la sphère » représente vraiment « tout ce qui se trouve dans la scène, sauf la caméra ». À mesure que la complexité de la scène augmente, le déplacement de tout devient plus complexe. Le déplacement de la caméra, via SessionOrigin, est toujours exactement la même opération.

En outre, il existe des types d’objets qui sont difficiles ou impossibles à repositionner, comme les systèmes de particules ou les mailles de navigation. Toutefois, même si aucun de ces éléments n’est impliqué, il existe des avantages évidents à modifier les coordonnées d’un objet unique dans la scène, SessionOrigin, et à modifier les coordonnées globales de tout le reste.

SessionOrigin ne doit pas tout déplacer

Reprenons l’exemple le plus simple. Mais il s’agit d’une application de réalité augmentée, ainsi, en plus du rendu de la sphère rouge, l’utilisateur verra également l’environnement physique. Dans un souci de simplicité, notre environnement physique sera limité à la seule chaise verte, comme indiqué.

Objets virtuels et physiques

Maintenant, lorsque nous déplaçons la caméra via SessionOrigin, nous la déplaçons par rapport à la sphère rouge, mais nous n’avons évidemment pas pris l’utilisateur et déplacé par rapport à la chaise verte. La sphère apparaît maintenant plus près, mais la chaise se trouve à la même position.

Objets physiques corrigés par rapport à l’utilisateur physique

Que se passe-t-il s’il y a une ancre sur le siège de la chaise ? Le point d’ancre doit-il se déplacer avec la sphère rouge ou rester fixe par rapport au siège de la chaise ? Le but de l’ancre est de rester fixe par rapport au monde physique, il est donc évident qu’elle doit rester avec la chaise.

Un autre exemple est le maillage spatial. Il s’agit de la maille générée pour fournir une version virtuelle de l’environnement physique pour le contexte, la diffusion de rayons, etc. Nous voulons absolument que le maillage spatial reste fixe dans le monde physique.

D’autres exemples s’étendent des maillages de la main aux vecteurs de pointage du regard. Tous partagent la caractéristique commune que les coordonnées de la caméra sont ajustées (transformées), puis que les coordonnées de ces objets reçoivent le même ajustement.

Ainsi, tous les objets qui se déplacent en coordination avec la caméra sont également attachés à SessionOrigin. Lorsque SessionOrigin se déplace par rapport à des objets globaux, comme la sphère rouge, tous ces objets sont déplacés avec.

Il est important de souligner que cela est indépendant du déplacement causé par le suivi de la tête. Le dispositif de suivi déplace la caméra par rapport à SessionOrigin.

Explication légèrement plus mathématique

Le système de coordonnées globales d’Unity est arbitrairement situé par défaut dans une application de réalité augmentée. Mis à part l’alignement du vecteur de gravité (axe Y) sur le « haut », la position et l’orientation sont entièrement déterminées par l’endroit où le dispositif de suivi place la caméra au départ.

Bien que cela puisse s’avérer parfait pour de nombreuses applications, il est possible d’ouvrir un large éventail de possibilités en éliminant le côté arbitraire de l’espace de coordonnées global.

Dans l’exemple précédent, imaginez qu’il est important pour l’application de positionner la sphère rouge virtuelle par rapport à la chaise physique, comme indiqué. Nous pouvons le faire en ajustant SessionOrigin.

Disposition souhaitée

Si nous voulons que la sphère sur (0,0,10) soit 1 mètre le long de l’axe X de la chaise, nous voulons que la chaise soit à (-1,0,10). Si nous déterminons que la caméra se trouve à 2 mètres derrière la chaise directement le long de l’axe Z négatif lorsque la caméra est à l’origine, alors la chaise est actuellement à (0,0,2). (N’oubliez pas que les objets physiques n’ont pas de coordonnées innées, seulement des coordonnées impliquées par la proximité de la caméra et des objets virtuels).

Disposition initiale

Toutefois, si nous définissons la transformation de SessionOrigin sur (-1,0,8), la position de la caméra est alors (-1,0,8). La chaise, 2 mètres directement devant, est à (-1,0,10). Et la sphère rouge, à (0,0,10), s’affiche à 1 mètre à droite de la chaise comme vous le souhaitez.

Disposition ajustée

Nous avons donc utilisé la transformation SessionOrigin pour repositionner l’espace global de l’unité afin que la sphère rouge et tous les autres objets globaux apparaissent à la position correcte par rapport au monde physique.

Ce mécanisme simple mais puissant pour l’alignement de l’espace de coordonnées global d’Unity sur le monde physique peut être utilisé pour prendre en charge la disposition complexe, la persistance des espaces de coordonnées, les espaces de coordonnées partagés entre les appareils, et plus encore.

Voir aussi