29 мая 2022 г. на (fx)hash, 400 ред.

Первые шаги

Как и многие генеративные проекты, парадокс Ферми зародился как простой набор правил. Я подумал о подходах к созданию интересных композиций с помощью треугольников:

  1. Нанесите несколько точек на холст.
  2. Выберите контрольную точку и выясните, какие точки являются ближайшими и вторыми ближайшими к этой начальной точке.
  3. Соедините эти три точки, чтобы сформировать треугольник.
  4. Перейдите к другой точке и сделайте то же самое.
  5. Продолжайте, пока не охватите все точки.
  6. (Необязательно) удалите исходную опорную точку, чтобы она не использовалась другими треугольниками.

Это основано на более раннем проекте Connectivity (на Optimism L2). Оглядываясь назад на свою работу сейчас, я также замечаю влияние Настенного рисунка Сола Левитта и Archiplex Эндрю Штрауса.

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

  • Существует множество способов «доставить несколько точек на холст». Вы можете использовать генератор псевдослучайных чисел, чтобы обеспечить равномерное распределение баллов. Вы также можете попробовать использовать шум Перлина или распределение Гаусса, что должно дать некоторую структуру. Исследуйте смешивание и сопоставление этих методов по осям x и y. Или вы можете настроить сетку и поместить точку в каждую вершину. Чтобы было интересно, вы можете добавить случайное смещение значений x и y.
  • Еще одним способом, который я исследовал, был оттенки серого (но не цвет, потому что я не мазохист). Я остановился на увеличении яркости треугольников по мере продвижения изображения вверх по холсту, но такой подход сам по себе выглядел слишком однородным. Смещение значений яркости каждого треугольника дополнительным значением из распределения Гаусса дало более естественное изменение тона при сохранении вертикального градиента. Это создавало иллюзию глубины или затенения, как будто свет падал на треугольники с разных сторон. Треугольники были сложены из бумаги — оригами? Из скромных треугольных форм и оттенков серого начало появляться нечто большее!

Я использовал это с тонким фоном деформации домена, чтобы вызвать ветер или ощущение движения: рой птиц в полете?

Идея

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

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

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

Итальянский физик, услышав Энрико Ферми, недоумевал, из-за чего вся эта суета; на самом деле никто не видел и не слышал ни о каких инопланетянах, рассуждал он. В разговоре с коллегами-физиками за обедом (которые, видимо, к тому моменту уже перешли к другим темам) он выпалил: Но где же все?!

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

«Существует две возможности: либо мы одни во Вселенной, либо нет. Оба одинаково ужасны».

Сэр Артур Кларк

Как бы то ни было… Я решил попробовать оживить эти треугольники — цвет, фактуру, окружение, историю. Кто они такие? Что они делают? Являются ли они разумными? Дружелюбно? Агрессивный, опасный? Кто и где «мы» и как мы сюда попали?

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

Окончательный результат

Я использовал несколько различных методов, чтобы получить этот результат. На самом деле, этот алгоритм у меня самый длинный, более 800 строк ванильного p5.js, хотя, вероятно, его можно было бы оптимизировать до части этого. Что? Мне нравится, что мой код читаем, и я не буду извиняться за это. (Надеюсь, Питер Пасма это не прочитает…)

Чтобы сгенерировать рельеф и горы, я использовал циклы шума Перлина, чтобы создать серию полигонов на основе этого классического примера Дэниела Шиффмана. Я использовал распределение Гаусса, чтобы поработать со значениями HSB полигонов, чтобы придать местности некоторые естественные вариации. Я также разбросал несколько спящих/отдыхающих птиц на поверхности планеты, используя размытые черные треугольники в качестве теней для придания глубины.

Я допускаю до трех лун. Рисовать круги достаточно просто, но я не хотел, чтобы они перекрывались. Для этого я написал простой алгоритм упаковки кругов грубой силой. Как это работает:

  1. Выберите случайное место в верхней половине холста, чтобы нарисовать центр луны с определенным радиусом r. Думайте об этом как о «черновой» луне.
  2. Проверьте расстояние между этим пятном и центром других лун, уже находящихся на холсте.
  3. Расстояние до центра ближайшей луны (лун) больше, чем сумма радиусов этой луны и текущей? Если это так, то перекрытия нет, и вы можете нарисовать там луну! Если нет, выбросьте этот «черновик» и попробуйте еще раз с другим случайным местом.
  4. Повторяйте до тех пор, пока (i) вы не вытащите выбранное количество лун или (ii) не наберете предопределенное максимальное количество попыток.

Чтобы луны выглядели «реалистично», я решил, что их нужно усыпать кратерами. Опять же, я не хотел делать это, просто используя случайное позиционирование (хотя random() было бы более правдоподобно!). Я переделал код упаковки кругов, описанный выше, сузив область, в которой были выбраны случайные пятна (на шаге 1), чтобы покрыть только область выбранной луны, и нарисовал ряд неперекрывающихся кратеров. Я обнаружил, что результат выглядел наиболее естественным, когда размер кратеров соответствовал распределению Гаусса. Наконец, я закончил луну (луны) с радиальным градиентом (чтобы создать эффект прибывающей / убывающей) и размыл кратеры, создав текстурированный вид и, возможно, ощущение расстояния.

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

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

(Существует также третье, гибридное правило, согласно которому перед каждым подразделением каждый треугольник случайным образом выбирает из двух приведенных выше правил.)

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

Я также включил случайную комету (или космический корабль?), и вы даже можете заметить монолит. Ходят слухи, что в монолитах есть что-то особо загадочное, и… ох, но я уже сказал слишком много… .