Gestion des conditions exceptionnelles
Pour l’essentiel, WLT peut détecter et corriger les erreurs de suivi silencieusement sans l’implication de l’application.
Toutefois, certaines conditions exceptionnelles entraînent des erreurs que l’application peut souhaiter ajuster.
Une perte de suivi est un exemple de condition.
Le suivi peut être perdu à tout moment, pour un certain nombre de raisons. Les capteurs peuvent être couverts, l’éclairage peut être inadéquat, ou il se peut qu’il n’y ait pas de caractéristiques visibles autour de la caméra pour le suivi.
Une discussion plus complète de ces conditions exceptionnelles à un niveau conceptuel, y compris les fonctionnalités de WLT destinées à les atténuer, se trouve ailleurs dans cette documentation.
Ici, nous allons examiner comment le développeur de l’application peut (éventuellement) tirer parti de ces fonctionnalités pour personnaliser le comportement de l’application dans ces conditions exceptionnelles.
AttachmentPoints
Comme nous le voyons plus en détail ici, un point d’attache est le contrat entre WLT et l’application, pour notifier que des conditions exceptionnelles se sont produites, ainsi que les données appropriées que l’application peut utiliser pour répondre.
Composants d’ajustement
Une implémentation de ces réponses d’application est disponible sous la forme des composants « ajusteurs ». Le principal est le composant AdjusterFixed.
AdjusterFixed peut être utilisé tel quel, mais comprendre ce qu’il est peut être instructif, en particulier pour un développeur souhaitant personnaliser davantage le comportement.
Il est important de reconnaître que les composants ajusteurs remplissent deux rôles :
- Ils gèrent l’AttachmentPoint sous-jacent.
- Ils fournissent des implémentations des réponses de l’application à des conditions exceptionnelles.
Gestion d’AttachmentPoint
L’examen des membres Start()
et OnDestroy()
permet de saisir la majeure partie de la gestion de l’AttachmentPoint nécessaire.
Sur Start()
, l’AttachmentPoint sous-jacent est créé, en donnant les fonctions membres d’AdjusterFixed comme rappels (voir ci-dessous).
Dans OnDestroy()
, ces connexions de rappel sont interrompues et les AttachmentPoint libérés.
Rappels de gestion des conditions
Les deux rappels implémentent le comportement souhaité de l’application dans le cadre de ces conditions exceptionnelles.
Gestion de l’état de suivi
Dans HandleStateAdjust()
, le composant AdjusterFixed désactive les objets contenus dans un fragment qui n’est pas actuellement suivi.
protected virtual void HandleAdjustState(AttachmentPointStateType state)
{
bool visible = state == AttachmentPointStateType.Normal;
if (visible != gameObject.activeSelf)
{
gameObject.SetActive(visible);
}
}
Bien que ce comportement simple soit parfait pour de nombreuses applications, il est facile d’imaginer des cas où cela ne serait pas suffisant.
- L’objet doit être masqué, mais pas désactivé (il doit continuer à être mis à jour).
- Une autre méthode de masquage d’objet est préférable (par exemple, en le déplaçant au-delà du plan de détour éloigné).
- Au lieu de masquer l’objet, celui-ci doit être rendu avec un matériau différent (par exemple, un matériau en rayons X).
- Au lieu de masquer l’objet, un objet de remplacement doit être rendu.
- Etc.
Heureusement, le développeur d’applications est libre d’implémenter n’importe lequel de ces comportements, ou tout autre comportement que vous pouvez imaginer.
Le moyen le plus simple de spécifier un comportement personnalisé consiste à implémenter un composant personnalisé dérivant d’AdjusterFixed. La gestion d’AttachmentPoint peut ensuite être héritée et les gestionnaires substitués pour créer le comportement personnalisé.
Gestion du repositionnement
Comme décrit dans la documentation conceptuelle, le système WLT peut décider qu’un objet peut être mieux maintenu dans sa position dans le monde physique en le repositionnant dans un espace figé. Il informe l’application de cette situation via le mécanisme AttachmentPoint.
L’application est, bien sûr, libre d’ignorer ces ajustements. Toutefois, le comportement fourni par le composant AdjusterFixed (et AdjusterMoving) consiste à appliquer immédiatement cette transformation de repositionnement.
protected virtual void HandleAdjustLocation(Pose adjustment)
{
Pose pose = gameObject.transform.GetGlobalPose();
pose = adjustment.Multiply(pose);
gameObject.transform.SetGlobalPose(pose);
}
C’est presque toujours ce que veut l’application. On peut donc se demander pourquoi quelqu’un voudrait remplacer la fonction HandlePositionAdjust()
d’AdjusterFixed.
La réponse est évidemment que l’application peut vouloir effectuer d’autres actions en plus de corriger la position. Un effet matériel temporaire peut aider à informer l’utilisateur qu’une modification a été apportée. Le repositionnement peut être réparti sur quelques secondes. Ou si un repositionnement est trop radical, l’application peut préférer ignorer l’objet, au lieu de le déplacer.
AdjusterFixed et AdjusterMoving
Un examen approfondi du composant AdjusterMoving montre qu’il est quasiment identique au composant AdjusterFixed dont il dérive.
La différence entre les deux est qu’AdjusterMoving part du principe que sa cible est constamment déplacée autour de l’environnement. Par conséquent, chaque mise à jour avertit le système WLT de sa nouvelle pose.
Le coût d’AdjusterMoving provient principalement de l’ajout d’une fonction Update(), plutôt que du travail effectué dans la fonction. Toutefois, pour un objet qui est « principalement » stationnaire et qui n’est que rarement déplacé depuis le script, il peut être avantageux d’utiliser un composant AdjusterFixed et d’appeler AdjusterFixed.UpdatePosition() après chaque déplacement de l’objet.
Personnalisez le comportement, mais uniquement si vous le souhaitez
Là encore, le modèle est toujours cohérent dans World Locking Tools. WLT fournit un comportement de base simple, mais généralement utile. Nous espérons que cette mise en œuvre permettra de :
- Répondre aux besoins de votre application.
- Fournir une implémentation de référence que vous pourrez améliorer.
- Donner un exemple d’implémentation à partir duquel vous pouvez laisser libre cours à votre imagination.