Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Geometría procedural

There are many ways to procedurally generate geometry in Godot. In this tutorial series, we will explore a few of them. Each technique has its own benefits and drawbacks, so it is best to understand each one and how it can be useful in a given situation.

Nota

All the procedural geometry generation methods described here run on the CPU. Godot doesn't support generating geometry on the GPU yet.

¿Qué es geometría?

La geometría es una forma elegante de decir formas. En los gráficos por ordenador, la geometría se representa típicamente por una serie de posiciones llamadas "vértices". En Godot, la geometría es representada por Meshes.

¿Qué es una Mesh?

Many things in Godot have mesh in their name: the Mesh, the ArrayMesh, the ImmediateMesh, the MeshInstance3D, the MultiMesh, and the MultiMeshInstance3D. While they are all related, they have slightly different uses.

Meshes and ArrayMeshes are resources that are drawn using a MeshInstance3D node. Resources like Meshes and ArrayMeshes cannot be added to the scene directly. A MeshInstance3D represents one instance of a mesh in your scene. You can reuse a single mesh in multiple MeshInstance3Ds to draw it in different parts of your scene with different materials or transformations (scale, rotation, position etc.).

If you are going to draw the same object many times, it can be helpful to use a MultiMesh with a MultiMeshInstance3D. MultiMeshInstance3Ds draw meshes thousands of times very cheaply by taking advantage of hardware instancing. The drawback with using a MultiMeshInstance3D 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é es una Mesh

A Mesh is composed of one or more surfaces. A surface is an array composed of multiple sub-arrays containing vertices, normals, UVs, etc. Normally the process of constructing surfaces and meshes is hidden from the user in the RenderingServer, but with ArrayMeshes, the user can construct a Mesh manually by passing in an array containing the surface information.

Caras

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

Array de las caras

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 PackedVector3Array of vertex normals. See Mesh.ArrayType for more information.

El array de superficie puede ser indexado o no indexado. Crear un array no indexado es tan fácil como no asignar un array en el índice ArrayMesh.ARRAY_INDEX. Un array no indexado almacena información única de vértices para cada triángulo, lo que significa que cuando dos triángulos comparten un vértice, el vértice se duplica en el array. Un array con superficie indexada sólo almacena información de vértices para cada vértice único y luego también almacena un array de índices que traza el mapa de cómo construir los triángulos a partir del array de vértices. En general, el uso de un array indexado es más rápido, pero significa que hay que compartir los datos de vértices entre los triángulos, lo que no siempre es deseado (por ejemplo, cuando se quieren utilizar normales por cara).

Herramientas

Godot ofrece diferentes formas de acceder y trabajar con geometría. Se proporcionará más información sobre cada una de ellas en los siguientes tutoriales.

ArrayMesh

El recurso ArrayMesh extiende el Mesh para añadir unas cuantas funciones diferentes de calidad de vida, y lo más importante, la capacidad de construir una superficie de Mesh a través de scripts.

Para más información sobre ArrayMesh, lee ArrayMesh tutorial.

MeshDataTool

El MeshDataTool es un recurso que convierte los datos del Mesh en arrays de vértices, caras y bordes que pueden ser modificados en tiempo de ejecución.

Para más información sobre MeshDataTool, lee MeshDataTool tutorial.

SurfaceTool

La clase SurfaceTool permite la creación de mallas utilizando una interfaz estilo "OpenGL 1.x immediate mode".

Para más información sobre SurfaceTool, por favor lee el 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 is useful for prototyping because of its straightforward API, but it is slow because the geometry is rebuilt each time you make a change. It is most useful for adding simple geometry for visual debugging (e.g. by drawing lines to visualize physics raycasts etc.).

For more information about ImmediateMesh, please see the ImmediateMesh tutorial.

¿Cuál método debería usar?

El enfoque que elijas depende de lo que estés tratando de hacer y de qué tipo de procedimiento te sientas más cómodo.

Tanto SurfaceTool como ArrayMesh son excelentes para generar geometría estática (meshes) que no cambian con el tiempo.

Usar un ArrayMesh es ligeramente más rápido que usar una SurfaceTool, pero la API es más desafiante. Además, SurfaceTool tiene algunos métodos de calidad de vida como generate_normals() e 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.

El MeshDataTool no es rápido, pero te da acceso a todo tipo de propiedades del mesh que no consigues con los otros (bordes, caras, etc.). Es increíblemente útil cuando se necesita ese tipo de datos para transformar la malla, pero no es una buena idea utilizarlo si esa información no es necesaria. El MeshDataTool se utiliza mejor si se va a utilizar un algoritmo que requiere el acceso al array de caras o bordes.