ProGamer
×
×
  • Создать...

Итак, вы задумали сделать генератор…


Ltrees2

Это статья для тех, кто только начинает пробовать себя в разработке генераторов, но подойдет и продвинутым разработчикам, которые хотели бы разложить свои знания по полочкам. Речь пойдет обо всех типах генераторов: шутливых твиттер-ботах, капризных ботах-художниках, генераторах уровней и планет, создателях музыки, архитектуры, поэзии и коктейлей.

Но если генераторов так много, какой можно дать совет? Это зависит от типа генераторов, который вы хотите создать. Я дам вам список вопросов, которые вы должны задать самим себе, а затем советы, соответствующие тем или иным ответам.

Первый вопрос: Что вы хотите создать?

Опишите, что именно будет делать ваш генератор. В этой статье я буду называть это «артефактом», но в действительности это может быть все, что угодно: процедурно сгенерированные птицы, истории, анимированные танцы, рецепты гаспачо, RPG-квесты, шахматные вариации и т.д.

Теперь самое сложное. Вдохните, выдохните и напишите на листке бумаги все, что делает ваш артифакт хорошим? Какими свойствами он должен обладать? «Увлекательный», «Гармоничный», «Играбельный»? Теперь идем глубже: чем специфичней вещь, которую вы хотите создать, тем подробнее ее надо описать. Что значит «увлекательный» уровень? Для Super Mario, Civilization и Bejeweled ответ будет совершенно разным. Свойств, описывающих «хороший роман о любви и паранормальных явлениях в антураже викторианской эпохи» будет гораздо больше, чем свойств, описывающих просто «хороший роман». Генераторы, которые сделать проще всего – это те, где «хороший» артефакт можно описать в виде набора конкретных свойств.

Теперь перевернем этот вопрос вверх тормашками: что делает ваш артефакт «плохим»? Перечислите все – и просто нежелательные свойства, и абсолютно недопустимые. Теперь поставьте галочку рядом с пунктами, которых не должно быть ни в коем случае. Это ваши ограничения. Самые надежные генераторы – это те, что имеют подробно описанные ограничения.

Итак, теперь у вас есть список свойств и ограничений, которые должны и не должны быть у ваших артефактов. Допустим, мы хотим создать генератор с «пространством возможностей» (т.е. универсальный генератор, способный создавать любые типы артефактов), где у большинства артефактов будут хорошие свойства, а у нескольких (или вообще ни у одного) – плохие. Кроме того, нам нужно, чтобы генератор выдавал некий ассортимент артефактов, а не один и тот же идеальный артефакт снова и снова. Однако то, насколько широким будет этот ассортимент, решать вам – дизайнеру. Эта проблема описана здесь Гиллианом Смитом (Gillian Smith) и исследована здесь Майклом Куком (Michael Cook).

Теперь у нас есть база, позволяющая приступить к конструированию методов, с помощью которых создаются артефакты.

Есть, впрочем, и альтернативный подход: описанный выше метод хорош в случае, когда вы заранее знаете, что именно хотите сделать. В ситуации, когда вы участвуете в гейм-джеме, создаете прототип или работаете над сайд-проектом, ничто не мешает включить гибкость и импровизацию! Вы можете начать с создания методов, чтобы выяснить, что «хочет» сделать ваш генератор (т.е. то, какие свойства он генерирует лучше всего), затем поразмыслить, какие из этого могут получиться артефакты, и в конце концов понять, какой в результате может получиться генератор.

Создание «художника в коробке»

Artist-in-a-Box

Когда создавался редактор Spore, его разработчики тесно сотрудничали с командой художников, чтобы понять, как художник или аниматор подходит к скульптингу и текстурированию создаваемого существа. Поняв этот процесс и разработав алгоритм, который мог бы его повторить, они могли бы создать «художника в коробке», способного процедурно генерировать существ такого же качества, что и сделанные самим аниматором. Дизайнер Чэйм Гинголд (Chaim Gingold) объяснил этот процесс в 2007 году на GDC (вот аудиозапись и слайды), а арт-директор Оушен Куигли (Ocean Quigley) использовал похожий процесс в эксперименте по созданию строительных блоков, из которых можно собирать целые города.

