Compartir a través de


Descripción de SessionOrigin

SessionOrigin es una implementación relativamente nueva, presentada en AR Foundation, pero la idea ha aparecido en plataformas de cámaras que se remontan a décadas de motores de representación. Es posible que esté familiarizado con ella como nodo Playspace de MRTK. Es bastante eficaz, pero desafortunadamente no está bien explicado y, en consecuencia, no se comprende claramente.

¿Qué es SessionOrigin?

SessionOrigin es simplemente un objeto de transformación al que está conectada la cámara. Dicho más claramente, permite colocar la cámara en la escena virtual. Más sutilmente, define un espacio de coordenadas especial.

Como es habitual con la relación de tipo primario-secundario de transformación en Unity (y todos los motores de representación modernos), al "mover" el elemento primario se "moverá" el secundario. Lo que significa el término "mover" en este contexto es que un cambio en la posición global del elemento primario cambiará las coordenadas globales del elemento secundario y, cuando cambien las coordenadas globales de un objeto, parecerá que ese objeto se ha movido en relación con los objetos cuyas coordenadas globales no han cambiado.

La cámara es bastante especial en este sentido, ya que no se representa. Determina el punto de vista del representador. Un ejemplo concreto podría aclarar esto.

Ejemplo más sencillo de SessionOrigin

Imagine una escena muy sencilla, en la que la cámara se encuentra en el origen al inicio (como es normal en las aplicaciones de AR), y hay una sola esfera roja colocada en el eje Z a 10 metros delante de la cámara (posición=(0,0,10)).

Escena virtual más sencilla

Por la razón que sea, imagine que queremos que el usuario empiece a 1 metro de distancia de la esfera en su lugar.

Tenemos dos opciones interesantes:

  1. Mover la cámara a una nueva posición (0,0,9).
  2. Mover la esfera a una nueva posición (0,0,1).

Dos opciones

Es bastante obvio que las dos opciones son equivalentes en última instancia sin ningún otro contexto. En ambos casos, al inicio, la esfera se encuentra a 1 metro delante de la cámara. La única diferencia son las coordenadas globales absolutas de los dos objetos. Sus coordenadas relativas, es decir, el vector entre los dos, son las mismas en cualquier caso.

Si queremos usar la opción 1, ¿cómo lo haríamos? Si establecemos las coordenadas de la cámara, el sistema de seguimiento las sobrescribirá. En su lugar, conectamos la cámara a un objeto primario y, a continuación, movemos el elemento primario. El seguimiento establece la posición local de la cámara, que la mueve en relación con el elemento primario. El elemento primario es ahora SessionOrigin.

¿Por qué mover la cámara en lugar de la esfera?

En este caso sencillo, las dos opciones son claramente intercambiables. Pero recuerde que "la esfera" representa realmente "todo lo que hay en la escena, menos la cámara". A medida que aumenta la complejidad de la escena, mover todo se vuelve más complicado. Mover la cámara, a través de SessionOrigin, siempre es exactamente la misma operación.

Además, hay tipos de objetos cuya posición es difícil o imposible de cambiar, como sistemas de partículas o mallas de navegación. Pero incluso si ninguno de ellos está implicado, hay ventajas claras para cambiar las coordenadas de un solo objeto de la escena, SessionOrigin, en lugar de cambiar las coordenadas globales de todo lo demás.

SessionOrigin no debe mover todo

Considere de nuevo nuestro ejemplo más sencillo. Pero se trata de una aplicación de AR, por lo que junto con la esfera roja que se representa, el usuario también verá el entorno físico. En aras de la simplicidad, nuestro entorno físico se limitará a la única silla verde, como se muestra.

Objetos físicos y virtuales

Ahora, cuando movemos la cámara a través de SessionOrigin, la hemos movido en relación con la esfera roja, pero obviamente no hemos seleccionado al usuario ni los hemos movido en relación con la silla verde. La esfera ahora aparece más cerca, pero la silla está exactamente en la misma posición.

Objetos físicos fijos en relación con el usuario físico

¿Qué ocurre si hay un anclaje en el asiento de la silla? ¿Se debe mover el anclaje con la esfera roja o debe permanecer fijo en relación con el asiento de la silla? El objetivo del anclaje es permanecer fijo en relación con el mundo físico, por lo que claramente debe permanecer con la silla.

Otro ejemplo es la malla espacial. Esa es la malla generada para proporcionar una versión virtual del entorno físico para el contexto, las proyecciones de rayo, etc. Definitivamente queremos que la malla espacial permanezca fija en el mundo físico.

Otros ejemplos van desde mallas de mano hasta vectores de la mirada con los ojos. Todos comparten un rasgo: si se ajustan (transforman) las coordenadas de la cámara, las coordenadas de esos objetos deben recibir el mismo ajuste.

Por lo tanto, conceptualmente, todos esos objetos que se mueven en coordinación con la cámara, también se conectan a SessionOrigin. Cuando SessionOrigin se mueve en relación con objetos globales como la esfera roja, todos esos objetos se llevan junto con él.

Es importante destacar que esto es independiente del movimiento de la cámara debido al seguimiento de la cabeza. El seguimiento mueve la cámara en relación con SessionOrigin.

Una explicación ligeramente más matemática

El sistema de coordenadas global de Unity se ubica de forma algo arbitraria de forma predeterminada en una aplicación de AR. Además de alinear el vector de gravedad (eje Y) con "arriba", la posición y orientación están totalmente determinadas por dónde coloca el seguimiento la cámara al inicio.

Aunque esto puede ser bueno para muchas aplicaciones, se abre una amplia gama de posibilidades al poder quitar esa arbitrariedad del espacio de coordenadas global.

Al repasar el ejemplo anterior, imagine que es significativo para la aplicación que la esfera roja virtual se coloque en relación con la silla física, como se muestra. Podemos hacerlo ajustando SessionOrigin.

Diseño deseado

Si queremos que la esfera en (0,0,10) sea de 1 metro a lo largo del eje X de la silla, queremos que la silla esté en (-1,0,10). Si determinamos que la cámara está a 2 metros de la silla directamente a lo largo del eje Z negativo cuando la cámara está en el origen, la silla está actualmente en (0,0,2) (recuerde que los objetos físicos no tienen coordenadas innatas, solo coordenadas implícitas por proximidad a la cámara y los objetos virtuales).

Diseño inicial

Sin embargo, si establecemos la transformación SessionOrigin en (-1,0,8), ahora la posición de la cámara es (-1,0,8). La silla, a 2 metros frente a nosotros, está en (-1,0,10). Y la esfera roja, en (0,0,10), aparecerá a 1 metro a la derecha de la silla según sus preferencias.

Diseño ajustado

Por lo tanto, hemos usado eficazmente la transformación SessionOrigin para cambiar la posición del espacio global de Unity para que la esfera roja y todos los demás objetos globales aparezcan en la posición correcta en relación con el mundo físico.

Este mecanismo sencillo pero eficaz para alinear el espacio de coordenadas global de Unity con el mundo físico se puede aprovechar para admitir una distribución compleja, la persistencia de espacios de coordenadas, espacios de coordenadas compartidos entre dispositivos, etc.

Consulte también