Informazioni su SessionOrigin

SessionOrigin è un'implementazione relativamente nuova, introdotta in AR Foundation, ma l'idea è apparsa nelle macchine fotografiche che tornano indietro decenni di motori di rendering. Si potrebbe avere familiarità con esso come nodo MRTK Playspace. È abbastanza potente, ma purtroppo poco spiegato e di conseguenza poco 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. In modo più secondario, definisce uno spazio di coordinate speciale.

Come avviene di solito con la relazione padre-figlio trasforma in Unity (e tutti i motori di rendering moderni), il padre "sposta" il figlio. Ciò che significa il termine "move" in questo contesto è che una modifica nella posizione globale dell'elemento padre cambierà le coordinate globali del figlio e quando le coordinate globali di una modifica di un oggetto verranno spostate rispetto agli oggetti le cui coordinate globali non sono state modificate.

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

Esempio più semplice di SessionOrigin

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

Scena virtuale più semplice

Per qualsiasi motivo, immaginare che l'utente inizi a 1 metro di distanza dalla sfera.

Abbiamo due opzioni interessanti:

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

Due opzioni

È abbastanza evidente che le due opzioni sono in definitiva equivalenti senza alcun altro contesto. In entrambi i casi, all'avvio della sfera è 1 metro davanti alla fotocamera. L'unica differenza è la coordinata globale assoluta dei due oggetti. Le coordinate relative, ovvero il vettore tra i due, sono uguali in entrambi i casi.

Se si vuole usare l'opzione 1., come si farebbe? Se si impostano le coordinate della fotocamera, verranno sovrascritte dal sistema di rilevamento. Invece, si collega la fotocamera a un oggetto padre, quindi si sposta 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 semplice caso, le due opzioni sono chiaramente intercambiabili. Ma ricorda che "la sfera" rappresenta davvero "tutto nella scena, ma la fotocamera". Man mano che la complessità della scena cresce, 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 è coinvolto, ci sono vantaggi chiari per modificare le coordinate di un singolo oggetto nella scena, sessionOrigin, rispetto alla modifica delle coordinate globali di tutto il resto.

SessionOrigin non deve spostare tutto

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

Oggetti virtuali e fisici

Ora, quando si sposta 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 ora appare più vicina, ma la sedia si trova nella stessa posizione.

Oggetti fisici fissi relativi all'utente fisico

Cosa succede se c'è un ancoraggio sul sedile della sedia? L'ancoraggio dovrebbe spostarsi con la sfera rossa o rimanere fisso rispetto al sedile della sedia? L'intero punto dell'ancoraggio è quello di 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 contesto, ray cast e così via. Vogliamo sicuramente che la mesh spaziale rimanga fissa al mondo fisico.

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

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

È importante sottolineare che questo è indipendente dal movimento della fotocamera a causa del rilevamento della testa. Il localizzatore sposta la fotocamera rispetto alla SessioneOrigin.

Una spiegazione leggermente più matematica

Il sistema di coordinate globali di Unity si trova arbitrariamente per impostazione predefinita in un'applicazione AR. Oltre a allineare il vettore di gravità (asse Y) con "su", la posizione e l'orientamento sono completamente determinati dal punto in cui il localizzatore posiziona la fotocamera all'avvio.

Anche se ciò può essere utile per molte applicazioni, un'ampia gamma di possibilità viene aperta, essendo in grado di rimuovere tale arbitrarietà dello spazio di coordinate globali.

Esaminando l'esempio precedente, si supponga che sia significativo per l'applicazione che la sfera rossa virtuale venga posizionata rispetto alla sedia fisica, come illustrato. È possibile eseguire questa operazione modificando 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 si determina la fotocamera da 2 metri indietro dalla sedia direttamente lungo l'asse Z negativo quando la fotocamera è all'origine, la sedia è attualmente a (0,0,2). Tenere presente che gli oggetti fisici non hanno coordinate innate, solo coordinate implicite dalla vicinanza alla fotocamera e agli oggetti virtuali.

Layout iniziale

Tuttavia, se si imposta la trasformazione SessionOrigin su (-1.0.8), ora la posizione della fotocamera è (-1.0,8). La sedia, 2 metri direttamente avanti, è a (-1.0.10). E la sfera rossa, a (0,0,10), apparirà a destra 1 metro della sedia come desiderato.

Layout modificato

Quindi abbiamo 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, vengano visualizzati nella posizione corretta rispetto al mondo fisico.

Questo meccanismo semplice ma potente per allineare lo spazio di coordinate globali 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