Таким образом, имеет смысл сесть рядом с тем, кто умеет делать артефакты, которые вы хотите делать своим генератором, и попросить его, чтобы он показал вам этот процесс. Какие вопросы он себе задает в процессе создания? Как принимает решения? Как он описывает компромиссы между разными решениями? Как он описывает проблемы, которые ему приходится держать в уме? Как он называет элементы, на которыми работает, и все взаимоотношения между ними? К слову, в академическом мире для всего этого есть термин «онтология».

В некоторых областях написаны даже специальные (часто противоречивые) труды, в которых авторы описывают, как именно создаются шедевры в той или иной области – эдакие своды правил. К примеру, в теории музыки есть несколько таких систем: для джазовых импровизаций, гармоничных мелодий в стиле Баха, поп-музыки и т.д. Общие принципы создания нарратива описаны в трудах вроде «Путешествия Героя» или, к примеру, в вики-проекте TV Tropes. У художников за это отвечает золотое сечение, искусство цвета и композиционные правила (правда, я в своей работе не нашла эти труды полезными, но, возможно, вы будете удачливей меня). Ни одна из этих систем не является законченной и не гарантирует, что вы стопроцентно будете создавать хорошие артефакты, но они в любом случае могут послужить чем-то вроде наставников и источников вдохновения.

Итак, спросите себя: как бы эту проблему решил человек?

dress generator

От правил к генеративным методам

К сожалению, знание того, как человек делает что-то – это не то же самое, что научить компьютер сделать что-то. Люди хороши в оценивании, построении догадок и синтезе огромного количества информации о событиях прошлого. Компьютеры знают лишь то, что мы им рассказали (а многие проблемы требуют очень много неявного знания), но они хороши в выполнении расчетов и рассмотрении большого количества возможностей. Поэтому наши методы должны сделать так, чтобы компьютер решал проблемы как человек или, по крайней мере, копировал некоторые человеческие навыки. Методы, которые особенно хороши для создания генераторов (генеративные методы), дадут компьютеру некоторые из нижеперечисленных навыков:

  • Формирование знания о возможных вариантах (навык А)
  • Создание определенной структуры (навык Б)
  • Создание условных правил для выбора вариантов (А2)
  • Создание вариативности в структуре (Б2)
  • Умение задавать себе вопросы об ограничениях (я удовлетворяю этому ограничению?) (навык В)

Распространение

Это самый простой вид генеративных методов. Допустим, у вас есть определенная вещь, и вам нужно раскидать (распространить) ее по определенному пространству или времени. У таких методов, как правило, почти нет общей структуры (Б), но они зачастую очень хороши в выборе вариантов (А). К примеру, можно доработать случайность, тем самым поменяв процент распространения, или воспользоваться «перетасовкой колоды» (кладем все карты в одну колоду, и если какая-то карта будет использована, отправляем ее на «кладбище»), позволяющей случайно не выбрать дважды один и тот же вариант. Эти методы также подойдут для формирования условных правил (А2). Большинство систем построены на тщательно отобранных параметрах, заданных для каждого варианта, поэтому вы можете просто сравнить эти фиксированные параметры и сделать нужный выбор. А вот произвольные условия на практике реализовать довольно сложно.

К примеру, вы работаете над RPG, и вам нужно раскидать по игровым локациям различных монстров (А). Высокоуровневые монстры должны быть в высокоуровневых локациях, водные монстры – в воде и так далее (А2). Сюда можно добавить немного структуры вроде нескольких монстров-малышей, блуждающих рядом с монстром-боссом. Эти методы подойдут и для лута: высокоуровневый лут вероятней всего будет выпадать из высокоуровневых монстров (А2), но при выпадении все равно будет элемент случайности, т.к. система будет выбирать одну или несколько вещей из огромного списка доступных вариантов (А).

В таких областях, как музыка и язык, распространение работает не очень хорошо. Случайно выбранные строки из слов или музыкальных нот не обладают структурой, достаточной для того, чтобы сформировать что-то интересное. Для артефактов со сложной структурой лучше воспользоваться плиточными или грамматическими методами. Артефактам, имеющим очень жесткую структуру и небольшую вариативность, лучше подойдут параметрические методы.

Parametric

Параметрические методы

