Déplacement du mode plateforme dans Unity

Le mode de plateforme de déplacement permet aux HoloLens 2 de fonctionner correctement sur les plateformes mobiles telles que les navires, les plateformes pétrolières et d’autres véhicules.

En savoir plus sur le déplacement du mode plateforme

Vue d'ensemble conceptuelle

Pour que les systèmes de réalité mixte fonctionnent correctement, le casque doit être suivi par rapport à l’environnement. Ce suivi relatif permet aux graphiques d’être rendus de telle sorte qu’ils semblent à l’utilisateur du casque solidement verrouillés dans l’environnement. Le suivi est généralement réalisé en combinant des poses calculées à l’aide de caméras tournées vers l’extérieur et de mesures de l’unité de mesure inertielle (IMU). Cette méthode fonctionne bien lorsque l’environnement se trouve dans le cadre inertiel de référence. Les petits effets, comme le mouvement planétaire, sont généralement négligés.

Lorsque l’environnement n’est pas dans le cadre inertiel de référence, le système de suivi de la tête normal échoue. La fonctionnalité Mode plateforme mobile résout ce problème en prenant en compte le mouvement de l’environnement par rapport au cadre inertiel. Ainsi, en mode de plateforme de déplacement, HoloLens 2 pouvez afficher des hologrammes qui semblent fixes à l’environnement, même si l’environnement est un navire de transport!

Comment activer le mode MPM ?

Afin de prendre en charge toute une gamme de cas d’usage, différentes méthodes sont disponibles pour activer le mode MPM. Réfléchissez bien au choix de la méthode. La question clé à se poser est la suivante : qui sait si l’HoloLens 2 se trouve actuellement dans un environnement mouvant ? Examinez l’exemple dans le tableau suivant :

Qui sait si HL2 se trouve dans un environnement mouvant ? Meilleure méthode pour définir le mode MPM Avantages Coûts
Administrateur système Gestion des appareils mobiles L’utilisateur n’a pas besoin d’être sollicité. Les applications fonctionnent sans modification. L’appareil peut être protégé de manière à ce qu’il n’entre pas dans un mode incorrect. L’utilisateur et les applications ne peuvent pas modifier le mode.
Utilisateur final Application Paramètres L’utilisateur est souvent celui qui sait le mieux quand et où il utilise l’appareil. Les applications fonctionnent sans modification. L’utilisateur peut ne pas savoir que le mode existe.
L'application Utilisez le Kit de développement logiciel (SDK) décrit dans cet article. Des indicateurs spécifiques à un cas d’usage peuvent être utilisés pour changer de mode lorsque l’environnement ne peut pas être connu à l’avance. Supprime l’obligation pour un utilisateur de prendre cette décision et de modifier le mode dans les paramètres. Une application mal conçue peut entraîner une très mauvaise expérience et laisser l’appareil dans un mode inattendu.

Meilleures pratiques pour le déplacement du mode plateforme

Principal Description
Respecter le choix de l’utilisateur Vous devez offrir à l’utilisateur le choix avant de changer le mode pour lui, et vous devez continuer à respecter ce choix pour le runtime de l’application
Fournir un avertissement à l’utilisateur Évitez de changer de mode immédiatement au démarrage/reprise de l’application. Cela présente une expérience utilisateur médiocre, car l’utilisateur peut ne pas savoir pourquoi l’appareil perd le suivi.
Réduire les changements de mode Lors de la modification des paramètres du mode de déplacement de la plateforme, l’appareil perd le suivi, ce qui entraîne une expérience utilisateur négative. Il est donc recommandé de réduire la fréquence à laquelle vous modifiez le mode. Dans l’idéal, le mode ne serait modifié que si l’appareil passe d’un environnement stationnaire à un environnement mobile, ou inversement.
En cas d’incertitude sur l’environnement, utilisez le mode Déplacement de la plateforme Le mode de plateforme de déplacement peut fonctionner à la fois dans les environnements fixes et les environnements mobiles. Les algorithmes de suivi standard fonctionnent uniquement dans les environnements stationnaires. Par conséquent, si vous ne savez pas si l’environnement se déplace, le choix du mode de plateforme de déplacement peut être le choix le plus sûr.
N’utilisez pas le mode Déplacement de plateforme dans les environnements stationnaires connus Le mode de plateforme mobile fonctionne moins bien que le mode standard dans les environnements stationnaires. Il s’agit d’une légère dégradation, mais sera perceptible pour la plupart des utilisateurs.
Déterminez le mode dans lequel laisser l’appareil Ce KIT de développement logiciel (SDK) permet aux développeurs de concevoir des expériences robustes au démarrage de l’appareil. Déterminez si l’appareil se trouve sur une plateforme mobile au prochain démarrage et laissez l’appareil dans le mode approprié.

Où puis-je obtenir le Kit de développement logiciel (SDK) ?

Le Kit de développement logiciel (SDK) Moving Platform prend en charge les projections de langage pour C# et C++, ce qui permet aux développeurs de développer des applications pour les plateformes Win32 ou UWP. Téléchargez et installez le Kit de développement logiciel (SDK) avec l’outil de fonctionnalité Mixed Reality.

Comment faire utiliser ce Kit de développement logiciel (SDK)

Après avoir installé le Kit de développement logiciel (SDK), vous pouvez configurer votre script pour utiliser MovingPlatformManger comme suit :

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

Lecture du mode actuel

La valeur actuelle du mode peut être lue comme suit :

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

MovingPlatformMode est une énumération définie comme suit :

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

Les appareils qui n’ont pas le mode de plateforme mobile disponible, comme les appareils VR et HoloLens 1, retournent toujours « Standard ».

Définition du mode

Vous pouvez définir la valeur Du mode de plateforme de déplacement comme suit :

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

TrySetMode retourne la valeur true si le mode de l’appareil correspond maintenant au mode demandé. Si le mode est déjà dans l’état souhaité, rien n’est fait et l’appareil ne perd pas le suivi.

Changement de mode de rappel

Parfois, il peut être utile de savoir si une autre application, ou l’utilisateur, a modifié la valeur Mode de plateforme de déplacement. Vous pouvez effectuer cette opération comme suit.

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

Vérification si le mode est paramétrable

Parfois, il est utile de savoir si le mode est paramétrable avant d’essayer de le modifier. Par exemple, si vous souhaitez savoir s’il y a une valeur à demander à l’utilisateur sa préférence. Vous pouvez déterminer si le mode de déplacement de la plateforme est paramétrable avec la fonction IsSetModeSupported :

bool supported = m_movingPlatformManager.IsSetModeSupported();

Cette fonction retourne true si l’appareil peut changer de mode et false si ce n’est pas possible. Cette fonction prend en compte les stratégies mobile Gestion des appareils (GPM). Par exemple, si GPM force MovingPlatformMode à « Activé », cette fonction retourne false.

Un script de démonstration

Ce script affiche tous les éléments importants du KIT de développement logiciel (SDK) au même endroit. L’exemple ne suit pas les meilleures pratiques indiquées ci-dessus.

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

Voir aussi