Premiers pas avec les Salles et les Portails

Le RoomManager

Chaque fois que vous voulez utiliser le système de portail, vous devez inclure un nœud spécial dans votre arbre de scènes, appelé le RoomManager. Le RoomManager (gestionnaire de salles) est responsable de la maintenance du système au moment de l'exécution, en particulier de la conversion des objets de vos salles en graphe de salles, qui est utilisé à l'exécution pour effectuer l'occlusion culling et d'autres tâches.

Conversion de Room

Cette conversion doit avoir lieu chaque fois que vous voulez activer le système. Il ne stocke pas le graphe de salles dans votre projet (par souci de flexibilité et pour économiser de la mémoire). Vous pouvez soit la déclencher en appuyant sur le bouton Convertir les salles dans la barre d'outils de l'éditeur (qui dispose également d'un raccourci clavier), ou vous pouvez appeler la méthode rooms_convert() du RoomManager. C'est cette dernière méthode que vous utiliserez en jeu. Notez que par sécurité, la meilleure pratique est d'appeler rooms_clear() avant de décharger ou de changer de niveau.

../../../_images/convert_rooms_button.png

Si vous convertissez le niveau pendant que l'éditeur est en cours d'exécution, le système de culling de portail prendra le dessus sur le frustum culling normal de Godot. Cela peut affecter certaines fonctionnalité de l'éditeur. Pour cette raison, vous pouvez activer ou désactiver le culling de portail, soit en utilisant le bouton Afficher le Portal culling dans le menu Affichage de la barre d'outils de l'éditeur (qui a également un raccourci clavier), soit via le paramètre Active du nœud RoomManager.

Note

Pour utiliser le RoomManager, vous devez lui indiquer où sont les salles dans votre arbre de scènes, ou plutôt où se trouve le nœud RoomList. Cette RoomList est le parent de vos salles - voir ci-dessous. Si le RoomList n'est pas défini, la conversion va échouer, et une boîte de dialogue avec un avertissement s'affichera.

../../../_images/room_manager.png

La RoomList

Avant de créer des salles, nous devons d'abord créer un nœud qui sera le parent de tous les objets statiques, salles, groupes de salles, etc. de notre niveau. Ce nœud est appelé la RoomList.

../../../_images/roomlist_node.png

Note

Le RoomList n'est pas un type de nœud spécial, il peut simplement s'agir d'un Spatial ordinaire.

Vous devrez assigner le nœud RoomList dans le RoomManager, pour que le RoomManager sache où trouver les salles.

Pourquoi devons-nous utiliser une branche spécifique de l'arbre de scènes, et non la racine de la scène ? La réponse est qu'il y a beaucoup de détails internes au système qui sont plus faciles à gérer si les salles sont placées dans leur propre branche.

Souvent, vous finirez par complètement remplacer la branche RoomList à l'exécution du jeu, lorsque vous chargez et déchargez des niveaux.

Salles

Qu'est-ce qu'une room ?

Les Rooms sont une façon de partitionner spatialement votre niveau en zones qui ont du sens en terme de level design. Les Rooms correspondent souvent à des vraies salles (dans un bâtiment, par exemple). En fin de compte, pour le moteur, une salle représente un volume convexe sans chevauchement, dans lequel vous placerez la plupart des objets qui se trouvent dans cette zone.

Une salle n'a pas besoin de correspondre à une salle littérale. Il peut aussi s'agir, par exemple, d'un canyon dans une zone extérieure, ou d'une plus petite partie d'une salle concave. Avec un peu d'imagination, vous pouvez utiliser le système dans presque tous les scénarios.

Pourquoi convexe ?

La raison pour laquelles les salles sont définies comme des volumes convexes (ou enveloppe convexe comme on les appelle), est que, mathématiquement, il est très simple de déterminer si un point se situe à l'intérieur d'une enveloppe convexe. Une simple vérification de plan vous donnera la distance d'un point par rapport à un plan. Si un point se situe derrière tous les plans délimitant une enveloppe convexe, alors par définition, il se trouve à l'intérieur de la salle. Cela facilite toutes sortes de chose dans les fonctions internes du système, comme la vérification de la salle dans laquelle se situe une caméra.

Une enveloppe convexe. L'enveloppe est définie comme une série de plans orientés vers l'extérieur. Si un point se situe derrière tous les plans, il est à l'intérieur de l'enveloppe.

../../../_images/convex_hull.png

Pourquoi sans chevauchement ?

Si deux salles se chevauchent, et qu'une caméra ou un joueur est dans cette zone de chevauchement, alors il n'y a aucun moyen de savoir dans quelle salle l'objet doit se trouver (et donc être rendu), ou dans quelle salle il doit être rendu. Cette exigence de salles qui ne se chevauchent a des répercussions sur le level design.

Si vous créez accidentellement des salles qui se chevauchent, l'éditeur affichera un avertissement lorsque vous convertissez les salles, et indiquera les zones qui se chevauchent en rouge.

../../../_images/room_overlap.png

Le système essaie de gérer au mieux les salles qui se chevauchent en rendant la salle actuelle "collante". Chaque objet se souvient de la salle dans laquelle il se trouvait pendant la dernière image, et reste dedans tant qu'il ne sort pas de la limite de l'enveloppe convexe de la salle. Cela peut entraîner un oscillement dans ces zones qui se chevauchent.

Il existe toutefois une exception pour les salles internes. Vous n'avez pas à vous en préoccuper pour l'instant.

Comment créer une room ?

Une Room est un type de nœud qui peut être ajouté à l'arbre de scènes comme n'importe quel autre. Vous pouvez placer des objets dans la salle en les faisant enfants ou petits-enfants du nœud Room.

Comment définir la forme et la position de l'enveloppe convexe de ma salle ?

Parce que la définition de la limite de la salle est l'aspect le plus important du système, il y a TROIS méthodes disponibles pour définir la forme d'une salle dans Godot :

  1. Utiliser la géométrie des objets contenus dans la pièce pour créer automatiquement une limite approximative.

  2. En modifiant manuellement les points qui définissent l'enveloppe convexe, dans l'inspecteur de la salle, ou en faisant glisser les points à l'aide du gadget d'édition (voir Modification des points de la salle).

  3. Founir une limite manuelle. Il s'agit d'un MeshInstance dans la salle qui possède une géométrie ayant la forme de la limite désirée, avec -bound à la fin du nom. C'est une option que vous pourriez choisir si vous créez vos niveaux dans Blender ou un logiciel similaire (voir Création de systèmes de salles dans Blender (ou un autre outil de modélisation)).

Si la première option peut suffire, notamment pour les pièces simples, ou pour la pré-production, la puissance des limites manuelles vous offre un contrôle ultime (au prix d'un léger travail d'édition). Vous pouvez également combiner les deux approches, en utilisant par exemple les limites automatiques pour la plupart des salles, mais en modifiant manuellement les zones problématiques.

La méthode automatique est utilisée par défaut quand aucune limite manuelle n'est fournie.

Une simple paire de pièces. La marge du portail est représentée en rouge translucide, et les bords des pièces sont représentées en fil de fer vert.

../../../_images/simple_room.png

Portals

Si vous créez quelques pièces, y placez des objets, puis convertissez le niveau dans l'éditeur, vous verrez les objets des pièces apparaître et s'afficher lorsque vous vous déplacerez entre les pièces. Il y a cependant un problème ! Bien que vous puissiez voir les objets dans la pièce où se trouve la caméra, vous ne pouvez pas voir les pièces voisines ! Pour cela, nous avons besoin de portails.

Portal les portails sont des polygones convexes spéciaux. Vous les positionnez sur les ouvertures entre les pièces, afin de permettre au système de voir entre elles. Vous pouvez créer un nœud portail directement dans l'éditeur. Le portail par défaut a 4 points et se comporte comme un plane MeshInstance. Vous pouvez ajouter ou supprimer des points en utilisant l'inspecteur. Un portail nécessitera au moins 3 points pour fonctionner - c'est parce qu'il doit former un polygone plutôt qu'un point ou une ligne.

Pour économiser l'effort d'édition, un seul Portal est nécessaire entre chaque paire de pièces. Vous n'avez pas besoin de (et en fait ne devriez pas) créer deux Portails qui se chevauchent dans des directions opposées. Par défaut, les portails sont bidirectionnels (mais vous pouvez les rendre unidirectionnels dans l'inspecteur de Portal).