Допустим, у вас уже есть почти готовый артефакт, но вы знаете, что его можно немного доработать. У вас есть музыка, и вы хотите немного ею поиграться, к примеру, сделать громче или мягче. У вас есть чайник, и вы хотите сделать его носик более изогнутым, корпус – более высоким, низким, толстым или тонким, а основу – более узкой или широкой. У вас есть группка инопланетных существ, и вы хотите сделать их ноги длиннее и тоньше, ступни – шире, животы – худее или размером с бочку, и чтобы эти изменения также влияли на их голос. К слову, именно так варьируются существа в No Man’s Sky. Это очень надежная и управляемая технология! Если вы работаете с 3D-моделями, то эти методы могут быть расшифрованы в Maya, что позволяет объединить их с другими анимациями (как трюк из Spore, использованный для анимаций строительных блоков). Однако вариативность (А) в этом случае будет выполняться вдоль фиксированного одномерного числового пути, а структурной вариативности не будет вовсе (Б2). Да, вы можете увидеть что-то «новое», но никогда – удивительное.

Более совершенные типы параметрических методов используют другие формы входных данных, и могут генерировать новые артефакты, которые базируются не только на числах, но и на точках, путях и графиках. Когда вы при помощи планшетной ручки рисуете в Photoshop линию, то она становится входными данными для алгоритма, который генерирует мазок, рассчитывая параметры давления, скорости и наклона. В Spore для создания существ использовался Metaballs, алгоритм создания геометрии, умеющий делать плавные трубы вдоль линий в 3D-пространстве. В числе других алгоритмов для заполнения пространства и путей – диаграмма Вороного, шум Перлина, алгоритмы триангуляции, 3D-экструзия или вращение, а также алгоритм Diamond-Square для фракталов. Эти алгоритмы особенно подходят для интерактивных генераторов, так как пользователь может обеспечить их входными данными.

Хотите больше? На inconvergent.net еще куча подобных алгоритмов, да еще и с открытым кодом. Они могут выдать поразительный результат, но, к сожалению, часто недостаточно управляемы, чтобы удовлетворить требованиям, необходимым для геймплея и прочих артефактов, требующих жестких ограничений.

Плиточные методы

Порежьте проблему на мелкие кусочки и поместите их в одинаковые ячейки. Создайте несколько решений, которыми можно было бы заполнить эти ячейки. То есть артефактами в данном случае будут просто наборы заранее заготовленных решений (вариантов). Такая система используется, к примеру, при создании игрового поля в настольных играх вроде «Колонизаторов» или «Предательства в доме на холме» (в качестве примера цифровой игры можно привести «Цивилизацию»). Остров в «Колонизаторах» и особняк в «Предательстве» конструируются из одних и тех же плиток, но в каждой игре они кладутся по-разному, что меняет геймплей. Самые ранние формы генеративного контента можно обнаружить в музыкальной игре Musikalisches Würfelspiel из 1750-ых годов, в которой пианисты могли складывать вместе музыкальные «плитки» (в данном случае – такты), тем самым создавая более-менее приемлемый вальс.

Плиточные методы хороши в создании маломасштабных структур (Б), но не способны создавать в них вариативность (Б2). Крупномасштабные структуры контролировать сложнее – они могут получиться полностью случайными. Кроме того, вы можете задать более продвинутые ограничения, касающиеся, например, того, какие плитки могут соседствовать, а какие нет, но для того, чтобы учесть такие ограничения, понадобится сложный алгоритм («пляж может соседствовать с джунглями, но должен быть на расстоянии двух плиток от реки…»). Отдельные плитки имеют очень ограниченный набор возможных вариантов (А), потому что вариант для каждой плитки выбирается человеком. У таких систем недостаточно знания, чтобы создавать хорошие новые плитки самостоятельно.

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

Если вас заинтересовал этот тип генеративных методов, то тут можно более подробно почитать о способах генерации контента для настольных игр и RPG, а здесь – об изучении комиксов.

mything

Грамматические методы

Эти методы – одни из моих любимых, поскольку дают возможность создавать очень глубокие и сложные структуры, оставляя контроль над вариантами. «Грамматика» – это компьютерно-научный термин для того, что большие штуки сделаны из штук поменьше, а эти штуки сделаны из еще более мелких штук. Мой любимый пример – это Nested. Вселенная состоит из галактик, которые состоят из планет, которые состоят из континентов, которые населены существами, в которых полно мыслей, мечтаний, воспоминаний и атомов. Каждый символ имеет набор подсимволов, и когда символ «распаковывается», он должен выбрать один из этих подсимволов (вариантов), после чего каждый подсимвол тоже «распаковывается», выбирая подподсимвол, и так далее… Грамматические методы упрощают расшифровку знаний об отдельном артефакте, а также его структуре и вариантах, и все это – в одном кусочке данных. Мне так нравятся эти методы, что я даже создала библиотеку, помогающую людям с ними работать – Tracery. Ее можно использовать, к примеру, чтобы создать сервис для твиттер-бота: вот по этим ссылкам можно найти несколько странных и креативных твиттер-ботов, созданных другими, а по этим – мои собственные.

