Verschieben des Plattformmodus in Unity

Der Modus "Plattform verschieben" ermöglicht es HoloLens 2, auf sich bewegenden Plattformen wie Schiffen, Ölplattformen und anderen Fahrzeugen ordnungsgemäß zu arbeiten.

Weitere Informationen zum Verschieben des Plattformmodus

Konzeptionelle Übersicht

Damit Mixed Reality-Systeme ordnungsgemäß funktionieren, muss das Headset relativ zur Umgebung nachverfolgt werden. Durch diese relative Nachverfolgung können die Grafiken so gerendert werden, dass sie dem Benutzer des Headsets so erscheinen, dass sie fest in der Umgebung gesperrt sind. Die Nachverfolgung erfolgt in der Regel durch Kombination von Posen, die mit nach außen gerichteten Kameras berechnet werden, und Messungen der Inertial Measurement Unit (IMU). Diese Methode funktioniert gut, wenn sich die Umgebung im Trägheitsrahmen befindet. Kleine Effekte, wie planetenische Bewegungen, werden in der Regel vernachlässigt.

Wenn sich die Umgebung nicht im Trägheitsrahmen befindet, schlägt das normale Headtracking-System fehl. Das Feature "Plattformmodus bewegen" löst dieses Problem, indem die Bewegung der Umgebung relativ zum Trägheitsrahmen berücksichtigt wird. Daher können HoloLens 2 im Modus "Verschieben der Plattform" Hologramme rendern, die in der Umgebung fixiert erscheinen, auch wenn die Umgebung ein lockendes Schiff ist!

Wie aktiviere ich den Modus für bewegliche Plattformen?

Zur Unterstützung einer Reihe von Anwendungsfällen wurden verschiedene Methoden bereitgestellt, um den Modus für bewegliche Plattformen zu aktivieren. Es ist wichtig, dass Sie sorgfältig überlegen, welche Methode Sie wählen. Eine Schlüsselfrage ist: Wer weiß, ob HoloLens 2 sich derzeit auf einer beweglichen Plattform befindet? Ein Beispiel finden Sie in der folgenden Tabelle:

Wer weiß, ob HL2 sich auf einer beweglichen Plattform befindet Beste Methode zum Festlegen des Modus für bewegliche Plattformen Vorteile Kosten
Systemadministrator Mobile Geräteverwaltung Der Benutzer muss nicht beteiligt sein. Jede App funktioniert ohne Änderungen. Das Gerät kann vor dem Wechseln in den falschen Modus geschützt werden. Benutzer und Apps können den Modus nicht ändern.
Endbenutzer Die Einstellungen-App Der Benutzer weiß oftmals am besten, wann und wo er das Gerät verwendet. Jede App funktioniert ohne Änderungen. Der Benutzer weiß möglicherweise nicht, dass es den Modus gibt.
Die Anwendung Verwenden Sie das in diesem Artikel beschriebene SDK. Fallspezifische Hinweise können zum Moduswechsel verwendet werden, wenn vorab keine Informationen über die Umgebung verfügbar sind. Damit entfällt die Anforderung, dass ein Benutzer diese Entscheidung treffen und den Modus in den Einstellungen ändern muss. Eine schlecht entworfene App kann ein sehr schlechtes Benutzererlebnis bieten und das Gerät in einem unerwarteten Modus belassen.

Bewährte Methoden für das Verschieben des Plattformmodus