Vous devez donc placer un portail dans une seule de chaque paire de pièces voisines - c'est la "pièce source" du portail. En général, la pièce source choisie n’a pas d’importance. La normale du portail (la flèche dans le gizmo) doit être orientée vers l'extérieur de la pièce source.

../../../_images/portal_inspector.png

Ne soyez pas confus par la flèche. Bien que la flèche indique la direction vers laquelle le portail est orienté, la plupart des portails sont à double sens, et peuvent être vus depuis les deux directions. La flèche est plus importante pour s'assurer que le portail est lié à la bonne pièce voisine.

Liaison de Portal

Il existe deux possibilités pour spécifier la salle à laquelle le portail doit être lié.

  • Laissez Linked Room dans l'inspecteur vide. Le système tentera d'autolink le portail vers la pièce voisine la plus proche pendant la conversion. Cela fonctionne bien dans la plupart des cas.

  • Vous pouvez spécifier explicitement la pièce en définissant Linked Room dans l'inspecteur.

Note

Les portails sont définis comme un ensemble de points en 2D. Cela garantit que le polygone formé est dans un seul plan. La transformation détermine l'orientation du portail. Les points doivent également former un polygone convexe. Ceci est appliqué en validant les points que vous spécifiez, en ignorant ceux qui ne forment pas une forme convexe. Cela facilite l'édition tout en rendant difficile la rupture du système.

Testez-le

Vous devriez maintenant être capable de créer quelques pièces, d'ajouter des nœuds tels que MeshInstances dans les pièces et d'ajouter un portail entre les pièces. Essayez de convertir les pièces dans l'éditeur, et voyez si vous pouvez maintenant voir les objets dans les pièces voisines, à travers le portail.

../../../_images/simple_scenetree.png

Vous avez maintenant maîtrisé les principes de base du système.

L'étape suivante consiste à examiner les différents types d'objets qui peuvent être gérés par le système.