Dela via


Flytta plattformsläge i Unity

När plattformsläget flyttas kan HoloLens 2 fungera korrekt på rörliga plattformar som fartyg, oljeplattformar och andra fordon.

Läs mer om att flytta plattformsläge

Konceptuell översikt

För att mixed reality-system ska fungera korrekt måste headsetet spåras i förhållande till miljön. Med den här relativa spårningen kan grafiken återges så att användaren av headsetet ser ut att vara fastlåst i miljön. Spårning uppnås vanligtvis genom att kombinera poser som beräknas med hjälp av utåtriktade kameror och mätningar från den inertiella måttenheten (IMU). Den här metoden fungerar bra när miljön är i den inertiella referensramen. Små effekter, som planetariska rörelser, försummas vanligtvis.

När miljön inte finns i referensramen misslyckas det normala huvudspårningssystemet. Funktionen Flytta plattformsläge löser det här problemet genom att ta hänsyn till miljöns rörelse i förhållande till den inertiella ramen. När du flyttar plattformsläget kan HoloLens 2 alltså återge hologram som verkar fasta i miljön, även om miljön är ett lurching-skepp!

Hur ska jag aktivera läget Flytta plattform?

För att möjliggöra en rad olika användningsfall har olika metoder tillhandahållits för att aktivera läget Flytta plattform. Det är viktigt att du noga överväger vilken metod du ska välja. En viktig fråga att ställa är: Vem vet om HoloLens 2 för närvarande är inom en plattform i rörelse? Se följande tabell för ett exempel:

Vem vet om HL2 är i en rörlig plattform Bästa metoden för att ställa in läget Flytta plattform Fördelar Kostnader
Systemadministratör Hantering av mobila enheter Användaren behöver inte vara inblandad. Alla appar fungerar utan ändringar. Enheten kan skyddas från att gå in i fel läge. Användare och appar kan inte ändra läget.
Slutanvändare Inställningsappen Användaren är ofta den mest kunniga om när och var de använder enheten. Alla appar fungerar utan ändringar. Användaren kanske inte vet att läget finns.
Programmet Använd SDK:et som beskrivs i den här artikeln. Användningsfallsspecifika tips kan användas för att växla läget när miljön inte kan vara känd i förväg. Tar bort kravet på att en användare måste fatta det här beslutet och ändra läget i inställningarna. En dåligt utformad app kan ge en mycket dålig upplevelse och lämna enheten i ett oväntat läge.

Metodtips för att flytta plattformsläge

Huvudkonto Description
Respektera användarens val Du bör erbjuda användaren valet innan du ändrar läget för dem, och du bör fortsätta att respektera det valet för appens körning
Ange en varning till användaren Undvik att ändra läget omedelbart när appen startas/återupptas. Detta ger en dålig användarupplevelse eftersom användaren kanske inte vet varför enheten förlorar spårning.
Minimera ändringsläge När du ändrar inställningarna för läget Flytta plattform förlorar enheten spårningen, vilket orsakar en negativ användarupplevelse. Vi rekommenderar därför att du minimerar hur ofta du ändrar läget. Helst skulle läget bara ändras om enheten övergår från en stationär miljö till en rörlig miljö, eller tvärtom.
Om det är osäkert om miljön ska du använda Flytta plattformsläge Att flytta plattformsläge kan fungera både i stationära miljöer och i flyttmiljöer. De vanliga spårningsalgoritmerna fungerar bara i stationära miljöer, så om du är osäker på om miljön rör sig kan det vara säkrare att välja Flytta plattformsläge.
Använd inte läget Flytta plattform i kända stationära miljöer Att flytta plattformsläge fungerar mindre bra än standardläget i stationära miljöer. Detta är en liten försämring, men kommer att vara märkbar för de flesta användare.
Överväg vilket läge du vill lämna enheten i Med den här SDK:n kan utvecklare utforma funktioner som är robusta vid start av enheten. Överväg om enheten kommer att finnas på en plattform i rörelse nästa gång den startas och lämna enheten i lämpligt läge.

Var hämtar jag SDK:t?

Moving Platform SDK stöder språkprojektioner för C# och C++, vilket gör det möjligt för utvecklare att utveckla program för Win32- eller UWP-plattformar. Ladda ned och installera SDK:et med Mixed Reality funktionsverktyget.

Hur gör jag för att använda denna SDK

När du har installerat SDK:t kan du konfigurera skriptet så att MovingPlatformManger används på följande sätt:

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

Läsa det aktuella läget

Det aktuella värdet för läget kan läsas på följande sätt:

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

MovingPlatformMode är ett uppräkning som definieras på följande sätt:

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

Enheter som inte har flyttplattformsläge tillgängligt, till exempel VR-enheter och HoloLens 1, returnerar alltid "Standard".

Ange läget

Du kan ange värdet flytta plattformsläge på följande sätt:

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

TrySetMode returnerar true om enhetsläget nu matchar det begärda läget. Om läget redan är i önskat tillstånd görs ingenting och enheten förlorar inte spårningen.

Ändring av återanrop i läge

Ibland kan det vara bra att veta om en annan app, eller användaren, har ändrat värdet för flyttplattformsläge. Du kan göra detta på följande sätt.

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

Kontrollera om läget kan anges

Ibland är det bra att veta om läget kan ställas in innan du försöker ändra det. Om du till exempel vill veta om det finns något värde i att fråga användaren om deras önskemål. Du kan se om det går att använda funktionen IsSetModeSupported för att flytta plattformsläget:

bool supported = m_movingPlatformManager.IsSetModeSupported();

Den här funktionen returnerar sant om enheten kan ändra lägen och falskt om det inte är möjligt. Den här funktionen tar hänsyn till MDM-principer (Mobile Enhetshantering). Om MDM till exempel tvingar MovingPlatformMode till "På" returnerar den här funktionen falskt.

Ett demoskript

Det här skriptet visar alla viktiga element i SDK:et på ett och samma ställe. Exemplet följer inte de metodtips som visas ovan.

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

Se även