Udostępnij za pośrednictwem


Przenoszenie trybu platformy w a unity

Tryb platformy ruchomej pozwala HoloLens 2 działać prawidłowo na platformach ruchomych, takich jak statki, platformy naftowe i inne pojazdy.

Dowiedz się więcej na temat przenoszenia trybu platformy

Omówienie pojęć

Aby systemy rzeczywistości mieszanej działały prawidłowo, zestaw słuchawkowy musi być śledzony względem środowiska. To śledzenie względne umożliwia renderowanie grafiki w taki sposób, że wydaje się, że użytkownik zestawu nagłownego jest mocno zablokowany w środowisku. Śledzenie jest zwykle osiągane przez połączenie poz, które są obliczane przy użyciu kamer patrzących na zewnątrz i pomiarów z inertial measurement Unit (IMU). Ta metoda działa dobrze, gdy środowisko znajduje się w ramki inertial odwołania. Małe efekty, takie jak ruch planetarny, są zwykle zaniedbane.

Jeśli środowisko nie znajduje się w ramki inertyjnej odwołania, normalny system śledzenia głowy zakończy się niepowodzeniem. Funkcja Tryb platformy ruchomej rozwiązuje ten problem, uwzględniając ruch środowiska względem ramki inertnej. W związku z tym w trybie przenoszenia platformy HoloLens 2 może renderować hologramy, które wydają się być stałe w środowisku, nawet jeśli środowisko jest kołysającym się statkiem!

Jak aktywować przenoszenie trybu platformy?

Aby włączyć szereg przypadków użycia, udostępniono różne metody aktywowania trybu ruchomej platformy. Ważne jest, aby dokładnie rozważyć, którą metodę wybrać. Najważniejsze pytanie brzmi: Kto wie, czy HoloLens 2 znajduje się obecnie na platformie ruchomej? Przykład można znaleźć w poniższej tabeli:

Kto wie, czy HL2 znajduje się na platformie ruchomej Najlepsza metoda ustawiania trybu ruchomej platformy Korzyści Koszty
Administrator systemu Zarządzanie urządzeniami przenośnymi Użytkownik nie musi być zaangażowany. Każda aplikacja będzie działać bez modyfikacji. Urządzenie może być chronione przed wprowadzeniem nieprawidłowego trybu. Użytkownik i aplikacje nie mogą zmienić trybu.
Użytkownik końcowy Aplikacja Ustawienia Użytkownik jest często najbardziej kompetentny na temat tego, kiedy i gdzie korzysta z urządzenia. Każda aplikacja będzie działać bez modyfikacji. Użytkownik może nie wiedzieć, że istnieje tryb.
Aplikacja Użyj zestawu SDK opisanego w tym artykule. Sygnały specyficzne dla przypadku użycia mogą służyć do zamiany trybu, gdy środowisko nie może być znane z wyprzedzeniem. Usuwa wymaganie, aby użytkownik musiał podjąć tę decyzję i zmienić tryb w ustawieniach. Źle zaprojektowana aplikacja może zapewnić bardzo złe środowisko i pozostawić urządzenie w nieoczekiwanym trybie.

Najlepsze rozwiązania dotyczące przenoszenia trybu platformy