Недостаток грамматических методов в том, что они не умеют работать с ограничениями, за исключением случаев, когда эти ограничения в них уже встроены (к примеру, если кровать может быть только в доме, то только дом может иметь кровать). Грамматическим методам сложно создавать высокоуровневые отношения между вещами, сгенерированными в разных точках. Если вы хотите сделать предсказание смерти злодея в самом начале метода, то сделать это будет сложно, но тут на помощь приходит «артиллерия» в виде решателей ограничений.

Constraint solvers

Решатели ограничений

Это очень мощный инструмент в нашем генеративном арсенале, и появился он совсем недавно. Они используются, когда у вас очень много жестких ограничений, а также большая, гибкая и сложная структура, и вы не знаете, как «подружить» их друг с другом.

Самый старый и простой способ решения этой проблемы – простой перебор всех возможных вариантов. Сделайте все возможные варианты контента, щелкните по всем переключателям, создайте альтернативную вселенную и примите там все возможные решения. Другими словами, протестируйте все ваши ограничения, пока не поймете, какой вариант работает лучше всего. Это отличное решение! Правда, далеко не для всех проблем… Как скажет вам любой математик, чем больше вариантов, тем больше артефактов, а нам хочется чего-то побыстрее и без лишних манипуляций вроде создания альтернативной вселенной.

Тут могут пригодиться различные пути-сокращения, которые зависят от того, какую структуру имеют ваши ограничения (если в возможном будущем я не пойду покупать мороженое, то зачем мне выбирать вкус этого мороженого?). Правда, вручную это делать очень долго и муторно (спросите об этом, к примеру, разработчика Storyteller).

К счастью, многие математики и логики часто развлекают себя, пытаясь решить эту проблему, и результатом этих развлечений стали так называемые «решатели общего назначения». Скормите им свои ограничения, структуру и варианты (на языке, который они понимают) и получите на выходе пути-сокращения, экономящие уйму времени (которое иначе было бы потрачено на простой перебор вариантов) и пригодные для использования в геймплее.

Поскольку эти инструменты пока слишком большие и громоздкие, их трудно встроить в игровые движки. Кроме того, они пока в новинку, поэтому руководств по ним не так уж много. Самое лучшее, на мой взгляд, это вот эта статья Адама Смита (Adam Smith), посвященная программированию стабильных моделей. Также обратите внимание на Craft от Иэна Хорсвилла (Ian Horswill) – это ограниченный случайный генератор чисел, недавно портированный на javascript. Помяните мое слово, пройдет немного времени, и эти методы станут очень популярными!

Агенты и симуляции

Вот здесь ситуация становится слегка странноватой. Помните, как я говорила, чтобы вы сели рядом с человеком и проследили, как он делает свое дело, чтобы черпнуть вдохновения для создания собственного генератора?

А теперь внимание… Люди – не единственные, кто способен решать проблемы!

Есть алгоритмы, которые решают проблемы, основываясь на поведении колонии муравьев или даже социальной коммуникации светлячков. Многие другие агенты и симуляции черпают вдохновение у других творений природы вроде стай птиц, эволюции, бактерий, нейронов и городов. Ниже – парочка моих любимых, но на самом деле их гораздо больше.

Рулевое поведение (это тоже один из методов, заслуживающих собственной статьи) может помочь в генерации сложного поведения толпы. Машинки Брайтенберга изначально были просто мысленным экспериментом о простых устройствах, оснащенных двумя светочувствительными глазами и двумя колесиками, вращение которыми позволяет менять направление движения. Несмотря на полную безмозглость, эти устройства могли демонстрировать «страх» и «смелость», а их поведение было портировано на многие языки и использовано в настоящих роботах.

Модель Boids берет подход машинок Брайтенберга и применяет его к стаям птиц и рыб. Каждая птица помогает своей стае сохранять нужную форму, рассчитывая собственные показатели для сцепления (перемещение поближе к членам стаи), выравнивания (движение в направлении, в котором движутся члены стаи) и отцепления (движение в сторону от членов стаи). Небольшие вариации в движении одной птицы могут сгенерировать новое движение для всей стаи.

