Platformmodus verplaatsen in Unity

Met de modus Platform verplaatsen kunnen HoloLens 2 correct werken op bewegende platforms, zoals schepen, olieplatforms en andere voertuigen.

Meer informatie over het verplaatsen van platformmodus

Conceptueel overzicht

Mixed Reality-systemen werken alleen correct als de headset ten opzichte van de omgeving wordt bijgehouden. Met deze relatieve tracering kunnen de afbeeldingen zodanig worden weergegeven dat ze voor de gebruiker van de headset stevig lijken te zijn vergrendeld in de omgeving. Tracering wordt meestal bereikt door poses te combineren die worden berekend met behulp van naar buiten gerichte camera's en metingen van de Inertial Measurement Unit (IMU). Deze methode werkt goed wanneer de omgeving zich in het traagheidskader van verwijzing bevindt. Kleine effecten, zoals planetaire beweging, worden meestal genegeerd.

Wanneer de omgeving zich niet in het inertiële referentiekader bevindt, mislukt het normale systeem voor hoofdtracering. De functie Moving Platform Mode lost dit probleem op door rekening te brengen met de beweging van de omgeving ten opzichte van het traagheidsframe. In de modus Bewegend platform kunnen HoloLens 2 dus hologrammen weergeven die vast lijken te staan aan de omgeving, zelfs als de omgeving een lurching ship is!

Hoe moet ik de modus Moving Platform activeren?

Om een reeks gebruiksvoorbeelden mogelijk te maken, zijn er verschillende methoden beschikbaar om de modus Moving Platform te activeren. Het is belangrijk dat u zorgvuldig bedenkt welke methode u moet kiezen. Een belangrijke vraag is: Wie weet of de HoloLens 2 zich momenteel binnen een bewegend platform bevindt? Zie de volgende tabel voor een voorbeeld:

Wie weet of HL2 zich in een bewegend platform bevindt Beste methode voor het instellen van de modus Moving Platform Voordelen Kosten
Systeembeheerder Beheer van mobiele apparaten De gebruiker hoeft niet betrokken te zijn. Elke app werkt zonder wijziging. Het apparaat kan worden beschermd tegen het inschakelen van de onjuiste modus. Gebruiker en apps kunnen de modus niet wijzigen.
Eindgebruiker De app Instellingen De gebruiker is vaak het meest op de hoogte van wanneer en waar ze het apparaat gebruiken. Elke app werkt zonder wijziging. De gebruiker weet mogelijk niet dat de modus bestaat.
De toepassing Gebruik de SDK die in dit artikel wordt beschreven. Gebruiksvoorbeeldspecifieke aanwijzingen kunnen worden gebruikt om de modus te wisselen wanneer de omgeving niet van tevoren bekend kan zijn. Hiermee verwijdert u de vereiste die een gebruiker heeft om deze beslissing te nemen en de modus in de instellingen te wijzigen. Een slecht ontworpen app kan een zeer slechte ervaring geven en het apparaat in een onverwachte modus laten staan.

Aanbevolen procedures voor het verplaatsen van de platformmodus

Principal Beschrijving
Respecteer de keuze van de gebruiker U moet de gebruiker de keuze bieden voordat u de modus voor hen wijzigt en u moet die keuze blijven respecteren voor de runtime van de app
Een waarschuwing geven aan de gebruiker Voorkom dat de modus onmiddellijk wordt gewijzigd bij het starten/hervatten van de app. Dit levert een slechte gebruikerservaring op, omdat de gebruiker mogelijk niet weet waarom het apparaat de tracering verliest.
Wijzigingsmodus minimaliseren Bij het wijzigen van de instellingen voor de modus Voor bewegend platform verliest het apparaat tracering, wat een negatieve gebruikerservaring veroorzaakt. Het is daarom raadzaam om de frequentie waarmee u de modus wijzigt, te minimaliseren. Idealiter zou de modus alleen worden gewijzigd als het apparaat overstapt van een stationaire omgeving naar een bewegende omgeving, of omgekeerd.
Als u niet zeker bent van de omgeving, gebruikt u de modus Moving Platform Het verplaatsen van platformmodus kan zowel in stationaire als in bewegende omgevingen worden gebruikt. De reguliere traceringsalgoritmen werken alleen in stationaire omgevingen, dus als u niet zeker weet of de omgeving wordt verplaatst, is het kiezen van de modus Platform verplaatsen de veiligere keuze.
Gebruik de modus Bewegend platform niet in bekende stationaire omgevingen De bewegende platformmodus presteert minder goed dan de standaardmodus in stationaire omgevingen. Dit is een kleine afname, maar zal merkbaar zijn voor de meeste gebruikers.
Overweeg in welke modus het apparaat moet worden achtergelaten Met deze SDK kunnen ontwikkelaars ervaringen ontwerpen die robuust zijn tijdens het opstarten van het apparaat. Overweeg of het apparaat zich de volgende keer op een bewegend platform bevindt wanneer het wordt opgestart en laat het apparaat in de juiste modus staan.

Waar kan ik de SDK downloaden?

De Moving Platform SDK ondersteunt taalprojecties voor C# en C++, zodat ontwikkelaars toepassingen kunnen ontwikkelen voor Win32- of UWP-platforms. Download en installeer de SDK met het Mixed Reality Feature Tool.

Hoe kan ik deze SDK gebruiken

Nadat u de SDK hebt geïnstalleerd, kunt u het script als volgt instellen voor het gebruik van MovingPlatformManger:

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

De huidige modus lezen

De huidige waarde van de modus kan als volgt worden gelezen:

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

MovingPlatformMode is een opsomming die als volgt wordt gedefinieerd:

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

Apparaten waarvoor geen Moving Platform Mode beschikbaar is, zoals VR-apparaten en HoloLens 1, retourneren altijd 'Standard'.

De modus instellen

U kunt de waarde moving platform mode als volgt instellen:

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

TrySetMode retourneert true als de apparaatmodus nu overeenkomt met de aangevraagde modus. Als de modus al de gewenste status heeft, wordt er niets gedaan en verliest het apparaat de tracering niet.

Terugbellen bij moduswijziging

Soms kan het handig zijn om te weten of een andere app, of de gebruiker, de waarde voor de modus Voor bewegend platform heeft gewijzigd. U kunt dit als volgt doen.

// 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
    }
}

Controleren of de modus is ingesteld

Soms is het handig om te weten of de modus is ingesteld voordat u deze probeert te wijzigen. Als u bijvoorbeeld wilt weten of het een waarde heeft om de gebruiker zijn of haar voorkeur te vragen. U kunt zien of de modus voor het verplaatsen van het platform kan worden ingesteld met de functie IsSetModeSupported:

bool supported = m_movingPlatformManager.IsSetModeSupported();

Deze functie retourneert true als het apparaat modi kan wijzigen en false als dat niet mogelijk is. Deze functie houdt wel rekening met MDM-beleid (Mobile Apparaatbeheer). Als MDM bijvoorbeeld de MovingPlatformMode dwingt op 'Aan', retourneert deze functie false.

Een demoscript

In dit script worden alle belangrijke elementen van de SDK op één plaats weergegeven. Het voorbeeld volgt niet de aanbevolen procedures die hierboven worden weergegeven.

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;
    }
}

Zie ook