Prinzipal BESCHREIBUNG
Berücksichtigen der Benutzerauswahl Sie sollten dem Benutzer die Auswahl anbieten, bevor Sie den Modus für sie ändern, und Sie sollten diese Wahl weiterhin für die Laufzeit der App berücksichtigen.
Bereitstellen einer Warnung für den Benutzer Vermeiden Sie den Wechsel des Modus sofort beim Start/Fortsetzen der App. Dies stellt eine schlechte Benutzererfahrung dar, da der Benutzer möglicherweise nicht weiß, warum das Gerät die Nachverfolgung verliert.
Minimieren des Veränderungsmodus Beim Ändern der Einstellungen für den Verschieben des Plattformmodus verliert das Gerät die Nachverfolgung, was zu einer negativen Benutzererfahrung führt. Es wird daher empfohlen, die Häufigkeit zu minimieren, mit der Sie den Modus wechseln. Im Idealfall wird der Modus nur geändert, wenn das Gerät von einer stationären Umgebung zu einer sich bewegenden umgebung wechselt oder umgekehrt.
Wenn Sie sich hinsichtlich der Umgebung nicht sicher sind, verwenden Sie den Modus "Plattform verschieben" Der Modus der sich bewegenden Plattform kann sowohl in stationären als auch in sich bewegenden Umgebungen funktionieren. Die regulären Nachverfolgungsalgorithmen funktionieren nur in stationären Umgebungen. Wenn Sie also unsicher sind, ob sich die Umgebung bewegt, kann die Auswahl des Plattformmodus verschieben die sicherere Wahl sein.
Verwenden Sie den Modus "Plattform verschieben" nicht in bekannten stationären Umgebungen. Der Modus der sich bewegenden Plattform funktioniert in stationären Umgebungen weniger gut als der Standardmodus. Dies ist eine kleine Beeinträchtigung, die sich jedoch für die meisten Benutzer bemerkbar machen wird.
Überlegen, in welchem Modus das Gerät belassen werden soll Mit diesem SDK können Entwickler Umgebungen entwerfen, die beim Start des Geräts robust sind. Überlegen Sie, ob sich das Gerät beim nächsten Start auf einer beweglichen Plattform befindet, und lassen Sie das Gerät im entsprechenden Modus.

Wo erhalte ich das SDK?

Das Moving Platform SDK unterstützt Sprachprojektionen für C# und C++, sodass Entwickler Anwendungen für Win32- oder UWP-Plattformen entwickeln können. Laden Sie das SDK mit dem Mixed Reality Feature Tool herunter, und installieren Sie es.

Gewusst wie dieses SDK verwenden

Nach der Installation des SDK können Sie Ihr Skript für die Verwendung von MovingPlatformManger wie folgt einrichten:

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

Lesen des aktuellen Modus

Der aktuelle Wert des Modus kann wie folgt gelesen werden:

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

MovingPlatformMode ist eine Enumeration, die wie folgt definiert ist:

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

Geräte, für die der Modus "Sich bewegende Plattform" nicht verfügbar ist, z. B. VR-Geräte und HoloLens 1, geben immer "Standard" zurück.

Festlegen des Modus

Sie können den Wert für den gleitenden Plattformmodus wie folgt festlegen:

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

TrySetMode gibt true zurück, wenn der Gerätemodus jetzt mit dem angeforderten Modus übereinstimmt. Wenn sich der Modus bereits im gewünschten Zustand befindet, wird nichts ausgeführt, und das Gerät verliert die Nachverfolgung nicht.

Rückruf bei Modusänderung

Manchmal kann es hilfreich sein, zu wissen, ob eine andere App oder der Benutzer den Wert des Modus für die verschobene Plattform geändert hat. Sie können dies wie folgt tun.

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

Überprüfen, ob der Modus festgelegt werden kann

Manchmal ist es hilfreich zu wissen, ob der Modus festgelegt werden kann, bevor Sie versuchen, ihn zu ändern. Wenn Sie z. B. wissen möchten, ob es einen Wert gibt, den Benutzer nach seiner Präferenz zu fragen. Mit der Funktion IsSetModeSupported können Sie ermitteln, ob der Plattformmodus verschoben werden kann:

bool supported = m_movingPlatformManager.IsSetModeSupported();

Diese Funktion gibt true zurück, wenn das Gerät den Modus ändern kann, und false, wenn dies nicht möglich ist. Diese Funktion berücksichtigt Richtlinien für mobile Geräteverwaltung (MDM). Wenn mdm beispielsweise erzwingt, dass MovingPlatformMode auf "Ein" festgelegt wird, gibt diese Funktion false zurück.

Ein Demoskript

Dieses Skript zeigt alle wichtigen Elemente des SDK an einem Ort an. Das Beispiel folgt nicht den oben gezeigten bewährten Methoden.

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

Weitere Informationen