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.

¿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?

Muchas cosas en Godot tienen un mesh en su nombre: el Mesh, el ArrayMesh, el MeshInstance, el MultiMesh, y el MultiMeshInstance. Aunque todos están relacionados, tienen usos ligeramente diferentes.

Meshes y ArrayMeshes son recursos que se dibujan usando un nodo de MeshInstance. Recursos como Meshes y ArrayMeshes no pueden ser añadidos a la escena directamente. Un MeshInstance representa una instancia de un mesh en tu escena. Puedes reutilizar una solo mesh en múltiples MeshInstance para que se dibuje en diferentes partes de tu escena con diferentes materiales o transformaciones (escala, rotación, posición, etc.).

Si vas a dibujar el mismo objeto muchas veces, puede ser útil usar una MultiMesh con una MultiMeshInstance. La MultiMeshInstance dibuja mallas miles de veces muy asequibles. Se aprovecha de la instanciación del hardware para hacerlo. El inconveniente de usar una MultiMeshInstance es que se limita a un material para todas las instancias. Utiliza un array de instancias para almacenar diferentes colores y transformaciones para cada instancia, pero todas las instancias utilizan el mismo material.

Qué es una Mesh

Un Mesh está compuesto de una o más caras. Una cara es un conjunto compuesto de múltiples sub-arrays que contienen vértices, normales, UVs, etc. Normalmente el proceso de construcción de superficies y mallas está oculto para el usuario en el VisualServer, pero con ArrayMeshes, el usuario puede construir una Mesh manualmente pasando un array que contiene la información de la superficie.

Caras

Cada superficie tiene su propio material. También puedes anular el material para todas las superficies del Mesh cuando utilices una MeshInstance usando MeshInstance.override_material.

Array de las caras

El array de superficie es un array de longitud ArrayMesh.ARRAY_MAX. Cada posición en el array está llena de un sub-array que contiene información por vértice. Por ejemplo, el array situado en ArrayMesh.ARRAY_NORMAL es un PoolVector3Array de vértices normales.

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 provides different ways of accessing and working with geometry. More information on each will be provided in the following tutorials.

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

The SurfaceTool allows the creation of Meshes using an OpenGL 1.x immediate mode style interface.

Para más información sobre SurfaceTool, por favor lee el 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. The SurfaceTool generates a Mesh that needs to be added a MeshInstance to be seen.

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

Para más información sobre ImmediateGeometry, por favor lee el ImmediateGeometry tutorial.

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

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

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

ImmediateGeometry regenera el mesh en cada cuadro, por lo que es mucho más lento que ArrayMesh o SurfaceTool. Sin embargo, si necesitas que la geometría cambie cada cuadro igualmente, proporciona una interfaz mucho más fácil que puede ser incluso un poco más rápida que la generación de un ArrayMesh en cada cuadro.

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.