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.

2D скелети

Вступ

Під час роботи з 3D деформації скелета є звичайним явищем для персонажів і істот, і більшість програм для 3D-моделювання підтримують це. Для 2D, оскільки ця функція використовується не так часто, важко знайти основне програмне забезпечення, призначене для цього.

Одним із варіантів є створення анімацій у програмному забезпеченні сторонніх розробників, наприклад Spine або Dragonbones. Ця функція також підтримується вбудованою.

Чому варто робити скелетну анімацію безпосередньо в Godot? Відповідь полягає в тому, що в цьому є багато переваг:

  • Краща інтеграція з рушієм, тому менше клопоту з імпортом і редагуванням.

  • Здатність керувати системами частинок, шейдерами, звуками, викликами скриптів, кольорами, прозорістю тощо в анімації.

  • Вбудована скелетна система в Godot дуже ефективна і розроблена для продуктивності.

Тому, наступний урок дасть основи деформації 2D скелета.

Налаштування

Дивись також

Перед початком ми рекомендуємо вам переглянути урок Анімація вирізок, щоб отримати загальні уявлення про анімацію в Godot.

Для цього уроку ми будемо використовувати одне зображення для побудови нашого персонажа. Завантажте його з gBot_pieces.png, або збережіть зображення нижче.

../../_images/gBot_pieces.png

Також рекомендується завантажити остаточне зображення персонажа gBot_complete.png, щоб мати зразок для наслідування при складанні різних частин разом.

../../_images/gBot_complete.png

Створення полігонів

Створіть нову сцену для своєї моделі (якщо це буде анімований персонаж, ви можете використати CharacterBody2D). Для зручності використання порожній двовимірний вузол створюється як корінь для багатокутників.

Почнемо з вузла Polygon2D. Поки що немає необхідності розміщувати його десь на сцені, тому просто створіть його таким чином:

../../_images/skel2d1.png

Виділіть його та призначте текстуру частин персонажа, яку ви завантажили раніше:

../../_images/skel2d2.png

Не рекомендується малювати полігон безпосередньо. Натомість відкрийте діалогове вікно "UV" для полігону:

../../_images/skel2d3.png

Перейдіть у режим Точки, виберіть олівець і намалюйте багатокутник навколо потрібного фрагмента:

../../_images/skel2d4.png

Продублюйте вузол полігону та дайте йому відповідну назву. Потім знову відкрийте діалогове вікно "UV" та замініть старий полігон іншим у новому потрібному фрагменті.

Коли ви дублюєте вузли і наступна частина має схожу форму, ви можете редагувати попередній полігон замість того, щоб малювати новий.

Після переміщення багатокутника не забудьте оновити UV, вибравши Редагувати > Копіювати багатокутник в UV у Polygon 2D UV Editor.

../../_images/skel2d5.png

Продовжуйте робити це, поки не зіставите всі частини.

../../_images/skel2d6.png

Ви помітите, що частини тіла для вузлів з'являються в тому ж місці, що і в оригінальній текстурі. Це тому, що за замовчуванням, коли ви малюєте полігон, UV і точки однакові.

Перемістіть частини і сформуйте персонажа. Це має бути досить швидко. Немає необхідності змінювати повороти, тому не турбуйтеся про те, що частини неправильно повернуті; ви можете поки їх не чіпати.

../../_images/skel2d7.png

Ой, візуальний порядок частин ще не правильний, оскільки деякі з них перекривають неправильні частини. Впорядкуйте порядок вузлів, щоб виправити це:

../../_images/skel2d8.png

Ось ви і завершили! Безумовно, це було набагато простіше, ніж у урок з вирізок.

Створення скелета

Створіть вузол Skeleton2D в якості нащадка кореневого вузла. Це буде основа нашого скелета:

../../_images/skel2d9.png

Створіть вузол Bone2D як дочірній елемент скелета. Розмістіть його на стегні (зазвичай скелети починаються тут). Кістка буде спрямована праворуч, але ви можете поки що проігнорувати це.

