Mover el modo de plataforma en Unity

El modo de plataforma móvil permite que HoloLens 2 funcionen correctamente en plataformas móviles, como barcos, plataformas petroleras y otros vehículos.

Más información sobre cómo mover el modo de plataforma

Información conceptual

Para que los sistemas de realidad mixta funcionen correctamente, se debe realizar un seguimiento de los auriculares en relación con el entorno. Este seguimiento relativo permite que los gráficos se representen de forma que parezcan al usuario del casco estar bloqueados sólidamente en el entorno. El seguimiento se logra normalmente mediante la combinación de posturas que se calculan mediante cámaras y mediciones de aspecto exterior de la unidad de medición inercial (IMU). Este método funciona bien cuando el entorno está en el marco inercial de referencia. Los efectos pequeños, como el movimiento planetario, suelen ser descuidados.

Cuando el entorno no está en el marco inercial de referencia, se producirá un error en el sistema de seguimiento de cabeza normal. La característica Modo de plataforma móvil resuelve este problema teniendo en cuenta el movimiento del entorno en relación con el marco inercial. Por lo tanto, cuando se encuentra en el modo de plataforma móvil, HoloLens 2 puede representar hologramas que aparecen fijos en el entorno, incluso si el entorno es un envío de lurching.

¿Cómo se debe activar el modo de plataforma móvil?

Para habilitar una variedad de casos de uso, se proporcionan varios métodos para activar el modo de plataforma móvil. Es importante que considere detenidamente qué método elegir. Una pregunta clave que se debe hacer es: ¿Quién sabe si HoloLens 2 está actualmente dentro de una plataforma móvil? Consulte la tabla siguiente para obtener un ejemplo:

Quién sabe si HL2 está en una plataforma móvil Método adecuado para establecer el modo de plataforma móvil Ventajas Costos
Administrador del sistema Administración de dispositivos móviles No es necesario que el usuario esté implicado. Cualquier aplicación funcionará sin modificaciones. El dispositivo se puede proteger para que no entre en el modo incorrecto. El usuario y las aplicaciones no pueden cambiar el modo.
Usuario final Aplicación de configuración A menudo, el usuario es el que tiene más conocimientos sobre cuándo y dónde usa el dispositivo. Cualquier aplicación funcionará sin modificaciones. Es posible que el usuario no sepa que este modo existe.
La aplicación Use el SDK descrito en este artículo. Las indicaciones específicas del caso de uso se pueden usar para intercambiar el modo cuando no se puede conocer el entorno con antelación. Quita el requisito que solicita que un usuario tome esta decisión y cambie el modo en la configuración. Una aplicación mal diseñada puede ofrecer una experiencia extremadamente mala y dejar el dispositivo en un modo inesperado.

Procedimientos recomendados para mover el modo de plataforma

Principal Descripción
Respetar la elección del usuario Debe ofrecer al usuario la opción antes de cambiar el modo para ellos y debe seguir respetando esa elección para el tiempo de ejecución de la aplicación.
Proporcionar una advertencia al usuario Evite cambiar el modo inmediatamente en el inicio o reanudación de la aplicación. Esto presenta una experiencia de usuario deficiente, ya que es posible que el usuario no sepa por qué el dispositivo pierde el seguimiento.
Minimizar el modo de cambio Al cambiar la configuración del modo de plataforma móvil, el dispositivo perderá el seguimiento, lo que provocará una experiencia de usuario negativa. Por lo tanto, se recomienda minimizar la frecuencia con la que se cambia el modo. Idealmente, el modo solo se cambiaría si el dispositivo pasa de un entorno estacionario a uno móvil, o viceversa.
Si no está seguro acerca del entorno, use el modo de plataforma móvil. El modo de plataforma móvil puede funcionar tanto en entornos estáticos como en los que se mueven. Los algoritmos de seguimiento normales solo funcionan en entornos estacionarios, por lo que si no está seguro de si el entorno se está moviendo, elegir El modo de plataforma móvil puede ser la opción más segura.
No use el modo de plataforma móvil en entornos estáticos conocidos El modo de plataforma móvil funciona menos bien que el modo estándar en entornos estacionarios. Esta es una degradación pequeña, aunque será notable para la mayoría de los usuarios.
Tenga en cuenta en qué modo dejar el dispositivo en Este SDK permite a los desarrolladores diseñar experiencias sólidas en el arranque del dispositivo. Tenga en cuenta si el dispositivo estará en una plataforma móvil la próxima vez que arranque y deje el dispositivo en el modo adecuado.

¿Dónde obtengo el SDK?

El SDK de plataforma móvil admite proyecciones de lenguaje para C# y C++, lo que permite a los desarrolladores desarrollar aplicaciones para plataformas Win32 o UWP. Descargue e instale el SDK con la herramienta de características de Mixed Reality.

Cómo usar este SDK

Después de instalar el SDK, puede configurar el script para usar MovingPlatformManger de la siguiente manera:

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

Lectura del modo actual

El valor actual del modo se puede leer de la siguiente manera:

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

MovingPlatformMode es una enumeración que se define de la siguiente manera:

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

Los dispositivos que no tienen el modo de plataforma móvil disponible, como los dispositivos VR y HoloLens 1, siempre devolverán "Standard".

Establecimiento del modo

Puede establecer el valor modo de plataforma móvil de la siguiente manera:

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

TrySetMode devolverá true si el modo de dispositivo ahora coincide con el modo solicitado. Si el modo ya está en estado deseado, no se realizará nada y el dispositivo no perderá el seguimiento.

Devolución de llamada en modo de cambio

En ocasiones, podría resultar útil saber si otra aplicación, o el usuario, ha cambiado el valor del modo de plataforma móvil. Puede hacerlo de la siguiente manera.

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

Comprobación de si el modo se puede establecer

A veces resulta útil saber si el modo se puede establecer antes de intentar cambiarlo. Por ejemplo, si desea saber si hay algún valor en preguntar al usuario su preferencia. Puede encontrar si el modo de plataforma móvil se puede establecer con la función IsSetModeSupported:

bool supported = m_movingPlatformManager.IsSetModeSupported();

Esta función devolverá true si el dispositivo puede cambiar los modos y false si no es posible. Esta función tiene en cuenta las directivas de mobile Administración de dispositivos (MDM). Por ejemplo, si MDM fuerza MovePlatformMode a "On", esta función devolverá false.

Un script de demostración

Este script muestra todos los elementos importantes del SDK en un solo lugar. El ejemplo no sigue los procedimientos recomendados que se muestran anteriormente.

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

Consulte también