Spostamento della modalità piattaforma in Unity

La modalità piattaforma mobile consente di HoloLens 2 di funzionare correttamente su piattaforme mobili come navi, piattaforme petrolifere e altri veicoli.

Altre informazioni sullo spostamento della modalità piattaforma

Panoramica dei concetti

Affinché i sistemi di realtà mista funzionino correttamente, il visore VR deve essere monitorato rispetto all'ambiente. Questo rilevamento relativo consente di eseguire il rendering della grafica in modo che appaiano all'utente del visore VR per essere bloccati in modo solido nell'ambiente. Il rilevamento viene in genere ottenuto combinando le pose calcolate usando fotocamere e misurazioni dall'esterno dell'unità di misura inerziale (IMU). Questo metodo funziona correttamente quando l'ambiente si trova nel frame di riferimento inerziale. Piccoli effetti, come il movimento planetario, sono di solito trascurati.

Quando l'ambiente non si trova nel frame di riferimento inerziale, il normale sistema di tracciamento della testa avrà esito negativo. La funzionalità Modalità piattaforma mobile risolve questo problema tenendo conto del movimento dell'ambiente rispetto al frame inerziale. Pertanto, quando si usa la modalità piattaforma mobile, HoloLens 2 può eseguire il rendering degli ologrammi che appaiono fissi nell'ambiente, anche se l'ambiente è una nave in movimento!

Come si attiva la modalità di spostamento della piattaforma?

Per abilitare una gamma di casi d'uso, sono stati forniti vari metodi per attivare la modalità piattaforma mobile. È importante considerare attentamente quale metodo scegliere. Una domanda chiave da porre è: Chi sa se il HoloLens 2 è attualmente all'interno di una piattaforma mobile? Per un esempio, vedere la tabella seguente:

Chissà se HL2 si trova in una piattaforma mobile Metodo migliore per impostare la modalità di spostamento della piattaforma Vantaggi Costi
Amministratore sistema Gestione dei dispositivi mobili L'utente non deve essere coinvolto. Qualsiasi app funzionerà senza modifiche. Il dispositivo può essere protetto dall'immissione della modalità non corretta. L'utente e le app non possono modificare la modalità.
Utente finale App Impostazioni L'utente è spesso il più informato su quando e dove usa il dispositivo. Qualsiasi app funzionerà senza modifiche. L'utente potrebbe non conoscere la modalità esistente.
Applicazione Usare l'SDK descritto in questo articolo. È possibile usare segnali specifici del caso d'uso per scambiare la modalità quando l'ambiente non può essere noto in anticipo. Rimuove il requisito che un utente deve prendere questa decisione e modificare la modalità nelle impostazioni. Un'app progettata in modo non adeguato può offrire un'esperienza molto negativa e lasciare il dispositivo in modalità imprevista.

Procedure consigliate per lo spostamento della modalità piattaforma

Server principale Descrizione
Rispettare la scelta dell'utente È consigliabile offrire all'utente la scelta prima di modificare la modalità per loro e continuare a rispettare tale scelta per il runtime dell'app
Fornire un avviso all'utente Evitare di cambiare la modalità immediatamente all'avvio/ripresa dell'app. Ciò presenta un'esperienza utente scarsa, poiché l'utente potrebbe non sapere perché il dispositivo perde il rilevamento.
Ridurre al minimo la modalità di modifica Quando si modificano le impostazioni della modalità piattaforma mobile, il dispositivo perderà il rilevamento, causando un'esperienza utente negativa. È quindi consigliabile ridurre al minimo la frequenza con cui si modifica la modalità. Idealmente, la modalità verrebbe modificata solo se il dispositivo passa da un ambiente stazionario a uno mobile o viceversa.
In caso di dubbi sull'ambiente, usare la modalità piattaforma mobile La modalità piattaforma mobile può funzionare sia in ambienti stazionari che in quelli mobili. Gli algoritmi di rilevamento regolari funzionano solo in ambienti stazionari, quindi, se non si è certi che l'ambiente si sposti, scegliere La modalità piattaforma mobile può essere la scelta più sicura.
Non usare la modalità piattaforma mobile in ambienti stazionari noti La modalità piattaforma mobile offre prestazioni inferiori rispetto alla modalità standard negli ambienti stazionari. Si tratta di una piccola riduzione, anche se sarà evidente per la maggior parte degli utenti.
Considerare la modalità in cui lasciare il dispositivo Questo SDK consente agli sviluppatori di progettare esperienze affidabili durante l'avvio del dispositivo. Valutare se il dispositivo si troverà in una piattaforma mobile al successivo avvio e lasciare il dispositivo nella modalità appropriata.

Dove si ottiene l'SDK?

Moving Platform SDK supporta proiezioni del linguaggio per C# e C++, consentendo agli sviluppatori di sviluppare applicazioni per piattaforme Win32 o UWP. Scaricare e installare l'SDK con Realtà mista Feature Tool.

Ricerca per categorie usare questo SDK

Dopo aver installato l'SDK, è possibile configurare lo script per l'uso di MovingPlatformManger come indicato di seguito:

