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.).

If you are going to draw the same object many times, it can be helpful to use a MultiMesh with a MultiMeshInstance. MultiMeshInstances draw meshes thousands of times very cheaply by taking advantage of hardware instancing. The drawback with using a MultiMeshInstance is that each of your mesh's surfaces are limited to one material for all instances. It uses an instance array to store different colors and transformations for each instance, but all the instances of each surface use the same material.

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

Each surface has its own material. Alternatively, you can override the material for all surfaces in the Mesh when you use a MeshInstance using the material_override property.

Tableau de surface

The surface array is an array of length ArrayMesh.ARRAY_MAX. Each position in the array is filled with a sub-array containing per-vertex information. For example, the array located at ArrayMesh.ARRAY_NORMAL is a PoolVector3Array of vertex normals. See Mesh.ArrayType for more information.

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

The ArrayMesh resource extends Mesh to add a few different quality of life functions and, most importantly, the ability to construct a Mesh surface through scripting.

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 is a node that uses an immediate mode style interface (like SurfaceTool) to draw objects. The difference between ImmediateGeometry and the SurfaceTool is that ImmediateGeometry is a node itself that can be added to the scene tree and is drawn directly from the code, while the SurfaceTool generates a Mesh that needs to be added to a MeshInstance to be seen.

ImmediateGeometry is useful for prototyping because of its straightforward API, but it is slow because the geometry is rebuilt every frame. It is most useful for adding simple geometry for visual debugging (e.g. by drawing lines to visualize physics raycasts etc.).

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

Lequel dois-je utiliser ?

Which approach you use depends on what you are trying to do and what kind of procedure you are comfortable with.

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.

The MeshDataTool is not fast, but it gives you access to all kinds of properties of the mesh that you don't get with the others (edges, faces, etc.). It is incredibly useful when you need that sort of data to transform the mesh, but it is not a good idea to use it if that extra information is not needed. The MeshDataTool is best used if you are going to be using an algorithm that requires access to the face or edge array.