Movimenti in Unity

Esistono due modi chiave per intervenire sullo sguardo fisso in Unity, i movimenti delle mani e i controller di movimento in HoloLens e HMD immersive. È possibile accedere ai dati per entrambe le origini di input spaziale tramite le stesse API in Unity.

Unity offre due modi principali per accedere ai dati di input spaziali per Windows Realtà mista. Le API Input.GetButton/Input.GetAxis comuni funzionano in più SDK XR di Unity, mentre l'API InteractionManager/GestureRecognizer specifica di Windows Realtà mista espone il set completo di dati di input spaziali.

API di movimento composito di alto livello (GestureRecognizer)

Spazio dei nomi: UnityEngine.XR.WSA.Input
Tipi: GestureRecognizer, GestureSettings, InteractionSourceKind

L'app può anche riconoscere movimenti compositi di livello superiore per origini di input spaziali, tocco, blocco, manipolazione e movimenti di spostamento. È possibile riconoscere questi movimenti compositi su entrambe le mani e i controller di movimento usando GestureRecognizer.

Ogni evento Gesture in GestureRecognizer fornisce SourceKind per l'input e il raggio head di destinazione al momento dell'evento. Alcuni eventi forniscono informazioni aggiuntive specifiche del contesto.

Sono necessari solo alcuni passaggi per acquisire i movimenti usando un riconoscimento movimento:

  1. Creare un nuovo riconoscimento movimenti
  2. Specificare i movimenti da controllare
  3. Sottoscrivere eventi per tali movimenti
  4. Avviare l'acquisizione di movimenti

Creare un nuovo riconoscimento movimenti

Per usare GestureRecognizer, è necessario aver creato un oggetto GestureRecognizer:

GestureRecognizer recognizer = new GestureRecognizer();

Specificare i movimenti da controllare

Specificare i movimenti a cui si è interessati tramite SetRecognizableGestures():

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

Sottoscrivere eventi per tali movimenti

Sottoscrivere gli eventi per i movimenti a cui si è interessati.

void Start()
{
    recognizer.Tapped += GestureRecognizer_Tapped;
    recognizer.HoldStarted += GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}

Nota

I movimenti di spostamento e manipolazione si escludono a vicenda in un'istanza di GestureRecognizer.

Avviare l'acquisizione di movimenti

Per impostazione predefinita, un oggetto GestureRecognizer non monitora l'input finché non viene chiamato StartCapturingGestures(). È possibile che venga generato un evento di movimento dopo la chiamata a StopCapturingGestures() se l'input è stato eseguito prima del frame in cui è stato elaborato StopCapturingGestures(). GestureRecognizer ricorderà se è stato attivato o spento durante il fotogramma precedente in cui si è effettivamente verificato il movimento e quindi è affidabile avviare e arrestare il monitoraggio dei movimenti in base alla destinazione dello sguardo fisso di questo fotogramma.

recognizer.StartCapturingGestures();

Arrestare l'acquisizione dei movimenti

Per arrestare il riconoscimento dei movimenti:

recognizer.StopCapturingGestures();

Rimozione di un riconoscitore di movimenti

Ricordarsi di annullare la sottoscrizione agli eventi sottoscritti prima di eliminare un oggetto GestureRecognizer .

void OnDestroy()
{
    recognizer.Tapped -= GestureRecognizer_Tapped;
    recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}

Rendering del modello di controller di movimento in Unity

Modello e teletrasportazione del controller di movimento
Modello e teletrasportazione del controller del movimento

Per eseguire il rendering dei controller di movimento nella tua app che corrispondono ai controller fisici che gli utenti tengono premuto e articolato quando vengono premuti vari pulsanti, puoi usare il prefab MotionController in Realtà mista Toolkit. Questo prefab carica dinamicamente il modello glTF corretto in fase di esecuzione dal driver del controller di movimento installato dal sistema. È importante caricare questi modelli in modo dinamico anziché importarli manualmente nell'editor, in modo che l'app visualizzi modelli 3D fisicamente accurati per tutti i controller correnti e futuri che gli utenti potrebbero avere.

  1. Seguire le istruzioni introduttive per scaricare Realtà mista Toolkit e aggiungerlo al progetto Unity.
  2. Se la fotocamera è stata sostituita con il prefab MixedRealityCameraParent come parte dei passaggi introduttivi, è consigliabile procedere. Tale prefab include il rendering del controller del movimento. In caso contrario, aggiungere Asset/HoloToolkit/Input/Prefabs/MotionControllers.prefab nella scena dal riquadro Progetto. È consigliabile aggiungere tale prefab come figlio di qualsiasi oggetto padre usato per spostare la fotocamera quando l'utente teletrasporta all'interno della scena, in modo che i controller arrivino insieme all'utente. Se l'app non implica il teletrasporto, è sufficiente aggiungere il prefab alla radice della scena.

Creazione di oggetti