// Top of file
using Microsoft.MixedReality.MovingPlatform;
// Code body
m_movingPlatformManager = new MovingPlatformManager();

Lettura della modalità corrente

Il valore corrente della modalità può essere letto come segue:

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

MovingPlatformMode è un'enumerazione definita come segue:

public enum MovingPlatformMode
{
    Standard,                // The legacy mode that devices use out-of-the-box.
    MovingPlatformOptimized  // Allows tracking on moving platforms.
}

I dispositivi che non dispongono della modalità mobile della piattaforma, ad esempio i dispositivi VR e HoloLens 1, restituiranno sempre "Standard".

Impostazione della modalità

È possibile impostare il valore modalità piattaforma mobile come indicato di seguito:

bool success = m_movingPlatformManager.TrySetMode(MovingPlatformMode.MovingPlatformOptimized);

TrySetMode restituirà true se la modalità dispositivo corrisponde ora alla modalità richiesta. Se la modalità è già nello stato desiderato, non verrà eseguita alcuna operazione e il dispositivo non perderà il rilevamento.

Callback in modalità di modifica

A volte, potrebbe essere utile sapere se un'altra app o l'utente ha modificato il valore modalità piattaforma mobile. È possibile eseguire questa operazione come indicato di seguito.

// Code Body
m_movingPlatformManager.ModeChanged += CallbackOnMPMChanged;
...
void CallbackOnMPMChanged(object sender, MovingPlatformEventArgs args)
{
    movingPlatformModeChanged = true;
    movingPlatformModeValue = args.ModeEntered;
}
...
void Update()
{
    // It's not reccomended to do work in the callback.
    if (movingPlatformModeChanged)
    {
        movingPlatformModeChanged = false;
        // Do some work
    }
}

Verifica se la modalità è impostata

A volte è utile sapere se la modalità è impostata prima di tentare di modificarla. Ad esempio, se si vuole sapere se è presente un valore per chiedere all'utente la preferenza. È possibile trovare se la modalità piattaforma mobile è impostata con la funzione IsSetModeSupported:

bool supported = m_movingPlatformManager.IsSetModeSupported();

Questa funzione restituirà true se il dispositivo può modificare le modalità e false se non è possibile. Questa funzione tiene conto dei criteri mdm (Mobile Gestione dispositivi). Ad esempio, se MDM forza MovingPlatformMode su "On", questa funzione restituirà false.

Uno script dimostrativo

Questo script mostra tutti gli elementi importanti dell'SDK in un'unica posizione. L'esempio non segue le procedure consigliate illustrate in precedenza.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.MovingPlatform;
using System;

public class MovingPlatformDemo : MonoBehaviour
{
    public GameObject cube; // A simple cube to display colors.
    private MovingPlatformManager m_movingPlatformManager;
    private Renderer cubeRenderer;
    private bool movingPlatformModeChanged;
    private MovingPlatformMode movingPlatformModeValue;

    // Start is called before the first frame update
    void Start()
    {
        m_movingPlatformManager = new MovingPlatformManager();
        cubeRenderer = cube.GetComponent<Renderer>();

        // Get initial value of mode, 
        // Just this mechanism would be adequate if a one time check is acceptable. 
        MovingPlatformMode initialMovingPlatformMode = m_movingPlatformManager.Mode;

        // Find if It's possible to change the mode. 
        bool isSettable = m_movingPlatformManager.IsSetModeSupported();

        // Here you would add some use case specific logic using initialMovingPlatformMode and isSettable
        // to decide if you should ask the user if they want to change the mode. 

        // To set the mode.
        bool success = m_movingPlatformManager.TrySetMode(MovingPlatformMode.MovingPlatformOptimized);

        // Visual indicator of current state: Green = Moving Platform Optimized, Red = Regular.
        SetColourFromState(m_movingPlatformManager.Mode, cubeRenderer);

        // We set a callback to be notified if there's a change in mode. This is typically optional.
        m_movingPlatformManager.ModeChanged += CallbackOnMPMChanged;
        movingPlatformModeChanged = false;
    }

    // Update is called once per frame
    void Update()
    {
        // This must be done in the UI thread.
        if (movingPlatformModeChanged)
        {
            movingPlatformModeChanged = false;
            SetColourFromState(movingPlatformModeValue, cubeRenderer);
        }
    }

    // Sets renderer to:
    // Green = Moving Platform Mode Enabled
    // Red = Moving Platform Mode Disabled
    void SetColourFromState(MovingPlatformMode mode, Renderer thisRend)
    {
        if (mode == MovingPlatformMode.MovingPlatformOptimized)
        {
            thisRend.material.color = new Color(0f, 1f, 0f, 1f);
        }
        else
        {
            thisRend.material.color = new Color(1f, 0f, 0f, 1f);
        }
    }

    void CallbackOnMPMChanged(object sender, MovingPlatformEventArgs args)
    {
        movingPlatformModeChanged = true;
        movingPlatformModeValue = args.ModeEntered;
    }
}

Vedi anche