Contrôle des limites — MRTK2

Bounds control

BoundsControl est le nouveau composant pour le comportement de manipulation, précédemment trouvé dans BoundingBox. Le contrôle bounds apporte un certain nombre d’améliorations et de simplifications dans l’installation et ajoute de nouvelles fonctionnalités. Ce composant remplace le cadre englobant, qui sera déprécié.

Le BoundsControl.cs script fournit des fonctionnalités de base pour transformer des objets en réalité mixte. Un contrôle bounds affiche une zone autour de l’hologramme pour indiquer qu’il peut être interagissant. Les poignées situées dans les coins et les bords de la zone permettent la mise à l’échelle, la rotation ou la traduction de l’objet. Le contrôle bounds réagit également à l’entrée utilisateur. Sur HoloLens 2, par exemple, le contrôle limites répond à la proximité des doigts, en fournissant des commentaires visuels pour aider à percevoir la distance de l’objet. Toutes les interactions et tous les visuels peuvent être facilement personnalisés.

Exemple de scène

Vous trouverez des exemples de configurations de contrôle de limites dans la BoundsControlExamples scène.

Bounds control Example

Propriétés de l’inspecteur

Objet cible

Cette propriété spécifie l’objet qui sera transformé par la manipulation de contrôle des limites. Si aucun objet n’est défini, il est défini par défaut sur l’objet propriétaire.

Comportement d’activation

Il existe plusieurs options pour activer l’interface de contrôle des limites.

  • Activer au démarrage : le contrôle Bounds devient visible une fois la scène démarrée.
  • Activer par proximité : le contrôle Bounds devient visible lorsqu’une main articulée est proche de l’objet.
  • Activer par pointeur : le contrôle Bounds devient visible lorsqu’il est ciblé par un pointeur de rayon de main.
  • Activer par proximité et pointeur : le contrôle Bounds devient visible lorsqu’il est ciblé par un pointeur de rayon de main ou qu’une main articulée est proche de l’objet.
  • Activer manuellement : le contrôle Bounds ne devient pas visible automatiquement. Vous pouvez l’activer manuellement via un script en accédant à la propriété boundsControl.Active.

Remplacement des limites

Définit un collisionneur de boîtes à partir de l’objet pour le calcul des limites.

Remplissage des boîtes

Ajoute un remplissage aux limites de collisionneur utilisées pour calculer les étendues du contrôle. Cela influence non seulement l’interaction, mais aussi l’impact des visuels.

Axe aplatir

Indique si le contrôle est aplati dans l’un des axes, ce qui en fait 2 dimensions et interdit la manipulation le long de cet axe. Cette fonctionnalité peut être utilisée pour des objets minces comme des ardoises. Si l’axe aplati est défini sur Aplatir Automatiquement , le script sélectionne automatiquement l’axe avec la plus petite étendue comme axe aplati.

Adoucissage

La section de lissage permet de configurer le comportement de lissage pour la mise à l’échelle et la rotation du contrôle.

Visuels

L’apparence du contrôle de limites peut être configurée en modifiant l’une des configurations visuelles correspondantes. Les configurations visuelles sont des objets scriptables liés ou inline et sont décrites plus en détail dans la section de l’objet de configuration.

Objets de configuration

Le contrôle est fourni avec un ensemble d’objets de configuration qui peuvent être stockés en tant qu’objets scriptables et partagés entre différentes instances ou préfabriqués. Les configurations peuvent être partagées et liées en tant que fichiers de ressources scriptables individuels ou ressources scriptables imbriquées à l’intérieur des préfabriqués. D’autres configurations peuvent également être définies directement sur l’instance sans établir de liaison à une ressource scriptable externe ou imbriquée.