Я также использую этот метод в процедурном генерировании танцев: просто заменяю эти рулевые движения на ритмические, чтобы они попадали в темп музыки (статья). На мой взгляд, рулевое поведение можно использовать не только для нахождения пути – этот метод еще ждет, пока кто-нибудь раскроет его потенциал на полную катушку.

Ltrees

Генетические алгоритмы, которые можно наблюдать в моем приложении для эволюции цветов, – это, собственно, не генеративные методы, т.к. для того, чтобы заработать, им по-прежнему нужен генератор (в данном случае генератор цветов). Но они являются своеобразным ориентиром, благодаря которому генератор движется к выполнению ограничений и созданию желаемого контента. Генетическому алгоритму (который, опять же, заслуживает отдельной статьи) нужно три вещи:

  • Вещи, которые вы можете модифицировать («генотип»)
  • Вещи, по которым можно судить о результатах модифицирования («фенотип»)
  • Способ превратить первое во второе

В случае с цветами генотип – это массив чисел с плавающей точкой. Этот массив скармливается параметрическому генератору, создающему красивые анимированные цветы (т.е. превращающему генотип в фенотип). Пользователь может посмотреть, какой цветок ему нравится (фенотип, который можно оценить). Он выбирает наиболее понравившийся цветок, его генотип клонируется и мутируется (это элемент, который можно модифицировать, помните?), после чего рождается следующее поколение, и так, раз за разом… происходит эволюция! То есть мы имеем дело с сексуальной репродукцией, которая в генетических алгоритмах используется сплошь и рядом, но ею одной дело, разумеется, не заканчивается. Существует еще много различных типов репродукций, каждая из которых еще ждет своего исследователя!

Cellular automata

Клеточные автоматы полагаются на множество маленьких и простых агентов, каждый из которых функционирует параллельно. Канонический пример – это игра «Жизнь», разработанная Джоном Конвеем (John Conway), где присутствует решетка, в ячейках которой живут крошечные автоматы, каждый из которых обладает собственным поведением. Все это может сгенерировать такое многообразие странных поведений и феноменов, что их поиск и каталогизация даже превратились для многих математиков в хобби.

Клеточные автоматы с более сложными правилами использовались для создания Dwarf Fortress, классической Powder, а с расцветом воксельной анимации обрели новую жизнь в движке, на котором был сделан Minecraft.

Итак, вы сгенерировали контент…

Вы прошерстили список генеративных методов, составили собственный список свойств и ограничений и, наконец, сделали собственный генератор!

Что дальше?

Генератор не работает

Что-то пошло не так. Контент выглядит уродливым. Контент выглядит одинаковым. Контент похож на гениталии. Другими словами, сгенерированный контент никуда не годится. Некоторые из этих проблем решить проще, некоторые – сложнее. Ниже я попробовала описать несколько проблем, с которыми вы можете столкнуться.

Есть ситуации, когда вы можете вычислительным путем определить, что именно пошло не так. Решение в том, чтобы сгенерировать новый контент, пока ограничения не будут удовлетворены. Допустим, вы хотите сгенерировать кресло, у которого центр тяжести находится выше точек опоры (вроде ножек), чтобы оно не опрокинулось. Это можно рассчитать в физической симуляции, поэтому если сгенерированное кресло получилось неудачным, сгенерируйте новое, затем еще одно, и еще – до тех пор, пока оно не будет удовлетворять заданным ограничениям. Этот подход называется «генерируй и тестируй».

Что может пойти не так с этим подходом? Хм. Что если тест не проходит ни одно сгенерированное вами кресло? Выходит, что контент, удовлетворяющий ограничениям, будет очень редким. Возможно, дело в том, что вы задали слишком много ограничений: на толщину материала, цену, симметричность, комфорт и так далее. То есть большинство ограничений ваши кресла проходят, но одно-два становятся камнями преткновения, и в результате контент проваливает тест. Возможно, тут пригодится решатель ограничений. Или, возможно, вам нужно ограничить генератор, чтобы его выбор стал более консервативным, но в этом случае вы рискуете потерять интересное пространство возможностей.

Еще одна проблема – это когда вы не можете адекватно описать ваши ограничения. Это распространенная ситуация, поскольку существует так много ненужных вещей, но использовать в качестве весомого аргумента фразы вроде «я узнаю, когда увижу собственными глазами», к сожалению, нельзя.

