Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
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.
Note
All the procedural geometry generation methods described here run on the CPU. Godot doesn't support generating geometry on the GPU yet.
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, ImmediateMesh, MeshInstance3D, MultiMesh, et MultiMeshInstance3D. 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 MeshInstance3D . Des ressources comme Meshes et ArrayMeshes ne peuvent pas être ajoutées directement à la scène. Un MeshInstance3D représente une instance d'un maillage dans votre scène. Vous pouvez réutiliser un seul maillage dans plusieurs MeshInstance3D 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 MultiMeshInstance3D. Le MultiMeshInstance3D dessine des mailles des milliers de fois à un coût très avantageux. Pour ce faire, elle tire parti de l'instanciation hardware. L'inconvénient de l'utilisation d'une MultiMeshInstance3D 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 RenderingServer, 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 MeshInstance3D en utilisant la propriété material_override.
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 PackedVector3Array de normales de sommets. Voir Mesh.ArrayType pour plus d'informations.
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é ne stocke que les informations sur les sommets pour chaque sommet unique, puis stocke également un tableau d'index 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 Mesh pour ajouter quelques fonctions de qualité de vie, 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.
ImmediateMesh
ImmediateMesh is a mesh that uses an immediate mode style interface (like SurfaceTool) to draw objects. The difference between ImmediateMesh and the SurfaceTool is that ImmediateMesh is drawn directly with code dynamically, while the SurfaceTool is used to generate a Mesh that you can do whatever you want with.
ImmediateMesh est utile pour le prototypage en raison de la simplicité de l'API, mais il est lent car la géométrie est reconstruite à chaque fois que vous faites un changement. Il 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 ImmediateMesh, veuillez consulter le tutoriel ImmediateMesh.
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().
ImmediateMesh is more limited than both ArrayMesh and SurfaceTool. However, if you need the geometry to change every frame anyway, it provides a much easier interface that can be slightly faster than generating an ArrayMesh every frame.
Le 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.