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

Что такое генеративное искусство?

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

При программировании довольно просто придумать правила и ограничения. Это все условные утверждения. При этом найти способы заставить эти правила создавать что-то интересное может быть непросто.

Игра Жизни - это знаменитый набор из четырех простых правил, определяющих рождение и смерть каждой ячейки в системе. Каждое из правил играет роль в продвижении системы через каждое поколение. Хотя правила просты и понятны, быстро начинают проявляться сложные закономерности, которые в конечном итоге приводят к удивительным результатам.

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

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

Почему вам стоит попробовать?

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

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

С чего начать?

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

Большинство моих генеративных арт-проектов были выполнены на Python. Это довольно простой язык, к которому можно привыкнуть, и в нем есть несколько невероятных пакетов, помогающих с манипуляциями с изображениями, например Pillow.

К счастью для вас, нет необходимости долго искать отправную точку, потому что я предоставил вам код ниже, чтобы вы могли поиграть.

Генератор спрайтов

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

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

Вот два разных результата решения, к которому я пришел:

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

Окружение

Если вы хотите поиграться с генератором спрайтов, сначала нужно проделать небольшую фундаментальную работу.

Настройка правильной среды с помощью Python может быть сложной задачей. Если вы раньше не работали с Python, вам, вероятно, потребуется скачать Python 2.7.10. Изначально у меня были проблемы с настройкой среды, поэтому, если вы начнете сталкиваться с проблемами, вы можете сделать то же самое, что и я, и заглянуть в виртуальные среды. И последнее, но не менее важное: убедитесь, что у вас также установлена ​​Подушка.

После настройки среды вы можете скопировать мой код в файл с расширением .py и выполнить следующую команду:

python spritething.py [SPRITE_DIMENSIONS] [NUMBER] [IMAGE_SIZE]

Например, команда для создания первой матрицы спрайтов сверху будет следующей:

python spritething.py 7 30 1900

Код

Это решение далеко от совершенства, но оно показывает, что для создания генеративного искусства не требуется тонны кода. Я постараюсь объяснить ключевые моменты.

Функция main начинается с создания исходного изображения и определения размера спрайтов. Два цикла for отвечают за определение границы для каждого спрайта, в основном разделяя размеры изображения на количество запрошенных спрайтов. Эти значения используются для определения координат каждого из них.

Давайте проигнорируем отступы и посмотрим на изображение ниже. Представьте, что каждый из четырех квадратов представляет собой спрайт размером 1. Граница, которая передается следующей функции, относится к верхней левой и нижней правой координатам. Таким образом, кортеж для верхнего левого спрайта будет (0,0,1,1), тогда как кортеж для верхнего правого будет (1,0,2,1). Они будут использоваться как размеры и базовые координаты квадратов каждого спрайта.

Функция create_invader определяет границу для каждого квадрата внутри спрайта. Тот же процесс определения границы применяется здесь и представлен ниже, только вместо полного изображения мы используем заранее заданную границу для работы внутри. Эти окончательные координаты для каждого квадрата будут использоваться в следующей функции для рисования спрайта.

Чтобы определить цвет, используется простой массив из трех случайных кортежей RGB и трех черных цветов для имитации 50% вероятности рисования. Лямбда-функции в верхней части кода отвечают за генерацию значений RGB.

Настоящая уловка этой функции - создание симметрии. Каждому квадрату соответствует значение элемента. На изображении ниже вы можете видеть, как значения элементов увеличиваются по мере достижения центра, а затем уменьшаются. Квадраты с совпадающими значениями элементов отображаются одним цветом.

Поскольку create_square получает свои параметры от create_invader, он использует очередь и значения элементов из предыдущего для обеспечения симметрии. Цвета первого появления значений помещаются в очередь, а зеркальные квадраты вытесняют цвета.

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

Заключение

Чтобы полностью оценить генеративное искусство, нужно время, но оно того стоит. Мне нравится сочетать программирование с более традиционным визуальным оформлением, и я определенно многому научился в каждом из своих проектов.

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

Если вас интересуют другие уроки по генеративному искусству, загляните на этот канал YouTube.

Спасибо за чтение!