L’inspecteur de contrôle bounds indique si une configuration est partagée ou insérée dans le cadre de l’instance actuelle en affichant un message dans l’inspecteur de propriété. En outre, les instances partagées ne peuvent pas être modifiées directement dans la fenêtre de propriété de contrôle des limites elle-même, mais au lieu de cela, la ressource à laquelle il est lié doit être directement modfiée pour éviter toute modification accidentelle sur les configurations partagées.

Actuellement, le contrôle lié offre des options d’objets de configuration pour les fonctionnalités suivantes :

Configuration box

La configuration de la boîte est responsable du rendu d’une boîte pleine avec des limites définies via la taille de collision et le remplissage de boîte. Les propriétés suivantes peuvent être configurées :

  • Matériau de boîte : définit le matériau appliqué à la zone rendue lorsqu’aucune interaction n’a lieu. Une zone ne sera affichée que si ce matériau est défini.
  • Matériel saisi par boîte : matériau pour la boîte lorsque l’utilisateur interagit avec le contrôle en saisissant via une interaction proche ou éloignée.
  • Mise à l’échelle de l’affichage de l’axe aplatissement : échelle appliquée à l’affichage de la zone si l’un des axes est aplatir.

Gestion de la mise à l’échelle de la configuration

Ce tiroir de propriété permet de modifier le comportement et la visualisation des handles d’échelle des contrôles de limites.

  • Matériau de poignée : matériau appliqué aux poignées.
  • Matériel saisi de poignée : matériau appliqué à la poignée prise.
  • Préfabriqué de poignée : préfabriqué facultatif pour la poignée d’échelle. Si la valeur n’est pas définie, MRTK utilise un cube comme valeur par défaut.
  • Taille du handle : taille du handle d’échelle.
  • Remplissage de collisionneur : remplissage à ajouter au collider de poignée.
  • Dessiner le tether lors de la manipulation : lorsqu’il est actif dessine une ligne de liaison de point de départ de l’interaction à la position actuelle de la main ou du pointeur.
  • Handles ignore collider : si un collider est lié ici, les poignées ignorent toute collision avec ce collider.
  • Préfabriqué d’ardoise de poignée : préfabriqué à utiliser pour la poignée lorsque le contrôle est aplatit.
  • Afficher les handles d’échelle : contrôle la visibilité du handle.
  • Comportement de mise à l’échelle : peut être défini sur une mise à l’échelle uniforme ou non uniforme.

La rotation gère la configuration

Cette configuration définit le comportement du handle de rotation.

  • Matériau de poignée : matériau appliqué aux poignées.
  • Matériel saisi de poignée : matériau appliqué à la poignée prise.
  • Préfabriqué de poignée : préfabriqué facultatif pour la poignée. Si la valeur n’est pas définie, MRTK utilise une sphère comme valeur par défaut.
  • Taille du handle : taille du handle.
  • Remplissage de collisionneur : remplissage à ajouter au collider de poignée.
  • Dessiner le tether lors de la manipulation : lorsqu’il est actif dessine une ligne de liaison de point de départ de l’interaction à la position actuelle de la main ou du pointeur.
  • Handles ignore collider : si un collider est lié ici, les poignées ignorent toute collision avec ce collider.
  • Handle prefab collider type: type collider à utiliser avec le handle créé.
  • Afficher le handle pour X : contrôle la visibilité du handle pour l’axe X.
  • Afficher le handle pour Y : contrôle la visibilité du handle pour l’axe Y.
  • Afficher le handle pour Z : contrôle la visibilité du handle pour l’axe Z.

La traduction gère la configuration

