- PVSM.RU - https://www.pvsm.ru -
(Дисклеймер переводчика: на всякий случай не советую читать эту статью во время еды.)
Когда я начинаю участвовать в геймджемах, то вхожу в режим «максимального ускорения», который обычно заканчивается ужасными понедельниками на работе после бессонных ночей. Чем старше становлюсь, тем сложнее для меня набраться энтузиазма для участия. К счастью, PROCJAM [1] очень расслабленный, что идеально мне подходит. Кроме того, читерство там совершенно не запрещено, поэтому я мог, например, вернуть из небытия мой генератор органов, над которым я работал несколько месяцев назад для Bestiarium и создать свой прототип на его основе.
Пока я готовлю версию для Vive, можно поиграть в De daemonici corporis fabrica [2] на моей странице на itch.io.
Несмотря на то, что я не прикасался к нему уже довольно долго, в Bestiarium есть впечатляющий набор идей, живших в моей голове. Но сама игра основана на немногих «философских» пунктах. Я всегда видел её как «roguelike из одной комнаты», поэтому пространство для исследований неизбежно перемещалось «снаружи» «внутрь», что идеально описывается этой поэмой Уильяма Блейка:
Небо синее — в цветке,
В горстке праха — бесконечность;
Целый мир держать в руке,
В каждом миге видеть вечность.
Такие проекты, по-моему, получаются гораздо более интересными, если интерпретировать всё буквально. Поэтому я решил двинуться в сторону «внутренностей».
Одна из основных механик игры включает в себя извлечение материалов из существ, которых вы можете вызывать. Можно пойти стандартным путём и вытаскивать из них «кроличьи лапки» и «паучьи глаза», но наша игра ещё и про науку. Как и в науке, в ней часты пробы и ошибки (а большинство времени занято тяжёлым трудом).
Вот каким был один из пунктов в моих записях о дизайне с пометкой «наверно не сработает»: анатомирование существ для извлечения из них органов. PROCJAM, очевидно, был идеальным оправданием для создания прототипа на основе этой идеи и её проверки.
De daemonici corporis fabrica [2] (демоническая версия De humani corporis fabrica [3]) пытается передать ощущения древних учёных, впервые разрезающих труп. Что-то вроде «интересно, зачем нужна эта комковатая сморщенная штука?» Но я отвлёкся. Этот пост посвящён технической стороне игры. Всё началось с того… как, чёрт возьми, можно вообще процедурно генерировать органы?
Всё началось много месяцев назад с ночи просмотра видео о вскрытии животных (большинство исследований по этой теме напомнило мне об этой статье [4] на Gamasutra). Разумеется, я мог продолжить генерировать трупы с заранее созданными моделями органов. Но я только что добавил генератор имён на цепях Маркова в прототип Invocation [5], и это заставило меня задуматься: может быть, стоит использовать их для генерирования органов, которые больше похожи на «реальные»?
Для цепей Маркова нам нужно несколько начальных образцов:
Да, невероятные шаблоны размером 8×8 пикселей, которые, если прищуриться, немного напоминают органы. Сначала я закодировал черные и белые пиксели как нули и единицы в строке, а затем передал её в цепь Маркова — это, как я почти был уверен, не сработает, но я хотел применить пошаговый подход.
И знаете что? Да, я был прав, создались глитчевые текстуры, потому что изображениям нужна двухмерная целостность. Поэтому следующим шагом стало кодирование изображения в группы целых двухмерных позиция для всех белых пикселей. Так на самом деле получилось сгенерировать несколько интересных результатов, достаточно убедительных вариаций входной информации.
Ну ладно, у нас получились органоподобные формы, но у них низкое разрешение и они двухмерны. Как добавить им ещё одно измерение? Первое, что приходит в голову — использование метасфер [6].
У меня есть привычка жадной работы над прототипами и геймджемами. Поэтому вместо возврата назад и доведения до ума метасфер, я решил добавить поверх сгенерированной сетки алгоритм сглаживания сеток.
И посмотрите-ка на это. Уверен, что у меня просто парейдолия [9], но я чётко вижу селезёнку, лёгкое, печень… селезёнку… и… ну, всякие органоподобные формы.
Когда настало время текстурирования, я снова решил срезать углы и избежать создания UV-развёртки этих штук. Я провёл несколько экспериментов с функциями 3D-шума (вы можете взять шейдеры шума, портированные мной из этого репозитория [10] в удобном и едва протестированном CGINC for Unity [11]). Они выглядели довольно хорошо (и я, возможно, где-нибудь их использую), но дешёвое решение стало очень затратным, когда потребовалось создание для текстур карт нормалей.
В результате достаточно хорошей оказалась простая плоскостная UV-карта (созданная расположением координат вершин XZ, нормализованных в пространстве UV). Я смог воспользоваться нарисованными текстурами (которые не только вызвали у меня отвращение при поиске фотоисточников, но и были ретвитнуты Polycount).
— Какие у тебя планы на вечер субботы?
— Ну, знаешь, как обычно, буду рисовать бесшовные текстуры кишок, и всё такое.
М-м-м, сосисочки!
Итак, органы сгенерированы. Но как теперь засунуть их в старого доброго беса? Вскрытие грудной клетки — это довольно просто: нужно лишь добавить ещё одну ключевую фазу морфинга в модель беса. Но как разместить там органы?
Сначала я думал, что придётся создавать очень сложный алгоритм определения границ, проверяющий, всё ли «упаковано» правильно. В результате оказалось, что достаточно добавить точки спауна органов на костях существа. Но всё ещё остаётся проблема: они вылезают за пределы тела, как видно в областях, обведённых красным.
Сетка маски (зелёная) совершенно плоская, и если внимательно присмотреться, можно заметить её границы. Но даже при движении общий эффект достаточно хорош.
Автор: PatientZero
Источник [16]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/razrabotka-igr/216043
Ссылки в тексте:
[1] PROCJAM: http://procjam.com/
[2] De daemonici corporis fabrica: https://yanko.itch.io/dissection
[3] De humani corporis fabrica: https://ru.wikipedia.org/wiki/%D0%9E_%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B8_%D1%87%D0%B5%D0%BB%D0%BE%D0%B2%D0%B5%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B5%D0%BB%D0%B0
[4] этой статье: http://www.gamasutra.com/view/news/252241/How_working_on_gross_violent_games_can_mess_with_developers.php
[5] Invocation: https://yanko.itch.io/invocation-toy
[6] метасфер: https://ru.wikipedia.org/wiki/Metaball
[7] алгоритм шагающих кубиков: https://ru.wikipedia.org/wiki/Marching_cubes
[8] фильтр сеток из Unity Wiki: http://wiki.unity3d.com/index.php?title=MeshSmoother
[9] парейдолия: https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%80%D0%B5%D0%B9%D0%B4%D0%BE%D0%BB%D0%B8%D1%8F
[10] из этого репозитория: https://github.com/stegu/webgl-noise/wiki
[11] CGINC for Unity: http://pastebin.com/JqGgG5k6
[12] #screenshotsaturday: https://twitter.com/hashtag/screenshotsaturday?src=hash
[13] #gamedev: https://twitter.com/hashtag/gamedev?src=hash
[14] pic.twitter.com/4ZktlppojH: https://t.co/4ZktlppojH
[15] November 5, 2016: https://twitter.com/yankooliveira/status/795031072585162753
[16] Источник: https://habrahabr.ru/post/316604/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.