Architettura dell'interazione - MRTK3

MRTK si basa sul set di interagisci offerti da XR Interaction Toolkit di Unity. Per impostazione predefinita, le funzionalità di realtà mista, ad esempio tracciamento della mano articolata, sguardo fisso e avvicinamento delle dita richiedono interazioni più elaborate rispetto al set fornito con XRI. MRTK definisce nuove interfacce di interazione, classificate in genere in base alla modalità di input e alle implementazioni corrispondenti.

Riepilogo e revisione

Per gli sviluppatori che non hanno esperienza con XRI, è consigliabile prima consultare la documentazione dell'architettura XRI di Unity. Gli interactor MRTK sono sottoclassi di interagendotori XRI esistenti o implementazioni delle interfacce dell'interactor XRI. Vedere la documentazione di Unity sull'architettura dell'interazione che si applica anche a MRTK.

Buoni cittadini di XRI

Gli interagitori MRTK personalizzati sono ben comportati rispetto alle interfacce di interazione XRI predefinite; dal punto di vista dei sistemi XRI, sono indistinguibili dagli interagendotori "vanilla". Anche l'inverso è vero; quando si creano interazioni avanzate in MRTK, gli interagendotori XRI predefiniti continueranno a funzionare per il passaggio del mouse di base e selezionare. Fa parte dello sforzo di MRTK per essere completamente compatibile con i progetti XRI esistenti. Se si dispone di un'applicazione XRI, MRTK interagisce e i controlli dell'interfaccia utente funzioneranno con la configurazione XRI "vanilla" esistente.

Astrazione della modalità di input

Il dispositivo di input, l'interactor che esegue l'interazione e gli eventi di interazione generati sono tutti isolati dall'architettura in XRI. Questo isolamento è fondamentale per la strategia di astrazione di input in MRTK3 e consente di scrivere interazioni multipiattaforma e tra dispositivi che funzionano bene in tutti i contesti.

Da MRTK v2, esiste un istinto comune per le interazioni di codice specifiche di un particolare tipo di input o dispositivo. Molti sviluppatori sono abituati a scrivere interazioni che reagiscono in modo specifico a un avvicinamento, a un raggio lontano o ad altri tipi di input specifici.

Anche se MRTK3 consente comunque la disambiguazione e il rilevamento di singole modalità di input, le interazioni hardcoded per singoli tipi di input specifici limitano e riducono la flessibilità delle interazioni. Altre informazioni sono disponibili nella documentazione sull'architettura interagendo, ma la chiave per gli interaginti è che in genere non è necessario eseguire il mapping 1:1 con i dispositivi di input.

AttachTransform e Inversione del controllo

Gran parte di ciò che MRTK v2 ha fatto nelle "logiche di spostamento" come parte di ObjectManipulator, Slidere così via, è ora la responsabilità dell'interactor stesso. L'interactor ora controlla il relativo attachTransform per definire il comportamento di un tipo specifico di manipolazione. Non è più necessario scrivere logica di interazione complessa sull'interazione interagendo che differisce tra le modalità di input; Al contrario, la logica di manipolazione unificata può ascoltare la attachTransformposizione del dispositivo indipendentemente dalla modalità di input o dal dispositivo che lo guida.

Ad esempio, un GrabInteractoroggetto attachTransform si trova nel punto di afferramento sulla mano/controller. Un XRRayInteractor's attachTransform si trova al punto di hit alla fine del raggio. L'oggetto CanvasProxyInteractorattachTransform si trova ovunque si sia fatto clic sul mouse. Per tutti questi diversi interagitori, l'interagendo non deve preoccuparsi del tipo di interagiscere per rispondere in modo appropriato alle manipolazioni.

L'oggetto attachTransform interagisce e può trattare tutte le stesse attachTransform query indipendentemente dal tipo di interazione.

Questo approccio è fondamentale per la compatibilità con gli interagendotori XRI esistenti e per le interazioni a prova futura per le modalità di input che non sono ancora state sviluppate. Se viene introdotto un nuovo metodo di input, non è necessario modificare le interazioni esistenti se il nuovo interactor genera un comportamento attachTransformvalido e corretto.