Permet d’activer et de configurer des handles de traduction pour le contrôle des limites. Notez que les handles de traduction sont désactivés par défaut.

  • Matériau de poignée : matériau appliqué aux poignées.
  • Matériel saisi de poignée : matériau appliqué à la poignée prise.
  • Préfabriqué de poignée : préfabriqué facultatif pour la poignée. Si la valeur n’est pas définie, MRTK utilise une sphère comme valeur par défaut.
  • Taille du handle : taille du handle.
  • Remplissage de collisionneur : remplissage à ajouter au collider de poignée.
  • Dessiner le tether lors de la manipulation : lorsqu’il est actif dessine une ligne de liaison de point de départ de l’interaction à la position actuelle de la main ou du pointeur.
  • Handles ignore collider : si un collider est lié ici, les poignées ignorent toute collision avec ce collider.
  • Handle prefab collider type: type collider à utiliser avec le handle créé.
  • Afficher le handle pour X : contrôle la visibilité du handle pour l’axe X.
  • Afficher le handle pour Y : contrôle la visibilité du handle pour l’axe Y.
  • Afficher le handle pour Z : contrôle la visibilité du handle pour l’axe Z.

La configuration des liens active la fonctionnalité wireframe du contrôle bounds. Les propriétés suivantes peuvent être configurées :

  • Matériau filaire : matériau appliqué au maillage filaire.
  • Rayon de bord filaire : épaisseur du wireframe.
  • Forme filaire : forme du wireframe peut par cubique ou cylindrique.
  • Afficher le wireframe : contrôle la visibilité du wireframe.

Configuration de l’effet de proximité

Affichez et masquez les poignées avec une animation basée sur la distance entre les mains. Il a une animation de mise à l’échelle en deux étapes. Les valeurs par défaut sont définies sur HoloLens 2 comportement de style.

Bounds control Proximity
  • Effet de proximité actif : activer l’activation du handle basé sur la proximité
  • Proximité moyenne de l’objet : distance pour la mise à l’échelle de la 1ère étape
  • Proximité de l’objet : distance pour la mise à l’échelle de la 2e étape
  • Grande échelle : valeur d’échelle par défaut de la ressource de handle lorsque les mains sont hors de portée de l’interaction de contrôle des limites (distance définie ci-dessus par « Gérer la proximité moyenne ». Utilisez 0 pour masquer le handle par défaut)
  • Échelle moyenne : valeur de mise à l’échelle de la ressource de handle lorsque les mains se trouvent dans la plage de l’interaction de contrôle des limites (distance définie ci-dessus par « Gérer la proximité proche ». Utiliser 1 pour afficher la taille normale)
  • Échelle de fermeture : valeur de mise à l’échelle de la ressource de handle lorsque les mains se trouvent dans la plage de l’interaction de saisie (distance définie ci-dessus par « Gérer la proximité proche ». Utiliser 1.x pour afficher une plus grande taille)
  • Taux de croissance extrême : évaluer un objet mis à l’échelle de proximité s’adapte lorsque la main passe de moyen à extrême proximité.
  • Taux de croissance moyen : évaluer un objet mis à l’échelle de proximité lorsque la main passe de moyen à proche proximité.
  • Fermer le taux de croissance : évaluer un objet mis à l’échelle de proximité est mis à l’échelle lorsque la main passe de la proximité au centre d’objets.

Système de contraintes

Le contrôle Bounds prend en charge l’utilisation du gestionnaire de contraintes pour limiter ou modifier le comportement de traduction, de rotation ou de mise à l’échelle lors de l’utilisation de handles de contrôle de limites.

L’inspecteur de propriété affiche tous les gestionnaires de contraintes disponibles attachés au même objet de jeu dans une liste déroulante avec une option permettant de faire défiler et de mettre en surbrillance le gestionnaire de contraintes sélectionné.

Bounds control Constraints

Événements

Le contrôle Bounds fournit les événements suivants. Cet exemple utilise ces événements pour lire les commentaires audio.

  • Rotation démarrée : déclenché lors du démarrage de la rotation.
  • Rotation arrêtée : déclenché lors de l’arrêt de la rotation.
  • Mise à l’échelle démarrée : se déclenche lors du démarrage de la mise à l’échelle.
  • Mise à l’échelle arrêtée : se déclenche lors de l’arrêt de la mise à l’échelle.
  • Traduction démarrée : se déclenche au démarrage de la traduction.
  • Traduire arrêté : se déclenche lorsque la traduction s’arrête.
