Punti di allegato
In primo luogo, World Locking Tools fornisce un sistema di coordinate stabile bloccato dal mondo: lo spazio bloccato al mondo. Questo spazio rimane il più fisso possibile rispetto al mondo fisico. E gli oggetti all'interno dello spazio bloccato mondo godono di funzionalità che richiedono un frame di riferimento così stabile, ad esempio mantenere il posizionamento relativo ad altri oggetti virtuali, simulazione di leggi fisiche naturali, kinematici e altre tecniche di animazione.
In effetti, a seconda delle esigenze dell'applicazione, lo spazio bloccato a livello globale può essere sufficiente per alcuni o per tutto il contenuto della scena.
Tuttavia, mentre lo spazio bloccato nel mondo rimarrà allineato in modo ottimale con lo spazio fisico, ci sono situazioni da descrivere più avanti in cui non è possibile che più punti nello spazio bloccato nel mondo rimangano fissi nel loro spazio di coordinate comune e fissi rispetto ai punti di riferimento nel mondo fisico.
Per un esempio semplice ma illuminante, si supponga che il sensore mappa un ancoraggio alla posizione (3,0,0) e un altro alla posizione (-3,0,0). Successivamente, man mano che vengono elaborati i perfezionamenti dei sensori, viene stabilito che le due coordinate dovrebbero essere (3.0.0) e (-2.0,0). Non c'è chiaramente alcuna rotazione e offset che può essere applicato alla fotocamera che trasformerà una distanza di sei metri tra i due ancoraggi in un offset di cinque metri.
Usando il sistema di ancoraggio spaziale di Unity, i due ancoraggi si spostano automaticamente nelle posizioni appena analizzate.
Ma world locking tools garantisce che nel mondo bloccato spazio, gli oggetti non mobili "per lo più" non si spostano mai. E infatti, qualsiasi movimento spetta all'applicazione proprietaria.
Un'altra condizione comune "anomala" è la perdita di rilevamento. Quando il rilevamento viene perso in un ambiente (ad esempio, stanza) e recuperato in un altro ambiente, in un primo momento non sono presenti informazioni che collegano i due spazi. Le coordinate in uno spazio sono senza significato rispetto alle coordinate nell'altro spazio. Il paradigma del punto di allegato consente all'applicazione di gestire normalmente la fase iniziale quando le informazioni spaziali sullo spazio precedente sono sconosciute (ad esempio, nascondendo gli oggetti in tale spazio precedente), nonché recuperando quando la relazione spaziale tra i due spazi diventa nota.
Altre discussioni sono disponibili in queste condizioni speciali e le operazioni di adattamento eseguite da WLT per gestirle. La discussione è incentrata sul contratto tra WLT e l'applicazione sulla risoluzione uniforme di tali condizioni.
I punti di allegato sono la codifica del contratto tra Gli strumenti di blocco globale e l'applicazione. Un'applicazione crea e posiziona i punti allegati usando le API degli strumenti di blocco globale. Quando una correzione nella posizione di un punto di allegato è determinata da un'operazione di adattamento, l'applicazione riceve una notifica tramite callback della nuova posizione nello spazio bloccato globale che manterrà il punto di allegato nella posizione precedente nello spazio fisico.
Alcuni scenari in cui i punti di collegamento degli strumenti di blocco globale potrebbero essere la soluzione:
- È più importante rimanere fissi rispetto alle funzionalità del mondo fisico rispetto ad altri oggetti virtuali.
- Gli oggetti vengono inseriti nel mondo in fase di esecuzione anziché in Unity in fase di progettazione e può essere importante riconciliare le posizioni relative separate dalle interruzioni nel rilevamento (vedere la discussione dei frammenti).
- È importante gestire la visibilità di un oggetto in base alla validità del posizionamento dello spazio fisico.
Uso dei punti di allegato
L'uso dei punti di allegato è piuttosto semplice.
Responsabilità del cliente
Per ogni punto di allegato necessario, il client deve:
- Richiedere punti di allegato dal sistema. Vedere CreateAttachmentPoint
- Eliminare i punti di allegato che non sono più necessari. Vedere ReleaseAttachmentPoint
- Apprise il sistema della posizione iniziale e del movimento del punto di collegamento. Vedere CreateAttachmentPoint, MoveAttachmentPoint e TeleportAttachmentPoint
- Gestire gli eventi dell'operazione di refit. Vedere di seguito.
Responsabilità degli strumenti di blocco globale
Gli strumenti di blocco globale comunicheranno all'applicazione, per ogni punto di allegato interessato, quando si verifica una delle condizioni seguenti:
- Validità delle modifiche al rilevamento del mondo fisico del punto di allegato.
- Le coordinate dello spazio bloccato nel mondo cambiano a causa di un'operazione di rifitting, che può essere un'unione di frammenti o un rigelo.
Queste notifiche vengono trasmesse tramite delegati che l'applicazione passa a WorldLockingManager alla creazione del punto di allegato.
Come gestire al meglio queste notifiche viene lasciata all'applicazione, in quanto ognuna avrà le proprie considerazioni. Vengono forniti gestori di esempio, usati internamente e che possono essere usati così come sono o usati come punto di partenza per le implementazioni personalizzate.
Implementazioni di esempio
Per un punto di allegato che deve rimanere fisso nel mondo fisico e che deve nascondere il relativo contenuto quando il rilevamento non è valido, AdjusterFixed implementa AdjustStateDelegate con il relativo membro HandleAdjustState e l'oggetto AdjustLocationDelegate con il relativo membro HandleAdjustLocation. Un componente simile per lo spostamento di oggetti è in AdjusterMoving.
Vale la pena notare che fornire uno o entrambi questi delegati è facoltativo, e in effetti le reazioni a modifiche di stato e posizione possono essere implementate in base al polling anziché agli eventi. Tuttavia, a meno che il loro uso non sia impossibile a causa di specifiche dell'applicazione, il sistema basato su eventi che usa delegati costituisce un'implementazione molto più efficiente.
È consigliabile iniziare con il componente AdjusterFixed (o molto simile a AdjusterMoving) e modificare i gestori HandleAdjustLocation e HandleAdjustState in base alle esigenze delle applicazioni.