Režim přesunu platformy v Unity
Režim pohyblivé plošiny umožňuje HoloLens 2 správně pracovat na pohyblivých platformách, jako jsou lodě, ropné plošiny a další vozidla.
Další informace o režimu přesunu platformy
Koncepční přehled
Aby systémy hybridní reality fungovaly správně, musí být náhlavní souprava sledována vzhledem k prostředí. Toto relativní sledování umožňuje vykreslení grafiky tak, aby se uživateli náhlavní soupravy zdály být pevně uzamčeny v prostředí. Sledování se obvykle dosahuje kombinací póz, které se počítají pomocí fotoaparátů s pohledem ven, a měření z inerciálních měřicích jednotek (IMU). Tato metoda funguje dobře, pokud je prostředí v inerciálním rámci odkazu. Malé efekty, jako je planetární pohyb, jsou obvykle opomíjeny.
Pokud prostředí není v inerciálním referenčním rámci, normální systém sledování hlav selže. Funkce Režim přesouvání platformy řeší tento problém tím, že započítáváním pohybu prostředí vzhledem k inerciálnímu rámci. Proto v režimu moving platform mohou HoloLens 2 vykreslovat hologramy, které jsou pro prostředí pevně dané, i když se jedná o houževnou loď!
Jak mám aktivovat režim pohyblivé platformy?
Aby bylo možné povolit celou řadu případů použití, byly k aktivaci režimu moving platform k dispozici různé metody. Je důležité pečlivě zvážit, kterou metodu zvolit. Klíčovou otázkou, kterou si je třeba položit, je: Kdo ví, jestli je HoloLens 2 aktuálně v rámci pohyblivé platformy? Příklad najdete v následující tabulce:
Kdo ví, jestli je HL2 v pohyblivé platformě | Nejlepší způsob nastavení režimu moving platform | Výhody | Náklady |
---|---|---|---|
Správce systému | Správa mobilních zařízení | Uživatel se do toho nemusí zapojit. Každá aplikace bude fungovat bez úprav. Zařízení může být chráněno před vstupem do nesprávného režimu. | Uživatelé a aplikace nemůžou režim změnit. |
Koncový uživatel | Aplikace Nastavení | Uživatel má často největší znalosti o tom, kdy a kde zařízení používá. Každá aplikace bude fungovat bez úprav. | Uživatel nemusí vědět, že režim existuje. |
Aplikace | Použijte sadu SDK popsanou v tomto článku. | Upozornění specifická pro případ použití se dají použít k přepnutí režimu, když prostředí není možné předem zjistit. Odebere požadavek, aby uživatel udělal toto rozhodnutí a změnil režim v nastavení. | Špatně navržená aplikace může poskytovat velmi špatné prostředí a zařízení ponechat v neočekávaném režimu. |
Osvědčené postupy pro režim přesunu platformy
Objekt zabezpečení | Popis |
---|---|
Respektovat volbu uživatele | Před změnou režimu byste měli uživateli nabídnout volbu a tuto volbu byste měli i nadále respektovat pro modul runtime aplikace. |
Poskytněte uživateli upozornění. | Vyhněte se okamžité změně režimu při spuštění/obnovení aplikace. To představuje špatné uživatelské prostředí, protože uživatel nemusí vědět, proč zařízení ztrácí sledování. |
Minimalizace režimu změny | Při změně nastavení režimu přesouvání platformy zařízení ztratí sledování, což způsobí negativní uživatelské zkušenosti. Proto doporučujeme minimalizovat frekvenci, s jakou režim měníte. V ideálním případě by se režim změnil pouze v případě, že zařízení přechází ze statického prostředí do pohyblivého prostředí nebo naopak. |
Pokud si nejste jistí prostředím, použijte režim moving platform | Režim přesouvání platformy může fungovat jak ve statických prostředích, tak i ve stěhovacích prostředích. Běžné algoritmy sledování fungují jenom ve statických prostředích, takže pokud si nejste jistí, jestli se prostředí pohybuje, může být bezpečnější volbou možnost Režim přesunutí platformy. |
Nepoužívejte režim pohyblivé platformy ve známých statických prostředích | Režim přesunutí platformy funguje méně dobře než standardní režim ve statických prostředích. Jedná se o malé snížení výkonu, i když bude u většiny uživatelů znatelné. |
Zvažte, v jakém režimu zařízení nechat | Tato sada SDK umožňuje vývojářům navrhovat prostředí, která jsou robustní při spouštění zařízení. Zvažte, jestli bude zařízení při příštím spuštění na pohyblivé platformě, a nechte zařízení v příslušném režimu. |
Kde získám sadu SDK?
Sada Moving Platform SDK podporuje jazykové projekce pro C# a C++, což vývojářům umožňuje vyvíjet aplikace pro platformy Win32 nebo UPW. Stáhněte a nainstalujte sadu SDK pomocí nástroje Mixed Reality Feature Tool.
Návody používat tuto sadu SDK
Po instalaci sady SDK můžete následujícím způsobem nastavit skript tak, aby používal MovingPlatformManger:
// Top of file
using Microsoft.MixedReality.MovingPlatform;
// Code body
m_movingPlatformManager = new MovingPlatformManager();
Čtení aktuálního režimu
Aktuální hodnota režimu se dá číst takto:
MovingPlatformMode currentMode = m_movingPlatformManager.Mode;
MovingPlatformMode je výčet, který je definován takto:
public enum MovingPlatformMode
{
Standard, // The legacy mode that devices use out-of-the-box.
MovingPlatformOptimized // Allows tracking on moving platforms.
}
Zařízení, která nemají k dispozici režim pohyblivé platformy, jako jsou zařízení VR a HoloLens 1, vždy vrátí hodnotu Standard.
Nastavení režimu
Hodnotu Moving Platform Mode (Režim pohyblivé platformy) můžete nastavit takto:
bool success = m_movingPlatformManager.TrySetMode(MovingPlatformMode.MovingPlatformOptimized);
TrySetMode vrátí hodnotu true, pokud režim zařízení nyní odpovídá požadovanému režimu. Pokud je režim už v požadovaném stavu, nic se neudělá a zařízení neztratí sledování.
Zpětná volání při změně režimu
Někdy může být užitečné vědět, jestli jiná aplikace nebo uživatel nezměnila hodnotu Režim pohyblivé platformy. Můžete to udělat následujícím způsobem.
// 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
}
}
Kontrola, jestli je režim nastavený
Někdy je užitečné vědět, jestli je režim nastavený, než se ho pokusíte změnit. Například pokud chcete vědět, jestli má dotaz uživatele na preferenci nějakou hodnotu. Pomocí funkce IsSetModeSupported můžete zjistit, jestli se dá režim přesunu platformy nastavit:
bool supported = m_movingPlatformManager.IsSetModeSupported();
Tato funkce vrátí hodnotu true, pokud zařízení může měnit režimy, a false, pokud to není možné. Tato funkce zohledňuje zásady mobilních Správa zařízení (MDM). Pokud například MDM vynutí hodnotu MovingPlatformMode na hodnotu On, vrátí tato funkce hodnotu false.
Ukázkový skript
Tento skript zobrazuje všechny důležité prvky sady SDK na jednom místě. Příklad neodpovídá výše uvedeným osvědčeným postupům.
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;
}
}