Così, filosofiamente, èattachTransform la logica di interazione. Per qualsiasi interazione personalizzata, dare sempre la preferenza alla scrittura di un nuovo interactor con una nuova attachTransform logica anziché riscrivere o estendere le interazioni da personalizzare per la nuova interazione. In questo modo, tutti gli elementi interagibili esistenti possono usufruire dei vantaggi della nuova interazione anziché solo quelli riscritti o estesi.

XRController e associazione di input

La maggior parte degli interactor non è associata direttamente alle azioni di input. La maggior parte deriva da XRBaseControllerInteractor, che richiede un XRController oggetto sopra l'interactor nella gerarchia. Associa XRController alle azioni di input e quindi propaga le azioni pertinenti (selezionare e così via) a tutti gli interaginti collegati.

Tuttavia, alcuni interagitori potrebbero richiedere associazioni di input speciali o input aggiuntivi che XRController non forniscono. In questi casi, gli interactor hanno la possibilità di eseguire il binding direttamente alle proprie azioni di input univoco o anche di usare altre origini non di input-system per la logica di interazione. Le classi di base XRI preferiscono restare in ascolto delle XRControllerassociazioni, ma questi comportamenti possono essere sottoposti a override per usare origini di input esterne o alternative.

Interfacce

XRI definisce l'oggetto di base IXRInteractor, IXRHoverInteractor, IXRSelectInteractore IXRActivateInteractor. MRTK definisce interfacce aggiuntive per gli interactor. Alcune espongono informazioni aggiuntive sulle interazioni specifiche di MRTK e altre sono semplicemente per la categorizzazione e l'identificazione. Queste interfacce si trovano all'interno del pacchetto Core , mentre le implementazioni risiedono in altri pacchetti, incluso Input.

Importante

Sebbene queste interfacce siano utili se è necessario filtrare per un tipo specifico di interazione, è consigliabile non impostare come hardcoded le interazioni per l'ascolto di queste interfacce in modo specifico. In ogni situazione, dare sempre la preferenza all'XRI generico isSelected e isHovered, anziché a qualsiasi interfaccia specifica dell'interazione.

A meno che non sia necessario, non è consigliabile fare riferimento alle implementazioni MRTK concrete di queste interfacce in interazioni, a meno che non sia assolutamente necessario. In tutti i casi, è preferibile fare riferimento alle interfacce. Facendo riferimento in modo esplicito ai tipi concreti, i tipi concreti limitano le interazioni solo con i tipi correnti esistenti. Facendo riferimento solo alle interfacce, si garantisce la compatibilità con le implementazioni future che potrebbero non sottoclassare le implementazioni esistenti.

IVariableSelectInteractor

Gli interactor che implementano questa interfaccia possono rilasciare la selezione variabile (ovvero analogica) per interagire. È possibile eseguire query sulla variabile select amount con la SelectProgress proprietà . Gli interactor MRTK che implementano questa interfaccia includono MRTKRayInteractor e GazePinchInteractor. Le interazioni di base (le interazioni XRI predefinite e MRTKBaseInteractable) non saranno interessate dall'importo della selezione variabile. StatefulInteractableTuttavia, rimane in ascolto di questo valore e ne Selectedness calcola il valore in base a max() tutte le variabili partecipanti e agli interagitori non variabili.

IGazeInteractor

Gli interactor che implementano questa interfaccia rappresentano lo sguardo fisso passivo dell'utente, separati da qualsiasi manipolazione o finalità. L'implementazione di MRTK è FuzzyGazeInteractor, che eredita da XRI XRRayInteractore aggiunge la logica di cast cone-cast fuzzy. XRBaseInteractable verrà contrassegnato IsGazeHovered quando un IGazeInteractor oggetto passa il puntatore del mouse.

IGrabInteractor

Gli interactor che implementano questa interfaccia rappresentano un'interazione fisica di afferramento sul campo. L'oggetto attachTransform è definito come punto di afferramento. L'implementazione di MRTK è GrabInteractor, che sottoclasse di XRDirectInteractorXRI.

IPokeInteractor

