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

Є багато способів процедурно генерувати геометрію в Godot. У цій серії уроків ми розглянемо деякі з них. Кожна методика має свої переваги і недоліки, тому краще зрозуміти кожну і мати уявлення, як вона може бути корисна в тій, чи іншій, ситуації.

Що таке геометрія?

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

Що таке Меш?

Багато речей в Godot мають слово "mesh" в своїй назві: Mesh, ArrayMesh, MeshInstance, MultiMesh і MultiMeshInstance. Хоча всі вони пов'язані між собою, у них дещо різне використання.

Mesh і ArrayMesh - це ресурси, які малюються за допомогою вузла MeshInstance. Ресурси, такі як Mesh і ArrayMesh, не можуть бути додані до безпосередньо сцени. MeshInstance являє собою один зразок меша у вашій сцені. Ви можете повторно використовувати один меш в декількох MeshInstance, щоб намалювати його в різних частинах вашої сцени з різними матеріалами, або перетвореннями (масштаб, обертання, положення і т. д.).

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.

Чим є Меш

Меш складається з однієї, або декількох, поверхонь. Поверхня - це масив, що складається з декількох під-масивів, що містять вершини, нормалі, UV, тощо. Зазвичай процес побудови поверхонь і мешів прихований від користувача в VisualServer, але за допомогою ArrayMesh користувач може побудувати Меш вручну, створивши масив, що містить інформацію про поверхню.

Поверхні

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.

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

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.

Масив поверхні може бути проіндексований, або неіндексований. Створити неіндексований масив так само просто, як не призначити масиву індекс ArrayMesh.ARRAY_INDEX. Неіндексований масив зберігає унікальну інформацію про вершину для кожного трикутника, а це означає, що коли два трикутники мають вершину, вершина дублюється в масиві. Індексований масив поверхні зберігає лише інформацію про вершину для кожної унікальної вершини, а потім також зберігає масив індексів, які відображають, як побудувати трикутники з масиву вершин. Загалом, використання індексованого масиву є швидшим, але це означає, що ви повинні ділитися даними вершини між трикутниками, що не завжди бажано (наприклад, коли ви хочете лицьові нормалі).

Інструменти

Godot надає різні способи доступу та роботи з геометрією. Детальніша інформація про кожен буде висвітлена в наступних уроках.

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.

Для отримання додаткової інформації про ArrayMesh, будь ласка, перегляньте урок про ArrayMesh.

MeshDataTool (Інструмент Дані Меша)

MeshDataTool - це ресурс, який перетворює дані Меша на масиви вершин, граней і ребр, які можна змінити під час виконання.

Для отримання додаткової інформації про MeshDataTool, будь ласка, перегляньте урок про MeshDataTool.

SurfaceTool (Інструмент Поверхні)

SurfaceTool дозволяє створювати Меші за допомогою інтерфейсу стилю негайного режиму OpenGL 1.x.

Для отримання додаткової інформації про SurfaceTool, будь ласка, перегляньте урок про SurfaceTool.

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

Для отримання додаткової інформації про ImmediateGeometry, будь ласка, перегляньте урок про ImmediateGeometry.

Який з них я повинен використовувати?

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

Як SurfaceTool, так і ArrayMesh, відмінно підходять для генерації статичної геометрії (мешів), які не змінюються з часом.

Використання ArrayMesh трохи швидше, ніж використання SurfaceTool, але API трохи складніше. Крім того, SurfaceTool має кілька методів якості, таких як generate_normals() і index().

ImmediateGeometry регенерує меш кожен кадр, тому набагато повільніший, за ArrayMesh, або SurfaceTool. Однак, якщо вам потрібна геометрія, яка змінюється кожен кадр, цей спосіб забезпечує набагато простіший інтерфейс, який може бути навіть трохи швидшим, ніж генерування ArrayMesh-а кожного кадру.

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.