Géométrie procédurale

Il existe de nombreuses façons de générer une géométrie de façon procédurale dans Godot. Dans cette série de tutoriels, nous en explorerons quelques-unes. Chaque technique a ses propres avantages et inconvénients, il est donc préférable de comprendre chacune et comment elle peut être utile dans une situation donnée.

Qu'est-ce que la géométrie ?

La géométrie est une façon élégante de dire la forme. En infographie, la géométrie est généralement représentée par un tableau de positions appelées "sommets(vertices)". Dans Godot, la géométrie est représentée par des mailles(Meshes).

Qu'est-ce qu'un Mesh ?

Beaucoup de choses dans Godot ont mesh(maillage) dans leur nom : Mesh, ArrayMesh, MeshInstance, MultiMesh, et MultiMeshInstance. Bien qu'ils soient tous liés, ils ont des utilisations légèrement différentes.

Meshes et ArrayMeshes sont des ressources qui sont dessinées à l'aide d'un nœud MeshInstance. Des ressources comme Meshes et ArrayMeshes ne peuvent pas être ajoutées directement à la scène. Un MeshInstance représente une instance d'un maillage dans votre scène. Vous pouvez réutiliser un seul maillage dans plusieurs MeshInstances pour le dessiner dans différentes parties de votre scène avec différents matériaux ou transformations (échelle, rotation, position, etc.).

Si vous devez dessiner le même objet plusieurs fois, il peut être utile d'utiliser un MultiMesh avec une MultiMeshInstance. Le MultiMeshInstance dessine des mailles des milliers de fois à un coût très avantageux. Pour ce faire, elle tire parti de l'instanciation du matériel. L'inconvénient de l'utilisation d'une MultiMeshInstance est que vous êtes limité à un seul matériau pour toutes les instances. Elle utilise un tableau d'instances pour stocker différentes couleurs et transformations pour chaque instance, mais toutes les instances utilisent le même matériau.

Qu'est-ce qu'un Mesh est

Un Mesh est composé d'une ou plusieurs surfaces. Une surface est un tableau composé de plusieurs sous-tableaux contenant des sommets, des normales, des UV, etc. Normalement, le processus de construction des surfaces et des maillages est caché à l'utilisateur dans le VisualServer, mais avec ArrayMeshes, l'utilisateur peut construire un Mesh manuellement en fournissant un tableau contenant les informations de surface.

Surfaces

Chaque surface a son propre matériau. Vous pouvez également remplacer le matériau de toutes les surfaces du Mesh lorsque vous utilisez un MeshInstance en utilisant MeshInstance.override_material.

Tableau de surface

Le tableau de surface est un tableau de longueur ArrayMesh.ARRAY_MAX. Chaque position dans le tableau est remplie par un sous-tableau contenant des informations par sommet. Par exemple, le tableau situé à ArrayMesh.ARRAY_NORMAL est un PoolVector3Array de normales de sommets.

Le tableau de surface peut être indexé ou non indexé. Créer un tableau non indexé est aussi simple que de ne pas assigner un tableau à l'index ArrayMesh.ARRAY_INDEX. Un tableau non indexé stocke des informations uniques sur les sommets de chaque triangle, ce qui signifie que lorsque deux triangles partagent un sommet, celui-ci est dupliqué dans le tableau. Un tableau de surfaces indexées ne stocke que les informations sur les sommets pour chaque sommet unique, puis stocke également un tableau d'indices qui indique comment construire les triangles à partir du tableau de sommets. En général, l'utilisation d'un tableau indexé est plus rapide, mais cela signifie que vous devez partager les données des sommets entre les triangles, ce qui n'est pas toujours souhaitable (par exemple, lorsque vous voulez des normales par face).

Outils

Godot propose différentes façons d'accéder à la géométrie et de travailler avec elle. Les tutoriels suivants vous fourniront de plus amples informations sur chacune d'entre elles.

ArrayMesh

La ressource ArrayMesh étend de Mesh pour ajouter quelques fonctions de qualité de vie différentes, et surtout, la capacité de construire une surface de Mesh par le biais de scripts.

Pour plus d'informations sur ArrayMesh, consultez le tutoriel ArrayMesh tutorial.

MeshDataTool

Le MeshDataTool est une ressource qui convertit les données de Mesh en tableaux de sommets, de faces et de bords qui peuvent être modifiés à l'exécution.

Pour plus d'informations sur le MeshDataTool, veuillez consulter le tutoriel MeshDataTool tutorial.

SurfaceTool

Le SurfaceTool permet la création de Meshes en utilisant une interface du type mode immédiat OpenGL 1.x.

Pour plus d'informations sur SurfaceTool, consultez le tutoriel SurfaceTool tutorial.

ImmediateGeometry

ImmediateGeometry est un noeud qui utilise une interface de type mode immédiat (comme SurfaceTool) pour dessiner des objets. La différence entre ImmediateGeometry et le SurfaceTool est que ImmediateGeometry est un noeud lui-même, qui peut être ajouté à l'arbre de scène directement depuis le code. Le SurfaceTool génère un Mesh qui doit être ajouté à un MeshInstance pour être visible.

ImmediateGeometry est utile pour le prototypage en raison de la simplicité de l'API, mais elle est lente car la géométrie est reconstruite à chaque image. Elle est surtout utile pour ajouter rapidement une géométrie simple pour déboguer visuellement (par exemple en traçant des lignes pour visualiser les raycasts physique, etc.).

Pour plus d'informations sur ImmediateGeometry, veuillez consulter le tutoriel ImmediateGeometry tutorial.

Lequel dois-je utiliser ?

La méthode que vous utilisez dépend de ce que vous essayez de faire et du type de procédure avec lequel vous êtes à l'aise.

SurfaceTool et ArrayMesh sont tous deux excellents pour générer une géométrie statique (maillages) qui ne change pas avec le temps.

L'utilisation d'ArrayMesh est légèrement plus rapide que celle de SurfaceTool, mais l'API est un peu plus difficile d'utilisation. De plus, SurfaceTool possède quelques méthodes de qualité de vie comme generate_normals() et index().

ImmediateGeometry régénère le maillage à chaque image, ce qui le rend beaucoup plus lent qu' ArrayMesh ou que SurfaceTool. Cependant, si vous avez besoin que la géométrie change chaque image, ImmediateGeometry fournit une interface beaucoup plus facile qui peut même être un peu plus rapide que la génération d'un ArrayMesh à chaque image.

MeshDataTool n'est pas rapide, mais il vous donne accès à toutes sortes de propriétés du maillage auxquelles vous n'avez accès pas avec les autres (bords, faces, etc.). Il est incroyablement utile lorsque vous avez besoin de ce type de données pour transformer le maillage, mais ce n'est pas une bonne idée de l'utiliser si ces informations ne sont pas nécessaires. Il est préférable d'utiliser MeshDataTool si vous allez utiliser un algorithme qui nécessite l'accès au tableau des faces ou des arêtes.