Bounds control Events

Elastics (expérimental)

Les élastiques peuvent être utilisés lors de la manipulation d’objets via un contrôle de limites. Notez que le système élastique est toujours dans un état expérimental. Pour activer les élastiques, liez un composant de gestionnaire élastique existant ou créez et liez un nouveau gestionnaire d’élastiques via le Add Elastics Manager bouton.

Bounds control Elastics

Gérer les styles

Par défaut, lorsque vous attribuez simplement le BoundsControl.cs script, il affiche le handle du style HoloLens 1ère génération. Pour utiliser HoloLens 2 poignées de style, vous devez attribuer des préfabriqués et des matériaux de poignée appropriés.

Bounds Control Handle Styles 2

Vous trouverez ci-dessous les préfabriqués, les matériaux et les valeurs de mise à l’échelle pour les poignées de contrôle des limites de style HoloLens 2. Vous trouverez cet exemple dans la BoundsControlExamples scène.

Bounds control HandleStyles

Handles (configuration pour HoloLens 2 style)

  • Matériau de poignée : BoundingBoxHandleWhite.mat
  • Handle Grabbed Material: BoundingBoxHandleBlueGrabbed.mat
  • Scale Handle Prefab : MRTK_BoundingBox_ScaleHandle.prefab
  • Scale Handle Slate Prefab: MRTK_BoundingBox_ScaleHandle_Slate.prefab
  • Taille du handle d’échelle : 0,016 (1,6cm)
  • Scale Handle Collider Padding: 0.016 (rend le collider attrapable légèrement plus grand que le visuel de poignée)
  • Prefab de poignée de rotation : MRTK_BoundingBox_RotateHandle.prefab
  • Taille du handle de rotation : 0,016
  • Poignée de rotation Collider Padding: 0.016 (rend le collider attrapable légèrement plus grand que le visuel de poignée)

Modifications de transformation avec le manipulateur d’objets

Un contrôle de limites peut être utilisé en combinaison avec ObjectManipulator.cs pour permettre certains types de manipulation (par exemple, déplacer l’objet) sans utiliser de handles. Le gestionnaire de manipulation prend en charge les interactions un et deux mains. Le suivi des mains peut être utilisé pour interagir avec un objet à proximité.

Bounds control Object Manipulator

Pour que les bords de contrôle des limites se comportent de la même façon lors du déplacement de celui-ci à l’aide ObjectManipulatord’une interaction lointaine, il est recommandé de connecter ses événements pour On Manipulation Started / On Manipulation TerminéBoundsControl.HighlightWires / BoundsControl.UnhighlightWires respectivement, comme illustré dans la capture d’écran ci-dessus.

Guide pratique pour ajouter et configurer un contrôle de limites à l’aide de Unity Inspector

  1. Ajouter Box Collider à un objet
  2. Affecter BoundsControl un script à un objet
  3. Configurer des options, telles que les méthodes « Activation » (voir la section Propriétés de l’inspecteur ci-dessous)
  4. (Facultatif) Affecter des préfabriqués et des matériaux pour un contrôle de limites de style HoloLens 2 (voir section Gérer les styles ci-dessous)

Notes

Utilisez le champ Target Object and Bounds Override dans l’inspecteur pour affecter un objet et un collider spécifiques dans l’objet avec plusieurs composants enfants.

Bounds Control

