Entendendo o SessionOrigin
O SessionOrigin é uma implementação relativamente nova, introduzida na AR Foundation, mas a ideia apareceu em equipamentos de câmera que remontam a décadas de mecanismos de renderização. Você pode estar familiarizado com ele como o nó MRTK Playspace. É bastante poderoso, mas infelizmente mal explicado e, consequentemente, mal compreendido.
O que é o SessionOrigin?
O SessionOrigin é apenas um objeto Transform ao qual a câmera está conectada. Mais claramente, permite a colocação da câmera na cena virtual. Mais sutilmente, define um espaço de coordenadas especial.
Como é habitual com a relação entre pais e filhos transformada em Unity (e todos os motores de renderização modernos), "mover" o pai irá "mover" a criança. O que significa o termo "mover" neste contexto é que uma mudança na pose global do pai mudará as coordenadas globais do filho e, quando as coordenadas globais de um objeto mudarem, esse objeto parecerá ter se movido em relação a objetos cujas coordenadas globais não foram alteradas.
A câmera é bastante especial neste sentido, pois não é renderizada. Ele determina o ponto de vista do renderizador. Um exemplo concreto poderia esclarecer esta questão.
Exemplo mais simples de SessionOrigin
Imagine uma cena muito simples, em que a câmera está na origem na inicialização (como é normal em aplicações de RA), e há uma única esfera vermelha colocada no eixo Z 10 metros à frente da câmera (posição = (0,0,10)).
Por qualquer motivo, imagine que queremos que o usuário comece a 1 metro de distância da esfera.
Temos duas opções interessantes:
- Mova a câmara para uma nova posição (0,0,9).
- Mover a esfera para uma nova posição (0,0,1).
É bastante óbvio que as duas opções são, em última análise, equivalentes sem qualquer outro contexto. Em ambos os casos, na inicialização a esfera é de 1 metro na frente da câmera. A única diferença são as coordenadas globais absolutas dos dois objetos. Suas coordenadas relativas, que é o vetor entre os dois, é a mesma em ambos os casos.
Se quisermos utilizar a opção 1., como o faríamos? Se definirmos as coordenadas da câmera, elas serão substituídas pelo sistema de rastreamento. Em vez disso, anexamos a câmera a um objeto pai e, em seguida, movemos o pai. O rastreador define a pose local da câmera, que a move em relação ao pai. O pai agora é o SessionOrigin.
Por que mover a câmera em vez da esfera?
Neste caso simples, as duas opções são claramente intercambiáveis. Mas lembre-se que "a esfera" realmente representa "tudo na cena, menos a câmera". À medida que a complexidade da cena cresce, mover tudo se torna mais complicado. Mover a câmera, através do SessionOrigin, é sempre a mesma operação.
Além disso, existem tipos de objetos difíceis ou impossíveis de reposicionar, como sistemas de partículas ou malhas de navegação. Mas mesmo que nenhum deles esteja envolvido, há vantagens claras em alterar as coordenadas de um único objeto na cena, o SessionOrigin, em comparação com a alteração das coordenadas globais de todo o resto.
O SessionOrigin não deve mover tudo
Considere novamente o nosso exemplo mais simples. Mas este é um aplicativo de RA, portanto, juntamente com a esfera vermelha renderizada, o usuário também verá o ambiente físico. No interesse da simplicidade, o nosso ambiente físico será limitado à única cadeira verde, como mostrado.
Agora, quando movemos a câmera através do SessionOrigin, nós a movemos em relação à esfera vermelha, mas obviamente não pegamos o usuário e os movemos em relação à cadeira verde. A esfera agora parece mais próxima, mas a cadeira está exatamente na mesma posição.
E se houver uma âncora no assento da cadeira? A âncora deve mover-se com a esfera vermelha ou permanecer fixa em relação ao assento da cadeira? O objetivo da âncora é permanecer fixa em relação ao mundo físico, então claramente ela deve ficar com a cadeira.
Outro exemplo é a malha espacial. Essa é a malha gerada para fornecer uma versão virtual do ambiente físico para contexto, ray-casting, etc. Definitivamente, queremos que a malha espacial permaneça fixa ao mundo físico.
Outros exemplos vão desde malhas manuais a vetores de olhar. Todos compartilham o traço comum de que, se as coordenadas da câmera são ajustadas (transformadas), então as coordenadas desses objetos devem receber o mesmo ajuste.
Então, conceitualmente, todos esses objetos que se movem em coordenação com a câmera, também estão anexados ao SessionOrigin. Quando o SessionOrigin é movido em relação a objetos globais como a esfera vermelha, todos esses objetos são trazidos junto com ele.
É importante salientar que isso é independente do movimento da câmera devido ao rastreamento da cabeça. O rastreador move a câmera em relação ao SessionOrigin.
Uma explicação um pouco mais matemática
O sistema de coordenadas globais do Unity é localizado de forma um tanto arbitrária por padrão em um aplicativo de RA. Além de alinhar o vetor de gravidade (eixo Y) com "para cima", a posição e a orientação são inteiramente determinadas por onde o rastreador coloca a câmera na inicialização.
Embora isso possa ser bom para muitas aplicações, uma ampla gama de possibilidades é aberta pela capacidade de remover essa arbitrariedade do espaço de coordenadas globais.
Olhando para o exemplo anterior, imagine que é significativo para a aplicação que a esfera vermelha virtual seja posicionada em relação à cadeira física, como mostrado. Podemos conseguir isso ajustando o SessionOrigin.
Se quisermos que a esfera em (0,0,10) esteja a 1 metro ao longo do eixo X da cadeira, então queremos que a cadeira esteja em (-1,0,10). Se determinarmos que a câmera está a 2 metros de volta da cadeira diretamente ao longo do eixo Z negativo quando a câmera está na origem, então a cadeira está atualmente em (0,0,2). (Lembre-se, os objetos físicos não têm coordenadas inatas, apenas coordenadas implícitas pela proximidade com a câmera e objetos virtuais).
No entanto, se definirmos a transformação SessionOrigin como (-1,0,8), agora a posição da câmera é (-1,0,8). A cadeira, 2 metros diretamente à frente, está em (-1,0,10). E a esfera vermelha, em (0,0,10), aparecerá a 1 metro à direita da cadeira, conforme desejado.
Assim, usamos efetivamente a transformação SessionOrigin para reposicionar o espaço global de Unity para que a esfera vermelha, e todos os outros objetos globais, apareçam na posição correta em relação ao mundo físico.
Esse mecanismo simples, mas poderoso, para alinhar o espaço de coordenadas globais de Unity ao mundo físico pode ser aproveitado para suportar layout complexo, persistência de espaços de coordenadas, espaços de coordenadas compartilhados entre dispositivos e muito mais.