../../_images/skel2d10.png

Продовжуйте створювати ієрархію кісток і називати їх відповідним чином.

../../_images/skel2d11.png

В кінці цього ланцюжка буде вузол jaw. Він, знову ж таки, дуже короткий і спрямований праворуч. Це нормально для кісток без дочірніх елементів. Довжину кінчиків кісток можна змінити за допомогою властивості в інспекторі:

../../_images/skel2d12.png

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

Продовжуйте рухатися і будувати весь скелет:

../../_images/skel2d13.png

Ви помітите, що всі кістки видають попередження про відсутність пози відпочинку. Поза відпочинку — це стандартна поза скелета, до якої ви можете повернутися в будь-який момент (що дуже зручно для анімації). Щоб її встановити, клацніть на вузлі скелет у дереві сцени, потім натисніть кнопку Skeleton2D на панелі інструментів і виберіть Overwrite Rest Pose (Перезаписати позу відпочинку) з випадаючого меню.

../../_images/skel2d14.webp

Попередження зникнуть. Якщо ви зміните скелет (додасте/видалите кістки), вам потрібно буде встановити позу спокою знову.

Деформація полігонів

Виберіть раніше створені полігони і призначте їх властивості Skeleton вузол скелета. Це гарантує, що вони в кінцевому підсумку можуть бути деформовані ним.

../../_images/skel2d15.png

Клацніть властивість, виділену вище, і виберіть вузол скелета:

../../_images/skel2d16.png

Знову відкрийте UV-редактор для полігону та перейдіть до розділу Кістки.

../../_images/skel2d17.png

Ви ще не зможете малювати ваги. Для цього вам потрібно синхронізувати список кісток зі скелета з полігоном. Цей крок виконується лише один раз і вручну (якщо ви не змінюєте скелет, додаючи/видаляючи/перейменовуючи кістки). Це гарантує, що інформація про такелаж збережеться в полігоні, навіть якщо вузол скелета випадково втрачено або скелет змінено. Натисніть кнопку «Синхронізувати кістки з полігоном», щоб синхронізувати список.

../../_images/skel2d18.png

Список кісток з'явиться автоматично. За замовчуванням ваш полігон не має ваги, призначеної кісткам. Виберіть кістки, яким потрібно присвоїти вагу, і розфарбуйте їх:

../../_images/skel2d19.png

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

../../_images/skel2d20.gif

Після фарбування ваг, анімація кісток (НЕ полігонів!) буде змінювати і згинати полігони. Так як в такому підході вам потрібно анімувати тільки кістки, робота стає набагато простішою!

Проте не все так просто. Спроби анімувати кістки, які згинають полігон, часто дають несподівані результати:

../../_images/skel2d21.gif

Це відбувається тому, що Godot генерує внутрішні трикутники, які з'єднують точки при малюванні полігона. Вони не завжди згинаються так, як ви очікуєте. Щоб вирішити це, потрібно задати підказки в геометрії, щоб уточнити деформацію, якої ви очікуєте.

Внутрішні вершини

Знову відкрийте меню UV для кожної кістки та перейдіть до розділу Точки. Додайте кілька внутрішніх вершин в областях, де ви очікуєте вигин геометрії:

../../_images/skel2d22.png

Тепер перейдіть до розділу Багатокутник та перемалюйте власні багатокутники з більшою деталізацією. Уявіть, що, коли ваші багатокутники згинаються, вам потрібно переконатися, що вони деформуються якомога менше, тому трохи поекспериментуйте, щоб знайти правильне налаштування.

../../_images/skel2d23.png

Як тільки ви почнете малювати, оригінальний полігон зникне, і ви зможете вільно створювати свій власний:

../../_images/skel2d24.png

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

Примітка: Не забувайте, що ваші щойно додані внутрішні вершини також потребують фарбування вагою! Знову перейдіть до розділу Кістки, щоб призначити їх правильним кісткам.

Після налаштування, ви отримаєте набагато кращі результати:

../../_images/skel2d25.gif