Comment ajouter et configurer un contrôle de limites dans le code

  1. Instancier un GameObject de cube

    GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    
  2. Affecter BoundsControl un script à un objet avec un collider, à l’aide de AddComponent<>()

    private BoundsControl boundsControl;
    boundsControl = cube.AddComponent<BoundsControl>();
    
  3. Configurer des options directement sur le contrôle ou via l’une des configurations scriptables (voir la section Propriétés de l’inspecteur et Configurations ci-dessous)

    // Change activation method
    boundsControl.BoundsControlActivation = BoundsControlActivationType.ActivateByProximityAndPointer;
    // Make the scale handles large
    boundsControl.ScaleHandlesConfig.HandleSize = 0.1f;
    // Hide rotation handles for x axis
    boundsControl.RotationHandlesConfig.ShowRotationHandleForX = false;
    
  4. (Facultatif) Attribuez des préfabriqués et des matériaux pour un contrôle de limites de style HoloLens 2. Cela nécessite toujours des affectations par l’inspecteur, car les matériaux et les préfabriqués doivent être chargés dynamiquement.

Notes

L’utilisation du dossier « Resources » de Unity ou de Shader.Find pour le chargement dynamique des nuanceurs n’est pas recommandée, car les permutations du nuanceur peuvent être manquantes au moment de l’exécution.

BoxDisplayConfiguration boxConfiguration = boundsControl.BoxDisplayConfig;
boxConfiguration.BoxMaterial = [Assign BoundingBox.mat]
boxConfiguration.BoxGrabbedMaterial = [Assign BoundingBoxGrabbed.mat]
ScaleHandlesConfiguration scaleHandleConfiguration = boundsControl.ScaleHandlesConfig;
scaleHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
scaleHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
scaleHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_ScaleHandle.prefab]
scaleHandleConfiguration.HandleSlatePrefab = [Assign MRTK_BoundingBox_ScaleHandle_Slate.prefab]
scaleHandleConfiguration.HandleSize = 0.016f;
scaleHandleConfiguration.ColliderPadding = 0.016f;
RotationHandlesConfiguration rotationHandleConfiguration = boundsControl.RotationHandlesConfig;
rotationHandleConfiguration.HandleMaterial = [Assign BoundingBoxHandleWhite.mat]
rotationHandleConfiguration.HandleGrabbedMaterial = [Assign BoundingBoxHandleBlueGrabbed.mat]
rotationHandleConfiguration.HandlePrefab = [Assign MRTK_BoundingBox_RotateHandle.prefab]
rotationHandleConfiguration.HandleSize = 0.016f;
rotationHandleConfiguration.ColliderPadding = 0.016f;

Exemple : Définir l’échelle de contrôle minimale et maximale des limites à l’aide de MinMaxScaleConstraint

Pour définir la mise à l’échelle minimale et maximale, attachez-en un MinMaxScaleConstraint à votre contrôle. À mesure que le contrôle bounds attache et active automatiquement le gestionnaire de contraintes, minMaxScaleConstraint est automatiquement appliqué aux modifications de transformation une fois qu’elle est attachée et configurée.

Vous pouvez également utiliser MinMaxScaleConstraint pour définir la mise à l’échelle minimale et maximale pour ObjectManipulator.

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
bcontrol = cube.AddComponent<BoundsControl>();
// Important: BoundsControl creates a constraint manager on start if one does not exist.
// There's no need to manually attach a constraint manager.
MinMaxScaleConstraint scaleConstraint = bcontrol.gameObject.AddComponent<MinMaxScaleConstraint>();
scaleConstraint.ScaleMinimum = 1f;
scaleConstraint.ScaleMaximum = 2f;

Exemple : Ajouter un contrôle de limites autour d’un objet de jeu

Pour ajouter un contrôle bounds autour d’un objet, ajoutez simplement un composant à cet BoundsControl objet :

private void PutABoundsControlAroundIt(GameObject target)
{
   target.AddComponent<BoundsControl>();
}

Migration à partir d’un cadre englobant

Les préfabriqués et instances existants utilisant un cadre englobant peuvent être mis à niveau vers le nouveau contrôle de limites via la fenêtre de migration qui fait partie du package d’outils MRTK.

Pour mettre à niveau des instances individuelles de cadre englobant, il existe également une option de migration à l’intérieur de l’inspecteur de propriété du composant.

Bounds control Migrate

Voir aussi