Déplacement du mode plateforme dans Unity
le Mode de plateforme mobile permet à HoloLens 2 de fonctionner correctement sur des plateformes mobiles telles que des navires, des 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 manière à ce qu’ils apparaissent à l’utilisateur du casque pour qu’ils soient solidement verrouillés dans l’environnement. Le suivi est généralement effectué en associant des poses calculés à l’aide d’appareils photo à l’extérieur et des mesures à partir de l’unité de mesure d’inertie (IMU). Cette méthode fonctionne bien lorsque l’environnement se trouve dans le cadre d’inertie de référence. Les petits effets, tels que le mouvement planétaire, sont généralement négligés.
Lorsque l’environnement n’est pas dans le cadre d’inertie de référence, le système de suivi des en-têtes normal échoue. La fonctionnalité de mode de plateforme mobile résout ce problème en tenant compte du mouvement de l’environnement par rapport à l’image inertielle. ainsi, en Mode de plateforme mobile, HoloLens 2 pouvez afficher des hologrammes qui s’affichent dans l’environnement, même si l’environnement est un navire lurching.
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 proposer à l’utilisateur le choix avant de modifier le mode pour ceux-ci, et vous devez continuer à respecter ce choix pour le runtime de l’application. |
| Fournir un avertissement à l’utilisateur | Évitez de modifier le mode immédiatement au démarrage/à la reprise de l’application. Cela présente une expérience utilisateur médiocre, puisque l’utilisateur peut ne pas savoir pourquoi l’appareil perd le suivi. |
| Réduire le mode de modification | Lorsque vous modifiez les paramètres du mode de plateforme mobile, l’appareil perd le suivi, ce qui entraîne une expérience utilisateur négative. Par conséquent, il est recommandé de réduire la fréquence à laquelle vous modifiez le mode. Dans l’idéal, le mode n’est modifié que si l’appareil passe d’un environnement stationnaire à un en déplacement, ou vice versa. |
| Si vous n’êtes pas certain de l’environnement, utilisez le mode de plateforme mobile | Le déplacement du mode plateforme peut fonctionner dans des environnements stationnaires et en déplacement. Les algorithmes de suivi habituels fonctionnent uniquement dans les environnements stationnaires. par conséquent, si vous ne savez pas si l’environnement est en déplacement, le choix du mode de plateforme mobile peut être plus sûr. |
| N’utilisez pas le mode de plateforme mobile dans les environnements stationnaires connus | Le mode de plateforme mobile est moins performant que le mode standard dans les environnements stationnaires. Il s’agit d’une petite dégradation, bien que celle-ci soit perceptible pour la plupart des utilisateurs. |
| Déterminez le mode de sortie de l’appareil | Ce kit de développement logiciel (SDK) permet aux développeurs de concevoir des expériences qui sont robustes au démarrage de l’appareil. Déterminez si l’appareil se trouve sur une plateforme mobile lors du démarrage suivant, et laissez l’appareil dans le mode approprié. |
Où puis-je me procurer le kit de développement logiciel ?
Le kit de développement logiciel (SDK) de plateforme mobile prend en charge les projections de langage pour C# et C++, permettant 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 Mixed Reality feature.
Comment faire utiliser ce kit de développement logiciel
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 en cours
La valeur actuelle du mode peut être lue comme suit :
MovingPlatformMode currentMode = m_movingPlatformManager.Mode;
MovingPlatformMode est une énumération qui est 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, comme les appareils VR et HoloLens 1, retournent toujours « Standard ».
Définition du mode
Vous pouvez définir la valeur du mode de plateforme mobile comme suit :
bool success = m_movingPlatformManager.TrySetMode(MovingPlatformMode.MovingPlatformOptimized);
TrySetMode retourne la valeur true si le mode d’appareil correspond désormais au mode demandé. Si le mode est déjà à l’état souhaité, rien ne sera effectué et l’appareil ne perdra pas le suivi.
Rappel en cas de changement de mode
Parfois, il peut être utile de savoir si une autre application, ou l’utilisateur, a modifié la valeur du mode de plate-forme en déplacement. Pour ce faire, procédez 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 de la définissable du mode
Il est parfois utile de savoir si le mode peut être définissable avant de tenter de le modifier. Par exemple, si vous souhaitez savoir s’il existe une valeur pour demander à l’utilisateur sa préférence. Vous pouvez déterminer si le mode de plateforme mobile est définissable avec la fonction IsSetModeSupported :
bool supported = m_movingPlatformManager.IsSetModeSupported();
Cette fonction renvoie la valeur true si l’appareil peut changer de mode et la valeur false si ce n’est pas possible. cette fonction prend en compte les stratégies de Gestion des appareils Mobile (MDM). Par exemple, si MDM force le MovingPlatformMode à « on », cette fonction retourne false.
Script de démonstration
Ce script montre tous les éléments importants du kit de développement logiciel (SDK) dans un même emplacement. 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;
}
}