Важливо те, що всередині: про процедурної генерації органів

image

(Дисклеймер перекладача: на всякий випадок не раджу читати цю статтю під час їди.)

Коли я починаю брати участь у геймджемах, то входжу в режим максимального прискорення», який зазвичай закінчується жахливими понеділками на роботі після безсонних ночей. Чим старше стаю, тим складніше для мене набратися ентузіазму для участі. На щастя, PROCJAM дуже розслаблений, що ідеально мені підходить. Крім того, чітерство там абсолютно не заборонено, тому я міг, наприклад, повернути з небуття мій генератор органів, над яким я працював кілька місяців тому для Bestiarium і створити свій прототип на його основі.


Поки я готую версію для Vive, можна пограти в De daemonici corporis fabrica на моїй сторінці на itch.io.

Незважаючи на те, що я не торкався до нього вже досить довго, Bestiarium є вражаючий набір ідей, які жили в моїй голові. Але сама гра заснована на небагатьох «філософських» пунктах. Я завжди бачив її як «roguelike з однієї кімнати», тому простір для досліджень неминуче переміщалося «зовні» «всередину», що ідеально описується цією поемою Вільяма Блейка:

Небо синє — в квітці,
У жменьці праху — нескінченність;
Цілий світ тримати в руці,
У кожному миті бачити вічність.
Такі проекти, по-моєму, виходять набагато більш цікавими, якщо інтерпретувати все буквально. Тому я вирішив рушити в бік «нутрощів».


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

Ось яким був один з пунктів в моїх записах про дизайні з позначкою «напевно не спрацює»: анатомування істот для витягу з них органів. PROCJAM, очевидно, був ідеальним виправданням для створення прототипу на основі цієї ідеї та її перевірки.

De daemonici corporis fabrica (демонічна версія De humani corporis fabrica) намагається передати відчуття стародавніх вчених, вперше розрізаючих труп. Щось на зразок «цікаво, навіщо потрібна ця грудкувата зморщена штука?» Але я відволікся. Цей пост присвячений технічній стороні гри. Все почалося з того… як, чорт візьми, можна взагалі процедурно генерувати органи?

Все почалося багато місяців тому з ночі перегляду відео про розтині тварин (більшість досліджень з цієї теми нагадало мені про цієї статті на Gamasutra). Зрозуміло, я міг продовжити генерувати трупи з заздалегідь створеними моделями органів. Але я тільки що додав генератор імен на ланцюгах Маркова в прототип Invocation, і це змусило мене замислитися: може бути, варто використовувати їх для генерування органів, які більше схожі на «реальні»?

Для ланцюгів Маркова нам потрібно кілька початкових зразків:

image

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

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



imageЯ вирішив, що потрібно БІЛЬШЕ, тому збільшив розмір зразків до 16×16 пікселів. Виявилося, що 8×8 — оптимальний розмір, тому я не сильно шукав способи підвищення роздільної здатності (і навряд чи в цьому був сенс).

Ну гаразд, у нас вийшли органоподобные форми, але у них низька роздільна здатність і вони двухмерны. Як додати їм ще один вимір? Перше, що приходить в голову — використання метасфер.



imageВ результаті я просто став перетворювати зображення в тривимірну сітку розміром 8x8x1 і передавати її в алгоритм крокуючих кубиків (marching cubes algorithm). Ми отримали 3D, але дуже незграбне.

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



imageЯ просто накинув цей фільтр сіток з Unity Wiki. Це трохи поліпшило форми об'єктів. Але органи все одно були абсолютно плоскими. Тоді я додав трохи випадкових переміщень по осі Y для всіх вершин, які перебувають на плоских поверхнях (тобто нормалі яких направлені рівно вгору або вниз).

І подивіться-но на це. Впевнений, що у мене просто парейдолия, але я чітко бачу селезінку, легені, печінка… селезінку… і… ну, всякі органоподобные форми.

Коли настав час текстурування, я знову вирішив зрізати кути і уникнути створення UV-розгортки цих штук. Я провів декілька експериментів з функціями 3D-шуму (ви можете взяти шейдери шуму, перенені мною з цього репозиторію в зручному і ледь протестованому CGINC for Unity). Вони виглядали досить добре (і я, можливо, де-небудь їх використовую), але дешеве рішення стало дуже витратним, коли знадобилося для створення текстур карт нормалей.


В результаті досить хорошою виявилася проста площинна UV-карта (створена розташуванням координат вершин XZ, нормалізованих в просторі UV). Я зміг скористатися намальованими текстурами (які не тільки викликали в мене огиду при пошуку фотоисточников, але і були ретвитнуты Polycount).

"What are you up to this saturday night?"
"Oh, you know the usual, doing seamless viscera textures and stuff"#screenshotsaturday #gamedev pic.twitter.com/4ZktlppojH  Yanko Oliveira (@yankooliveira) November 5, 2016

— Які у тебе плани на вечір суботи?
— Ну, знаєш, як звичайно, буду малювати безшовні текстури кишок, і все таке.


М-м-м, сосисочки!

imageОтже, органи згенеровані. Але як тепер засунути їх в старого доброго біса? Розтин грудної клітини — це досить просто: потрібно лише додати ще одну ключову фазу морфінга в модель біса. Але як розмістити там органи?

Спочатку я думав, що доведеться створювати дуже складний алгоритм визначення меж, перевіряє, чи все «упаковано» правильно. У результаті виявилося, що достатньо додати точки спауна органів на кістках істоти. Але все ще залишається проблема: вони вилазять за межі тіла, як видно в областях, обведених червоним.



imageБуфер шаблону (stencil buffer) поспішає на допомогу! Можна використовувати буфер шаблонів для створення «маски» області грудної клітини, і рендери органи тільки в цій області.

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



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

image
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.