La creazione di oggetti nella realtà virtuale è un problema più difficile di quanto possa sembrare inizialmente. Come per la maggior parte delle interazioni fisicamente basate, quando si lancia in gioco agisce in modo imprevisto, è immediatamente ovvio e rompe l'immersione. Abbiamo trascorso del tempo pensando profondamente a come rappresentare un comportamento di throwing fisicamente corretto e abbiamo creato alcune linee guida, abilitate tramite gli aggiornamenti alla nostra piattaforma, che vorremmo condividere con te.

È possibile trovare un esempio di come è consigliabile implementare la creazione di un'eccezione qui. Questo esempio segue queste quattro linee guida:

  • Usare la velocità del controller anziché la posizione. Nell'aggiornamento di novembre a Windows è stata introdotta una modifica del comportamento quando si trova nello stato di rilevamento posizionale ''Approssimato'. Quando in questo stato, le informazioni sulla velocità sul controller continueranno a essere segnalate per tutto il tempo in cui riteniamo che la sua accuratezza elevata, che è spesso più lunga della posizione rimane alta precisione.

  • Incorporare la velocità angolare del controller. Questa logica è tutto contenuta nel throwing.cs file nel GetThrownObjectVelAngVel metodo statico, all'interno del pacchetto collegato in precedenza:

    1. Man mano che viene conservata la velocità angolare, l'oggetto generato deve mantenere la stessa velocità angolare che aveva al momento del lancio: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Poiché il centro di massa dell'oggetto generato non è probabilmente all'origine della posa del grip, è probabile che abbia una velocità diversa rispetto a quella del controller nel frame di riferimento dell'utente. La parte della velocità dell'oggetto ha contribuito in questo modo è la velocità tangente istantanea del centro di massa dell'oggetto generato intorno all'origine del controller. Questa velocità tangente è il prodotto incrociato della velocità angolare del controller con il vettore che rappresenta la distanza tra l'origine del controller e il centro di massa dell'oggetto generato.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. La velocità totale dell'oggetto generato è la somma della velocità del controller e questa velocità tangente: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Prestare attenzione al momento in cui applichiamo la velocità. Quando si preme un pulsante, possono essere necessari fino a 20 ms affinché tale evento venga spostato tramite Bluetooth al sistema operativo. Ciò significa che se si esegue il polling di uno stato del controller da premuto a non premuto o in altro modo, il controller pose le informazioni ottenute con esso sarà effettivamente in anticipo rispetto a questo cambiamento di stato. Inoltre, la posizione del controller presentata dall'API di polling viene stimata in modo da riflettere una probabile posizione nel momento in cui verrà visualizzato il frame che potrebbe essere superiore a 20 ms in futuro. Ciò è utile per il rendering degli oggetti mantenuti, ma complica il problema di tempo per la destinazione dell'oggetto mentre calcoliamo la traiettoria per il momento in cui l'utente ha rilasciato l'eccezione. Fortunatamente, con l'aggiornamento di novembre, quando viene inviato un evento Unity come InteractionSourcePressed o InteractionSourceReleased , lo stato include i dati cronologici relativi alla posizione da quando il pulsante è stato premuto o rilasciato. Per ottenere il rendering e la destinazione del controller più accurati durante gli eventi, è necessario usare correttamente il polling e l'evento, in base alle esigenze:

    • Per il rendering di ogni fotogramma, l'app deve posizionare il GameObject del controller in corrispondenza della posizione del controller prediti in avanti per l'ora foton del fotogramma corrente. È possibile ottenere questi dati dalle API di polling di Unity, ad esempio XR. InputTracking.GetLocalPosition o XR. WSA. Input.InteractionManager.GetCurrentReading.
    • Per la destinazione del controller in caso di stampa o rilascio, l'app deve eseguire il raycast e calcolare le traiettorie in base alla posizione cronologica del controller per l'evento di stampa o rilascio. È possibile ottenere questi dati dalle API di eventi di Unity, ad esempio InteractionManager.InteractionSourcePressed.
  • Usa la posa del grip. La velocità e la velocità angolari vengono segnalate in relazione alla posizione del grip, non alla posizione del puntatore.

La generazione continuerà a migliorare con gli aggiornamenti futuri di Windows e ci si può aspettare di trovare altre informazioni qui.

Controller movimento e movimento in MRTK

È possibile accedere al controller movimento e movimento da Gestione input.

Seguire le esercitazioni

Le esercitazioni dettagliate, con esempi di personalizzazione più dettagliati, sono disponibili in Realtà mista Academy:

Input MR 213 - Controller movimento
Input MR 213 - Controller movimento

Successivo checkpoint di sviluppo

Se si sta seguendo il percorso di sviluppo di Unity, si sta esplorando i blocchi predefiniti principali di MRTK. Da qui, è possibile passare al blocco predefinito successivo:

In alternativa, passare alle API e alle funzionalità della piattaforma di realtà mista:

È sempre possibile tornare ai checkpoint per lo sviluppo con Unity in qualsiasi momento.

Vedi anche