Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

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

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

Примітка

Усі описані тут методи створення процедурної геометрії працюють на ЦП. Godot ще не підтримує генерування геометрії на GPU.

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

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

Що таке Меш?

Багато речей у Godot мають сітку в назві: Mesh, ArrayMesh, ImmediateMesh, MeshInstance3D, MultiMesh і MultiMeshInstance3D. Хоча всі вони споріднені, вони мають дещо різне використання.

Меші та ArrayMeshes — це ресурси, які малюються за допомогою вузла MeshInstance3D. Такі ресурси, як Meshes і ArrayMeshes, не можна додавати безпосередньо до сцени. MeshInstance3D представляє один екземпляр сітки у вашій сцені. Ви можете повторно використовувати одну сітку в кількох MeshInstance3D, щоб намалювати її в різних частинах сцени за допомогою різних матеріалів або трансформацій (масштаб, обертання, положення тощо).

Якщо ви збираєтеся малювати той самий об’єкт багато разів, може бути корисним використання MultiMesh із MultiMeshInstance3D. MultiMeshInstance3D малює сітки тисячі разів дуже дешево, користуючись перевагами створення екземплярів апаратного забезпечення. Недоліком використання MultiMeshInstance3D є те, що кожна поверхня вашої сітки обмежена одним матеріалом для всіх екземплярів. Він використовує масив екземплярів для зберігання різних кольорів і трансформацій для кожного екземпляра, але всі екземпляри кожної поверхні використовують той самий матеріал.

Чим є Меш

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

Поверхні

Кожна поверхня має свій матеріал. Крім того, ви можете змінити матеріал для всіх поверхонь у Mesh, коли використовуєте MeshInstance3D за допомогою властивості material_override.

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

Масив поверхні — це масив довжини ArrayMesh.ARRAY_MAX. Кожна позиція в масиві заповнюється підмасивом, що містить інформацію для кожної вершини. Наприклад, масив, розташований у ArrayMesh.ARRAY_NORMAL, є PackedVector3Array нормалей вершин. Перегляньте Mesh.ArrayType для отримання додаткової інформації.

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

Інструменти

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

Масив Mesh

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

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

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

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

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

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

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

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

Негайна сітка

ImediateMesh — це сітка, яка використовує інтерфейс стилю негайного режиму (наприклад, SurfaceTool) для малювання об’єктів. Різниця між ImmediateMesh і SurfaceTool полягає в тому, що ImmediateMesh малюється безпосередньо за допомогою коду динамічно, тоді як SurfaceTool використовується для створення сіті, з якою ви можете робити все, що завгодно.

ImediateMesh корисний для створення прототипів через його простий API, але він повільний, оскільки геометрія перебудовується щоразу, коли ви вносите зміни. Це найбільш корисно для додавання простої геометрії для візуального налагодження (наприклад, шляхом малювання ліній для візуалізації фізичних променів тощо).

Щоб дізнатися більше про ImmediateMesh, перегляньте підручник ImmediateMesh.

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

Який підхід використовувати, залежить від того, що ви намагаєтеся зробити і який варіант вам зручніший.

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

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

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

MeshDataTool не швидкий, але він дає вам доступ до всіх видів властивостей меша, які ви не отримуєте з іншими (ребра, грані тощо). Це неймовірно корисно, коли вам потрібні такі дані для перетворення меша, але не варто використовувати його, якщо ця інформація не потрібна. MeshDataTool найкраще використовувати, якщо ви збираєтеся використовувати алгоритм, який вимагає доступу до масиву граней та ребр.