Informazioni su SessionOrigin

SessionOrigin è un'implementazione relativamente nuova, introdotta in AR Foundation, ma l'idea è apparsa nelle macchine fotografiche che risalgono a decenni di motori di rendering. Si potrebbe avere familiarità con esso come nodo Playspace MRTK. È piuttosto potente, ma purtroppo mal spiegato e di conseguenza mal compreso.

Che cos'è SessionOrigin?

SessionOrigin è solo un oggetto Transform a cui è collegata la fotocamera. In modo più semplice, consente il posizionamento della fotocamera nella scena virtuale. Più subtly, definisce uno spazio di coordinate speciale.

Come avviene normalmente con la relazione padre-figlio di trasformazione in Unity (e tutti i motori di rendering moderni), lo "spostamento" dell'elemento padre "sposterà" l'elemento figlio. Ciò che significa il termine "move" in questo contesto è che una modifica nella posizione globale dell'elemento padre modificherà le coordinate globali dell'elemento figlio e quando le coordinate globali di un oggetto cambiano, tale oggetto apparirà spostato rispetto agli oggetti le cui coordinate globali non sono state modificate.

La fotocamera è piuttosto speciale in questo senso, perché non viene eseguito il rendering. Determina il punto di vista del renderer. Un esempio concreto potrebbe chiarire questo.

Esempio più semplice di SessionOrigin

Immagina una scena molto semplice, in cui la fotocamera si trova all'avvio (come è normale nelle applicazioni AR) e c'è una singola sfera rossa posizionata sull'asse Z 10 metri davanti alla fotocamera (position=(0,0,10)).

Scena virtuale più semplice

Per qualsiasi motivo, si supponga di voler che l'utente inizi 1 metro di distanza dalla sfera.

Sono disponibili due opzioni interessanti:

  1. Spostare la fotocamera in una nuova posizione (0,0,9).
  2. Spostare la sfera in una nuova posizione (0,0,1).

Due opzioni

È abbastanza ovvio che le due opzioni sono in definitiva equivalenti senza altri contesti. In entrambi i casi, all'avvio della sfera è 1 metro davanti alla fotocamera. L'unica differenza è costituita dalle coordinate globali assolute dei due oggetti. Le coordinate relative, ovvero il vettore tra i due, sono le stesse in entrambi i casi.

Se vogliamo usare l'opzione 1., come procederemo? Se impostiamo le coordinate della fotocamera, verranno sovrascritte dal sistema di rilevamento. Al contrario, allegare la fotocamera a un oggetto padre, quindi spostare l'elemento padre. Il tracker imposta la posizione locale della fotocamera, che lo sposta rispetto all'elemento padre. L'elemento padre è ora SessionOrigin.

Perché spostare la fotocamera invece della sfera?

In questo caso semplice, le due opzioni sono chiaramente intercambiabili. Ma ricorda che "la sfera" rappresenta davvero "tutto nella scena, ma la fotocamera". Man mano che cresce la complessità della scena, lo spostamento di tutto diventa più complicato. Lo spostamento della fotocamera, tramite SessionOrigin, è sempre la stessa operazione.

Inoltre, esistono tipi di oggetti difficili o impossibili da riposizionare, ad esempio sistemi di particella o mesh di navigazione. Ma anche se nessuno di questi elementi è coinvolto, vi sono evidenti vantaggi per modificare le coordinate di un singolo oggetto nella scena, SessionOrigin, anziché modificare le coordinate globali di tutto il resto.

SessionOrigin non deve spostare tutti gli elementi

Si consideri di nuovo l'esempio più semplice. Ma si tratta di un'applicazione AR, quindi insieme alla sfera rossa sottoposta a rendering, l'utente visualizzerà anche l'ambiente fisico. Nell'interesse della semplicità, il nostro ambiente fisico sarà limitato alla singola sedia verde come mostrato.

Oggetti virtuali e fisici

Ora, quando spostiamo la fotocamera tramite SessionOrigin, l'abbiamo spostata rispetto alla sfera rossa, ma ovviamente non abbiamo preso l'utente e li abbiamo spostati rispetto alla sedia verde. La sfera appare ora più vicina, ma la sedia si trova nella stessa posizione.

Oggetti fisici fissi relativi all'utente fisico

E se c'è un ancoraggio sul sedile della sedia? L'ancoraggio deve spostarsi con la sfera rossa o rimanere fisso rispetto al sedile della sedia? L'intero punto dell'ancoraggio deve rimanere fisso rispetto al mondo fisico, quindi chiaramente dovrebbe rimanere con la sedia.

Un altro esempio è la mesh spaziale. Questa è la mesh generata per fornire una versione virtuale dell'ambiente fisico per il contesto, il ray cast e così via. Vogliamo sicuramente che la mesh spaziale rimanga fissa al mondo fisico.

Altri esempi variano da mesh a mano a vettori di sguardo fisso. Tutti condividono il tratto comune che se le coordinate della fotocamera vengono regolate (trasformate), le coordinate di tali oggetti dovrebbero ricevere la stessa regolazione.

Quindi concettualmente, tutti gli oggetti che si spostano in coordinamento con la fotocamera, sono collegati anche a SessionOrigin. Quando SessionOrigin viene spostato rispetto a oggetti globali come la sfera rossa, tutti gli oggetti vengono portati insieme.

È importante sottolineare che questo è indipendente dal movimento della fotocamera a causa del tracciamento della testa. Il tracker sposta la fotocamera rispetto a SessionOrigin.

Una spiegazione leggermente più matematica

Il sistema di coordinate globale di Unity si trova in modo arbitrario per impostazione predefinita in un'applicazione AR. Oltre a allineare il vettore di gravità (asse Y) con "su", la posizione e l'orientamento sono interamente determinati da dove il tracker posiziona la fotocamera all'avvio.

Anche se ciò può essere utile per molte applicazioni, una vasta gamma di possibilità è aperta, essendo in grado di rimuovere tale arbitrarità dello spazio di coordinate globale.

Esaminando l'esempio precedente, si supponga che sia significativo per l'applicazione che la sfera rossa virtuale sia posizionata rispetto alla sedia fisica come illustrato. A tale scopo, è possibile regolare SessionOrigin.

Layout desiderato

Se vogliamo che la sfera a (0,0,10) sia di 1 metro lungo l'asse X dalla sedia, vogliamo che la sedia sia a (-1,0,10). Se determiniamo che la fotocamera sia di 2 metri indietro dalla sedia direttamente lungo l'asse Z negativo quando la fotocamera si trova all'origine, la sedia è attualmente a (0,0,2). Tenere presente che gli oggetti fisici non hanno coordinate innate, ma solo coordinate implicite in prossimità della fotocamera e degli oggetti virtuali.

Layout iniziale

Tuttavia, se impostiamo la trasformazione SessionOrigin su (-1,0,8), la posizione della fotocamera è (-1,0,8). La sedia, 2 metri direttamente davanti, si trova a (-1,0,10). E la sfera rossa, a (0,0,10), apparirà 1 metro a destra della sedia come desiderato.

Layout regolato

Abbiamo quindi usato in modo efficace la trasformazione SessionOrigin per riposizionare lo spazio globale di Unity in modo che la sfera rossa e tutti gli altri oggetti globali compaiano nella posizione corretta rispetto al mondo fisico.

Questo meccanismo semplice ma potente per allineare lo spazio di coordinate globale di Unity al mondo fisico può essere sfruttato per supportare layout complesso, persistenza di spazi di coordinate, spazi di coordinate condivisi tra dispositivi e altro ancora.

Vedi anche