Spostamento della modalità piattaforma in Unity

La modalità piattaforma mobile consente HoloLens 2 di funzionare correttamente su piattaforme in movimento, ad esempio navi, piattaforme di olio e altri veicoli.

Altre informazioni sullo spostamento della modalità piattaforma

Panoramica dei concetti

Per il corretto funzionamento dei sistemi di realtà mista, è necessario tenere traccia del visore rispetto all'ambiente. Questo rilevamento relativo consente di eseguire il rendering della grafica in modo che appaia all'utente del visore per essere bloccato in modo solido nell'ambiente. Il rilevamento viene in genere ottenuto combinando le pose calcolate usando fotocamere e misurazioni dall'unità di misura inerziale (IMU). Questo metodo funziona correttamente quando l'ambiente si trova nel frame inerziale di riferimento. Gli effetti di piccole dimensioni, come il movimento planetario, vengono in genere trascurati.

Quando l'ambiente non è nel frame di riferimento inerziale, il normale sistema di rilevamento della testa avrà esito negativo. La funzionalità Modalità piattaforma mobile risolve questo problema in base al movimento dell'ambiente rispetto al frame inerziale. Pertanto, in modalità piattaforma mobile, HoloLens 2 possibile eseguire il rendering di ologrammi che appaiono fissi nell'ambiente, anche se l'ambiente è una nave di lurching.

Come attivare la modalità piattaforma mobile?

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

Who sa se HL2 è in una piattaforma in movimento Metodo migliore per impostare la modalità piattaforma mobile 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 app L'utente è spesso il più esperto su quando e dove usa il dispositivo. Qualsiasi app funzionerà senza modifiche. L'utente potrebbe non sapere che la modalità esiste.
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 ottimale può offrire un'esperienza molto negativa e lasciare il dispositivo in una 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à e continuare a rispettare tale scelta per il runtime dell'app
Fornire un avviso all'utente Evitare di modificare la modalità immediatamente all'avvio/ripresa dell'app. Ciò presenta un'esperienza utente scadente, perché l'utente potrebbe non sapere perché il dispositivo sta perdendo 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 fermo a uno in movimento o viceversa.
In caso di incertezze sull'ambiente, usare la modalità piattaforma mobile La modalità piattaforma mobile può funzionare sia in ambienti stazionari che in quelli in movimento. Gli algoritmi di rilevamento regolari funzionano solo in ambienti stazionari, quindi se non si è incerti sul fatto che l'ambiente sia in movimento, la scelta della modalità piattaforma mobile può essere la scelta più sicura.
Non usare la modalità piattaforma mobile in ambienti stazionari noti Lo spostamento della modalità piattaforma offre prestazioni inferiori rispetto alla modalità standard negli ambienti stazionari. Si tratta di una riduzione ridotta, anche se sarà evidente per la maggior parte degli utenti.
Prendere in considerazione 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 sarà su una piattaforma in movimento 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 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 in cui non è disponibile la modalità piattaforma mobile, ad esempio i dispositivi VR e HoloLens 1, restituiranno sempre "Standard".

Impostazione della modalità

È possibile impostare il valore Moving Platform Mode come segue:

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

TrySetMode restituirà true se la modalità del 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 alla modifica della modalità

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à è impostabile

A volte è utile sapere se la modalità è impostabile prima di tentare di modificarla. Ad esempio, se si desidera sapere se c'è un valore nel chiedere all'utente le proprie preferenze. È possibile verificare se la modalità di spostamento della piattaforma è impostabile con la funzione IsSetModeSupported:

bool supported = m_movingPlatformManager.IsSetModeSupported();

Questa funzione restituirà true se il dispositivo può cambiare modalità e false se non è possibile. Questa funzione include i criteri di Gestione dispositivi mobili (MDM). Ad esempio, se MDM forza MovingPlatformMode su "On", questa funzione restituirà false.

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