Allenatore della mano - MRTK2
Il coach a mano è 3D modellato a mano che viene attivato quando il sistema non rileva le mani dell'utente. Questo viene implementato come componente "insegnare" che aiuta a guidare l'utente quando il gesto non è stato insegnato. Se gli utenti non hanno fatto il gesto specificato per un periodo, le mani eseguiranno il ciclo con un ritardo. L'allenatore della mano può essere usato per rappresentare un pulsante o raccogliere un ologramma.
Il modello di interazione corrente rappresenta un'ampia gamma di controlli di movimento, ad esempio lo scorrimento, la selezione lontana e il tocco vicino. Di seguito è riportato un elenco completo degli esempi di hand coach esistenti:
- Vicino al tocco : usato per i pulsanti o chiudere oggetti interagiscibili
- Lontano selezionare : usato per gli oggetti che sono lontano
- Sposta : usato per spostare un ologramma nello spazio
- Ruota : usato per mostrare come ruotare gli ologrammi o gli oggetti
- Scalabilità: usata per illustrare come modificare gli ologrammi per essere più grandi o più piccoli
- Capovolgimento della mano: usato per visualizzare un pannello di avvio dell'interfaccia utente o menu a mano
- Palm up : usato per un momento di colibrì fuori dalla scatola. Un altro suggerimento potrebbe essere quello di visualizzare un pannello di avvio dell'interfaccia utente
- Scorrimento: usato per scorrere un elenco o un documento lungo
Scena di esempio
È possibile trovare esempi nella scena HandCoachExample in: MixedRealityToolkit.Examples/Experimental/HandCoach/Scenes
Asset 3D di mano
È possibile trovare gli asset in: MixedRealityToolkit.SDK/Experimental/HandCoach
Qualità
Se si notano distorsioni sulla rete con pelle, è necessario assicurarsi che il progetto usi la quantità appropriata di articolazioni. Passare a Modifica > impostazioni > progetto di Unity Qualità > altri > pesi di blend. Assicurarsi che "4 ossa" siano selezionate per visualizzare Le articolazioni liscia.
Script
Hint di interazione
Lo InteractionHint.cs
script fornisce funzionalità wrapper per l'attivazione di animazioni e dissolvenze per il rig della mano.
Come configurare un hint di interazione
Per configurare un hint di interazione, è consigliabile usare i prefab forniti "StaticHandCoachRoot_L.prefab" e "StaticHandCoachRoot_R.prefab". Questo prefab contiene lo script InteractionHint e il rig della mano, nonché la gerarchia appropriata per garantire che le animazioni hint fornite funzionino come previsto. In caso contrario, è necessario inserire lo script in un gameObject un livello padre superiore dal rig della mano con l'animatore.
Proprietà di controllo
HideIfHandTracked Questo booleano specifica se lo stato di rilevamento delle mani deve essere usato per nascondere gli oggetti visivi quando vengono rilevate le mani di un utente. Se questa impostazione è impostata su false, verrà usata solo la proprietà di scripting "customShouldHideVisuals" per determinare se nascondere l'hint.
MinDelay Questa proprietà specifica il ritardo minimo per visualizzare gli oggetti visivi. Per impostazione predefinita, gli oggetti visivi per la mano verranno visualizzati dopo questo numero di secondi se le mani dell'utente non vengono rilevate.
MaxDelay Questa proprietà specifica il ritardo massimo per visualizzare gli oggetti visivi. Per impostazione predefinita, gli oggetti visivi per la mano verranno visualizzati dopo questo numero di secondi anche se le mani dell'utente vengono tracciate.
UseMaxTimer Se questo booleano è impostato su false, disabilita il timer massimo e consente di visualizzare solo l'hint della mano quando le mani dell'utente sono fuori vista o la condizione personalizzata restituisce false.
Ripete Questa proprietà controlla il numero di volte in cui l'animazione hint viene riprodotta quando il timer min o max è passato. L'hint nasconde e attende di nuovo il ritardo.
Attivazione automatica Quando questo booleano è impostato su true, l'hint verrà eseguito automaticamente tramite la logica timer quando GameObject dello script è attivo nella gerarchia e lo script è abilitato. Questa opzione deve essere impostata solo su false se si intende controllare manualmente l'aspetto dell'hint e la scomparsa tramite codice.
AnimationState Nome dello stato di animazione che deve essere riprodotto quando l'hint è attivo. Questa operazione deve essere impostata prima che venga chiamata la funzione StartHintLoop() (durante OnEnable se viene selezionata l'opzione AutoActivate).
Controllo dell'interazioneHint tramite script
- StartHintLoop Questa funzione avvia il ciclo show/hide che in caso contrario avvia OnEnable se il flag AutoActivate è impostato su true.
- StopHintLoop Questa funzione chiama lo stato di animazione di dissolvenza se non è attualmente in riproduzione, disattiva il ciclo show/hide e imposta il rig della mano inattiva nella gerarchia.
- AnimationState Questa stringa determina lo stato di animazione riprodotto durante il ciclo. È possibile modificare questa stringa per modificare lo stato riprodotto, ma è necessario farlo dopo aver chiamato StopHintLoop e chiamare di nuovo StartHintLoop dopo aver modificato lo stato.
- CustomShouldHideVisuals È possibile impostarlo con la propria funzione, che dovrebbe restituire true quando si desidera nascondere gli oggetti visivi della mano (tenere presente il parametro MinMaxTimer, in particolare il parametro max)
Considerazioni sull'animazione personalizzata
Le fades sono predefinite per 0,5 secondi, quindi tutte le animazioni personalizzate create per l'uso con il rig devono essere minime di 1,5 secondi per qualsiasi informazione significativa da trasmettere
Gli stati predefiniti specificati in e sadete, Fade_In e Fade_Out possono essere modificati modificando il timestamp del secondo fotogramma chiave per impostare la lunghezza di dissolvenza.
L'animazione e lo script sono stati configurati in modo da rendere la configurazione il più semplice possibile. Per aggiungere nuovi stati di animazione, importare semplicemente fbx, assicurarsi che il nome dell'animazione sia impostato con un nome distinto e trascinare l'animazione nell'animazione.
MoveToTarget
Lo script MoveToTarget.cs offre funzionalità per spostare l'hint della mano da una posizione di rilevamento a una posizione di destinazione nel tempo.
Come configurare MoveToTarget
I prefab forniti "MovingHandCoachRoot_L.prefab" e "MovingHandCoachRoot_R.prefab" contengono un oggetto MoveToTarget nelle gerarchie. Se si vuole usare questo script nella propria configurazione, è necessario inserirlo nel gameobject radice contenente l'animatore per il rig.
Proprietà di controllo
- TrackingObject Impostare questo oggetto con l'oggetto da seguire prima di avviare il movimento. È consigliabile creare un GameObject vuoto e spostarlo in una posizione specifica per aiutarti a individuare il rilevamento.
- Targetobject Impostare questo oggetto con l'oggetto a cui si vuole spostare il rig durante il movimento. È consigliabile creare un GameObject vuoto e spostarlo in una posizione specifica per aiutarti a individuare il rilevamento.
- RootObject Impostare questa opzione su un elemento padre condiviso tra il rilevamento e l'oggetto di destinazione in modo che le posizioni relative possano essere calcolate correttamente. Il prefab incluso include sia oggetti di rilevamento che di destinazione nella relativa gerarchia, ma è possibile impostare l'oggetto di destinazione come gameObject all'esterno del prefab e modificare l'oggetto radice in un elemento padre condiviso.
- Durata La quantità di tempo necessario (in secondi) per passare da TrackingObject a TargetObject in secondi.
- TargetOffset Un offset tonnabile per ottenere gameObject per arrivare alla posizione di destinazione destra. Questo è utile se l'animazione include un offset di posizione durante l'animazione.
- AnimationCurve Questo valore è predefinito in una curva lineare, ma è possibile modificare la curva per fornire l'allentamento in/out durante l'avvio e l'arresto del percorso di movimento.
Controllo di MoveToTarget tramite script
Nello script personalizzato effettuare una chiamata a Follow() mentre si vuole che il rig della mano sia in seguito a TrackingObject, quindi effettuare una chiamata a MoveToTargetPosition() quando si vuole che il rig della mano inizi il movimento a TargetObject.
Controllo di MoveToTarget tramite animazioni
Nell'animazione che deve spostarsi, impostare due eventi: uno con una chiamata a Follow() e una con una chiamata a MoveToTargetPosition(). Seguire deve essere impostato sul primo fotogramma chiave, poiché causa il rig della mano a seguire TrackingObject. MoveToTargetPosition deve essere impostato sul fotogramma chiave in cui si vuole che il rig inizi a passare alla destinazione. Si tratta del modo in cui viene usata la funzionalità dello script nei prefab forniti.
RotateAroundPoint
Lo script RotateAroundPoint.cs offre funzionalità per ruotare l'hint della mano intorno a un punto pivot nel tempo.
Come configurare RotateAroundPoint
I prefab forniti "RotatingHandCoachRoot_L.prefab" e "RotatingHandCoachRoot_R.prefab" contengono un elemento RotateAroundPoint nelle gerarchie. Se si vuole usare questo script nella propria configurazione, è necessario inserirlo nel gameobject radice contenente l'animatore per il rig.
Proprietà di controllo
- CenteredParent Impostare questa opzione con l'oggetto padre che si vuole che il rig sia pivot intorno.
- InverseParent Impostare questo valore con l'elemento padre per ruotare inverso su centeredParent per mantenere lo stesso orientamento della mano. In generale, questo sarà l'oggetto padre con lo script InteractionHint.
- PivotPosition Impostare questo valore su un punto in cui si vuole che l'hint inizi a muoversi.
- Durata La quantità di tempo necessario (in secondi) per ruotare intorno al CentroedParent.
- AnimationCurve Questo valore è predefinito in una curva lineare, ma è possibile modificare la curva per fornire l'allentamento in/out durante l'avvio e l'arresto del percorso di movimento.
- RotationVector Quanti gradi ruotano lungo ogni asse.
Controllo di RotateAroundPoint tramite script
Nello script personalizzato effettuare una chiamata a RotateToTarget() quando si vuole che il rig della mano inizi la rotazione intorno al CenteredParent. Quando si vuole che la posizione venga reimpostata nella PivotPosition originale, effettuare una chiamata a ResetAndDeterminePivot().
Controllo di RotateAroundPoint tramite animazioni
Nell'animazione che deve essere spostata, impostare due eventi: uno con una chiamata a ResetAndDeterminePivot() e una con una chiamata a RotateToTarget(). ResetAndDeterminePivot deve essere impostato nel primo fotogramma chiave, perché fa sì che il rig della mano venga reimpostato sulla PivotPosition. RotateToTarget deve essere impostato sul fotogramma chiave in cui si vuole che il rig inizi a ruotare intorno a CenteredParent. Questa è la modalità di utilizzo della funzionalità di script nei prefab forniti.