Gli interactor che implementano questa interfaccia rappresentano un'interazione di tipo poking. Si noti che questo non implica necessariamente un dito! Gli interagendotori arbitrari possono implementare questa interfaccia e offrire interazioni di tipo poking da origini non dita. In una delle poche istanze in cui il controllo delle interfacce dell'interagitore è una buona idea, interagisce come PressableButton l'ascolto di IPokeInteractors, in particolare, per guidare la pressione categorica. Qualsiasi interagitore che implementa IPokeInteractor causerà la pressione 3D sui pulsanti.

IPokeInteractor espone la PokeRadius proprietà , che definisce le caratteristiche dell'oggetto poking. Il poke viene considerato centrato sull'oggetto attachTransform e si estende verso l'esterno attachTransform da da PokeRadius. Interagisci come PressableButton sfalsare la distanza di spinta 3D in base a questo raggio, che può essere determinata dallo spessore fisico del dito dell'utente in caso di pressione basata su dito.

L'implementazione MRTK di questa interfaccia è PokeInteractor. Nel progetto modello viene fornito anche un altro esempio di IPokeInteractor non basato sulle dita. PenInteractor Fornisce interazioni poke radicate sulla punta di uno stilo 3D virtuale.

IRayInteractor

Gli interactor che implementano questa interfaccia rappresentano un'interazione di puntamento basata su raggi. Rappresenta attachTransform la posizione di hit del raggio sulla superficie dell'oggetto di destinazione durante una selezione.

L'implementazione MRTK di questa interfaccia è MRTKRayInteractor, ereditando direttamente da XRI XRRayInteractor.

Nota

XRI XRRayInteractor non implementa questa interfaccia MRTK.

ISpeechInteractor

Gli interactor che implementano questa interfaccia rappresentano le interazioni basate sul riconoscimento vocale. L'implementazione di MRTK è SpeechInteractor.

MRTK SpeechInteractor, internamente, usa PhraseRecognitionSubsystem e sottoscrive gli eventi di registrazione interagendo da XRI XRInteractionManager. Tuttavia, le interazioni non devono preoccuparsi di quale sottosistema sta eseguendo l'elaborazione vocale; ISpeechInteractors genera gli stessi eventi XRI (seleziona e così via) che qualsiasi altro interagitore esegue.

IGazePinchInteractor

Questa interfaccia è semplicemente una specializzazione dell'interfaccia IVariableSelectInteractor . Gli interactor che implementano questa interfaccia sono, in modo implicito, interagendotori di selezione variabile. IGazePinchInteractors rappresentano espressamente una manipolazione remota mirata indirettamente. Un interagitore separato basato sullo sguardo fisso determina la destinazione dell'interazione e la manipolazione è da una mano o un controller. attachTransform si comporta allo stesso modo IRayInteractor. attachTransform Si blocca al punto di hit sulla destinazione quando viene avviata una selezione.

Quando più s IGazePinchInteractorpartecipano a una singola interazione, i relativi attachTransforms vengono sfalsati dallo spostamento dal punto mediano tra tutti i punti di avvicinamento delle dita partecipanti. Di conseguenza, gli interagendo possono interpretare questi attachTransformoggetti nello stesso modo in cui si farebbe per qualsiasi altra interazione multi-mano, ad esempio da attachTransforms interazioni a mano o interazioni con raggi.

L'implementazione di MRTK è .GazePinchInteractor

IHandedInteractor

Alcuni interagisci possono scegliere di implementare l'interfaccia IHandedInteractor per specificare in modo esplicito che sono associati a una determinata mano su un utente. Alcuni interagisci non sono associati alla mano e quindi non implementano questo. Gli esempi più ovvi sarebbero quelli come SpeechInteractor o FuzzyGazeInteractor.

Gli interagiscori MRTK che implementano questa interfaccia sono , HandJointInteractorun oggetto generico, astratta XRDirectInteractor guidato da un'associazione a mano arbitraria, dall'oggetto GazePinchInteractore dall'oggetto MRTKRayInteractor.

Gli interagisci attualmente usano questa interfaccia per generare determinati effetti quando selezionati devono disambiguare tra una mano sinistra o destra. L'esempio più importante di questo è l'effetto dell'impulso nella libreria dei componenti dell'esperienza utente.