Up to date

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

Процедурная геометрия

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.

Примечание

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

Что такое геометрия?

Геометрия - это причудливый способ обозначения формы. В компьютерной графике геометрия обычно представлена массивом позиций, называемых "вершинами". В Godot геометрия представлена сетками (Meshes).

Что такое меш?

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.

Что такое Сетка

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.

Поверхности

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.

Массив поверхности

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.

Массив поверхности может быть индексированным или неиндексированным. Создать неиндексированный массив так же просто, как не назначать массив по индексу ArrayMesh.ARRAY_INDEX. Неиндексированный массив хранит уникальную информацию о вершине для каждого треугольника, что означает, что когда два треугольника имеют общую вершину, эта вершина дублируется в массиве. Индексированный массив поверхностей хранит информацию о вершинах только для каждой уникальной вершины, а затем также хранит массив индексов, которые указывают, как построить треугольники из массива вершин. В целом, использование индексированного массива быстрее, но это означает, что вам придётся обмениваться вершинными данными между треугольниками, что не всегда желательно (например, когда вам нужны нормали для каждой грани).

Инструменты

Godot предоставляет различные способы доступа к геометрии и работы с ней. Более подробная информация по каждому из них будет предоставлена в следующих уроках.

ArrayMеsh

Ресурс ArrayMesh расширяет Mesh, добавляя несколько различных функций качества жизни и, самое главное, возможность построения поверхности Mesh с помощью скриптов.

Для получения дополнительной информации об ArrayMesh, пожалуйста, смотрите ArrayMesh tutorial.

Инструмент "Данные Меша"

MeshDataTool - это ресурс, преобразующий данные Mesh в массивы вершин, граней и ребер, которые могут быть изменены во время выполнения.

Более подробную информацию о MeshDataTool можно найти в MeshDataTool tutorial.

SurfaceTool (Инструмент поверхности)

Инструмент SurfaceTool позволяет создавать сетки, используя интерфейс OpenGL 1.x в стиле немедленного режима.

Для получения дополнительной информации о SurfaceTool, пожалуйста, обратитесь к 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.

Какой из них мне следует использовать?

Какой подход вы используете, зависит от того, что вы пытаетесь сделать и какой вид процедуры вам удобен.

И SurfaceTool, и ArrayMesh отлично подходят для создания статической геометрии (сетки), которая не меняется со временем.

Использование ArrayMesh немного быстрее, чем использование SurfaceTool, но API немного сложнее. Кроме того, SurfaceTool имеет несколько методов качества жизни, таких как generate_normals() и 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.

MeshDataTool не является быстрым, но он даёт вам доступ ко всем видам свойств сетки, которые вы не можете получить с помощью других инструментов (рёбра, грани и т.д.). Он невероятно полезен, когда вам нужны такие данные для преобразования сетки, но его не стоит использовать, если эта дополнительная информация не нужна. Инструмент MeshDataTool лучше использовать, если вы собираетесь использовать алгоритм, требующий доступа к массиву граней или рёбер.