Над моей первой статьёй долго думать не пришлось, и пока делал обложку канала, понял, что хочу рассказать о том, как создать фрактальное изображение в Blender.
Итак, хочешь создать фрактальное изображение? Легко, тебе понадобится свободное время (от получаса до двух часов), терпение и 42.
Для начала следует открыть само приложение и выбрать нужные нам настройки. Viewport Shaiding Rendered.
Теперь нужно создать (shift + a) плоскость. Центрируем на ней наш вид (клавиши на numpad 7 и ","), не меняя его выбираем камеру как активный объект, нажимаем alt + ctrl + 0(numpad). И вот камера центрирована на плоскости, теперь осталось лишь сделать так, чтобы камера захватывала всю плоскость, не цепляя при этом пустых мест (изменить размеры плоскости/ разрешение камеры).
Добавим материал для плоскости и удаляем Principed BSDF, создаем (опять через shift+a) script. Далее открываем текстовый редактор именуем его и вписываем следующее:
shader fractal
(float creal = 0,
float cimag = 0,
float colorfon = 0,
float lim = 0,
float iteration = 0,
point position = P,
output color fractalcolor = 0)
{float imag = position[1];
float real = position[0];
for (float i = 0; i < iteration; i++)
{float tempreal = real;
real = real*real - imag*imag + creal;
imag = 2*tempreal*imag + cimag;
if (sqrt(real*real - imag*imag) > lim)
{fractalcolor = i / colorfon;}
}
}
В окне script выбираем ваш скрипт (имя в текстовом редакторе) и соединяем surfase с fractalcolor
Вот как у вас всё должно выглядеть в итоге:
Теперь подробнее.
shader fractal
(float creal = 0,
float cimag = 0,
float colorfon = 0,
float lim = 0,
float iteration = 0,
point position = P,
output color fractalcolor = 0)
Эта часть описывает различные вводные и выводные данные. Обозначения: creal -- действительная часть комплексного числа, принадлежащая множеству Мандельброта (x_{0}), cimag -- мнимая часть комплексного числа, принадлежащая множеству Мандельброта (y_{0}),
iteration -- количество итераций цикла (будет рассмотрено далее), fractalcolor -- вывод информации, colorfon -- значение для определения тона выводимого цвета (рекомендуется значение равное iteration), lim -- регуляция числа точек в выводимом изображении (меньше значение -- больше точек)
{float imag = position[1];
float real = position[0];
for (float i = 0; i < iteration; i++)
{float tempreal = real;
real = real*real - imag*imag + creal;
imag = 2*tempreal*imag + cimag;
if (sqrt(real*real - imag*imag) > lim)
{fractalcolor = i / colorfon;}
}
}
Часть отвечает за вывод точек, которые составляют изображение, на поверхность. В основе цикла
for (float i = 0; i < iteration; i++)
{float tempreal = real;
real = real*real - imag*imag + creal;
imag = 2*tempreal*imag + cimag;
if (sqrt(real*real - imag*imag) > lim)
{fractalcolor = i / colorfon;}
}
Лежит формула
x_{n+1} = x_{n}^{2} - y_{n}^{2} + x_{0}
y_{n+1} = 2*x_{n}*y_{n} + y_{0}
(то откуда она взялась можно узнать, если поверхностно глянуть информацию о множестве Мандельброта и множества Жюлиа (к ним относятся те фракталы, которые тут создаются), а то, если я буду это сейчас расписывать, статейка слишком уж растянется)
При этом выводятся те точки, квадрат разности которых больше определенного предела (lim).
Цвет точки определяется
{fractalcolor = i / colorfon;}
То есть, на более ранних итерациях выводимые точки будут темнее.
Настраиваем значения по вашему желанию и переходим к завершающему этапу.
Теперь осталось раскрасить фрактал и привязать к нему блоки, с помощью которых будет регулироваться его положение на поверхности. Создаем блок ColorRamp и вставляем его между блоками Script и Material Output (настраиваем цвета). Geometry и Mapping Будут осуществлять регулирование положения фрактала на поверхности (соединяем, как показано на рисунке ниже)
Остается всё это зарендерить, рендерить лучше в формате JPG.
Благодарю за внимание! Это, как я уже и говорил, моя первая статья (которую сел писать в 23 часа вечера, заканчиваю в 7 утра ), поэтому буду рад конструктивной критике, а так же вопросам.
Вдохновлялся видео "Create Procedural Fractals Fast" с канала "CGMatter"
#blender #фрактал #фрактальное изображение