Główne Opis
Szanuj wybór użytkownika Należy zaoferować użytkownikowi wybór przed zmianą trybu dla nich i należy nadal przestrzegać tego wyboru dla środowiska uruchomieniowego aplikacji
Podaj ostrzeżenie dla użytkownika Unikaj natychmiastowego zmieniania trybu przy uruchamianiu/wznawianiu działania aplikacji. Jest to słabe środowisko użytkownika, ponieważ użytkownik może nie wiedzieć, dlaczego urządzenie traci śledzenie.
Minimalizuj tryb zmiany Podczas zmiany ustawień trybu przenoszenia platformy urządzenie utraci śledzenie, co powoduje negatywne środowisko użytkownika. W związku z tym zaleca się zminimalizowanie częstotliwości zmiany trybu. W idealnym przypadku tryb zostanie zmieniony tylko wtedy, gdy urządzenie przechodzi ze środowiska stacjonarnego do ruchomego lub odwrotnie.
Jeśli nie masz pewności co do środowiska, użyj trybu ruchomej platformy Tryb platformy ruchomej może działać zarówno w środowiskach stacjonarnych, jak i ruchomych. Zwykłe algorytmy śledzenia działają tylko w środowiskach stacjonarnych, więc jeśli nie masz pewności, czy środowisko jest przenoszone, wybranie trybu ruchomej platformy może być bezpieczniejszym wyborem.
Nie używaj trybu ruchomej platformy w znanych środowiskach stacjonarnych Przenoszenie trybu platformy działa mniej dobrze niż tryb standardowy w środowiskach stacjonarnych. Jest to niewielkie pogorszenie, choć będzie zauważalne dla większości użytkowników.
Zastanów się, w jakim trybie należy opuścić urządzenie Ten zestaw SDK umożliwia deweloperom projektowanie środowisk niezawodnych podczas rozruchu urządzenia. Rozważ, czy urządzenie będzie na platformie ruchomej przy następnym uruchomieniu i pozostaw urządzenie w odpowiednim trybie.

Gdzie mogę uzyskać zestaw SDK?

Zestaw SDK platformy ruchomej obsługuje projekcje językowe dla języków C# i C++, umożliwiając deweloperom tworzenie aplikacji dla platform Win32 lub UWP. Pobierz i zainstaluj zestaw SDK za pomocą narzędzia Mixed Reality Feature Tool.

Jak mogę używać tego zestawu SDK

Po zainstalowaniu zestawu SDK możesz skonfigurować skrypt do używania narzędzia MovingPlatformManger w następujący sposób:

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

Odczytywanie bieżącego trybu

Bieżąca wartość trybu można odczytać w następujący sposób:

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

MovingPlatformMode to wyliczenie zdefiniowane w następujący sposób:

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

Urządzenia, które nie mają dostępnego trybu ruchomej platformy, takich jak urządzenia VR i HoloLens 1, zawsze będą zwracać wartość "Standardowa".

Ustawianie trybu

Możesz ustawić wartość Tryb platformy ruchomej w następujący sposób:

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

Funkcja TrySetMode zwróci wartość true, jeśli tryb urządzenia jest teraz zgodny z żądanym trybem. Jeśli tryb jest już w żądanym stanie, nic nie zostanie zrobione, a urządzenie nie utraci śledzenia.

Wywołanie zwrotne przy zmianie trybu

Czasami warto wiedzieć, czy inna aplikacja lub użytkownik zmienił wartość Tryb platformy ruchomej. Można to zrobić w następujący sposób.

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

Sprawdzanie, czy tryb jest ustawiony

Czasami warto wiedzieć, czy tryb jest ustawiany przed próbą jego zmiany. Jeśli na przykład chcesz dowiedzieć się, czy istnieje jakakolwiek wartość w pytaniu użytkownika o ich preferencje. Jeśli tryb przenoszenia platformy można ustawić za pomocą funkcji IsSetModeSupported:

bool supported = m_movingPlatformManager.IsSetModeSupported();

Ta funkcja zwróci wartość true, jeśli urządzenie może zmienić tryby i wartość false, jeśli nie jest to możliwe. Ta funkcja uwzględnia zasady usługi Mobile Zarządzanie urządzeniami (MDM). Jeśli na przykład rozwiązanie MDM wymusza użycie metody MovingPlatformMode na wartość "Włączone", ta funkcja zwróci wartość false.

Skrypt demonstracyjny

Ten skrypt przedstawia wszystkie ważne elementy zestawu SDK w jednym miejscu. W przykładzie nie są przestrzegane najlepsze rozwiązania przedstawione powyżej.

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

Zobacz też