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

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

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

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

Що таке Меш?

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

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

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

Чим є Меш

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

Поверхні

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

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

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

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

Інструменти

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

ArrayMesh

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

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

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

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

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

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

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

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

ImmediateGeometry (Безпосередня Геометрія)

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

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

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

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

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

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

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

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

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