Можно ли использовать это прилагательное для описания персонажа или оно слишком оскорбительное? Не выглядит ли эта цветовая палитра похожей на корпоративный логотип? Эта штука действительно похожа на гениталии? Или просто… уродлива? Это, боюсь, сложная и даже неразрешимая проблема. Если вы не в состоянии описать «плохой» контент, то его невозможно отфильтровать, особенно когда пользователи пытаются обойти алгоритм обнаружения. В этом случае наилучшим решением будет сделать генератор, в котором невозможно или маловероятно создать какой-либо оскорбительный контент. Но это, к сожалению, сокращает ваше пространство возможностей, поскольку вы удаляете слова, которые безвредны и даже полезны, но лишь до тех пор, пока какой-нибудь находчивый пользователь не скомбинирует их определенным образом.

Эстетика: самая сложная задача

Самая распространенная причина разочарования в генераторах – когда у них не получается создать интересный контент. Что значит «интересный»? Зависит от ситуации. Лишь немногие генераторы создают лишь что-то одно. Многие генераторы создают контент постоянно, а твиттер-боты постят контент каждый час, но в итоге у них набегает больше контента, чем у генератора романов, который постит их каждый месяц. Поэтому добиться новизны от матерого твиттер-бота будет очень сложно, потому что он сгенерировал так много артефактов, что все они начинают казаться менее особыми.

Итак, ваш алгоритм сгенерировал 18446744073709551616 планет. Они, возможно, слегка отличаются друг от друга, но мере того, как игрок изучает их, будут ли они по-прежнему казаться разными? Я люблю называть это «проблемой 10000 тарелок с овсяными шариками». Я могу запросто сгенерировать эти 10000 тарелок с шариками, причем каждый шарик будет лежать на новом месте и в новой позиции, и с математической точки зрения все они будут абсолютно уникальными. Но пользователь будет видеть просто много тарелок с овсяными шариками. Перцептивная (то есть воспринимаемая) уникальность – это реальный показатель, и добиться здесь хороших результатов очень сложно.

uniqueness

В некоторых ситуациях достаточно лишь перцептивной дифференциации, и этот орешек расколоть уже попроще. Перцептивная дифференциация – это ощущение, что наблюдаемый нами контент не идентичен тому, что мы видели раньше. Пользователь, смотрящий на деревья в лесу, может понять, идентичны они или все же обладают небольшой вариативностью, что приводит в итоге к ощущению неестественности. Это удовлетворяет эстетическому требованию, даже если ни одно из деревьев ничем не запоминается.

Перцептивной уникальности добиться гораздо сложнее. Это разница между актером, играющим в массовке, и актером, который действительно запоминается. Может ли каждый артефакт быть выдающимся? Просить такое – чересчур. Не каждый может быть главным персонажем. Вместо этого некоторые артефакты можно сделать тусклым фоновым шумом, чтобы на их фоне другие артефакты выглядели действительно выдающимися.

Выдающиеся артефакты – это еще одна тема для отдельной статьи, однако некоторые эстетические правила диктуют, что человеку нравятся объекты, в которых читается определенный смысл. Людям нравится видеть доказательства процесса и силы – вроде почвы, вытолкнутой у основания дерева, или травы, растущей в тени надгробного камня. Эти структурно-генерируемые тонкости дают понять, что это не просто объект, а живой мир, пускай и очень маленький. Книга Кевина Линча (Kevin Lynch) «Image of the City» демонстрирует, что существуют факторы, способные сделать город запоминающимся, но главное – поддающимся описанию. Возможно, в мире есть и другие эстетические правила, пока не нашедшие своего открывателя.

Итого и дополнительные материалы

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

Если мой труд таки сподвиг вас поиграться с генераторами, то вот пара инструментов, с которых можно начать свои изыскания:

  • cheapbotsdonequick.com – создатель твиттер-ботов на Tracery, теперь с поддержкой SVG
  • www.contextfreeart.org
  • ncase.me/simulating/ – симуляция «Мир Эмодзи», изумительная игровая площадка для клеточных автоматов на базе эмодзи

Хотите больше? Хотите повстречать единомышленников?

Автор Кейт Комптон, So you want to build a generator…


Владимир FrostBite Хохлов @progamer_ru [email protected]

Комментарии

Вы должны быть зарегистрированы, чтобы оставить комментарий

Зарегистрируйтесь, это просто!


Зарегистрироваться

Уже зарегистрированы?


Войти сейчас