Verschieben des Plattformmodus in Unity

Mit dem Modus "Plattform verschieben" können HoloLens 2 auf sich bewegenden Plattformen wie z. B. See- und Ölplattformen und anderen Fahrzeugen ordnungsgemäß arbeiten.

Weitere Informationen zum Verschieben des Plattformmodus

Konzeptionelle Übersicht

Damit Mixed Reality-Systeme ordnungsgemäß funktionieren, muss das Headset relativ zur Umgebung nachverfolgt werden. Mit dieser relativen Nachverfolgung können die Grafiken so gerendert werden, dass sie dem Benutzer des Headsets so erscheinen, dass sie in der Umgebung fest gesperrt sind. Die Nachverfolgung wird in der Regel erreicht, indem Posen kombiniert werden, die mit nach außen gerichteten Kameras und Messungen der Imertial Measurement Unit (IMU) berechnet werden. Diese Methode funktioniert gut, wenn sich die Umgebung im Trägheitsrahmen des Verweises befindet. Kleine Effekte, wie z.B. die verzäumliche Bewegung, werden in der Regel nicht beachtet.

Wenn sich die Umgebung nicht im trägen Bezugsrahmen befindet, schlägt das normale System für die Überwachung des Kopfes fehl. Das Feature "Moving Platform Mode" löst dieses Problem, indem die Bewegung der Umgebung relativ zum Trägheitsrahmen in Rechnung gestellt wird. Daher können HoloLens 2 im Moving Platform-Modus Hologramme rendern, die für die Umgebung fixiert erscheinen, auch wenn es sich bei der Umgebung um ein verlockendes Boot handelt!

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 bieten, bevor Sie den Modus für sie ändern, und Sie sollten diese Auswahl weiterhin für die Laufzeit der App berücksichtigen.
Bereitstellen einer Warnung für den Benutzer Vermeiden Sie es, den Modus beim Starten/Fortsetzen der App sofort zu ändern. Dies stellt eine schlechte Benutzererfahrung dar, da der Benutzer möglicherweise nicht weiß, warum das Gerät die Nachverfolgung verliert.
Minimieren des Änderungsmodus Beim Ändern der Einstellungen für den Moving Platform Mode 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 ändern. Im Idealfall würde der Modus nur geändert, wenn das Gerät von einer ortsbeweglichen Umgebung in eine sich bewegende Umgebung übergeht oder umgekehrt.
Wenn Sie unsicher sind, ob die Umgebung unsicher ist, verwenden Sie den Modus "Plattform verschieben". Der Moving Platform-Modus kann sowohl in ortsbeweglichen umgebungen als auch in verschiebenden Umgebungen funktionieren. Die regulären Nachverfolgungsalgorithmen funktionieren nur in ortsbeweglichen Umgebungen. Wenn Sie also unsicher sind, ob die Umgebung verschoben wird, kann die Auswahl des Moving Platform Mode (Plattformmodus verschieben) die sicherere Wahl sein.
Verwenden Sie den Moving Platform-Modus nicht in bekannten ortsbeweglichen Umgebungen. Der Moving Platform Mode ist in stationären Umgebungen weniger gut als der Standardmodus. Dies ist eine geringfügige Verschlechterung, wird jedoch für die meisten Benutzer spürbar sein.
Überlegen Sie, in welchem Modus das Gerät verlassen werden soll. Mit diesem SDK können Entwickler Benutzererlebnisse entwerfen, die beim Start des Geräts stabil sind. Überlegen Sie, ob sich das Gerät beim nächsten Start auf einer sich bewegenden Plattform befindet, und belassen 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 wie folgt für die Verwendung von MovingPlatformManger 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 Moving Platform-Modus 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 Moving Platform Mode 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 für den Moving Platform Mode 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, der den Benutzer nach seinen Vorlieben fragt. Sie können ermitteln, ob der Moving Platform-Modus mit der IsSetModeSupported-Funktion festgelegt 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 Mdm-Richtlinien (Mobile Geräteverwaltung). Wenn MDM beispielsweise den MovingPlatformMode auf "On" erzwingt, gibt diese Funktion FALSE zurück.

Ein Demoskript

Dieses Skript zeigt alle wichtigen Elemente des SDK an einem Ort. 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;
    }
}

Siehe auch