{ transform t*N} …
Как пример
3 * { x 2 } box
это то же самое, что и
{ x 2 } box
{ x 4 } box
{ x 6 } box
3. Правила
Правила есть правила:) По сути представляют собой набор из последовательно выполняющихся примитивов, трансформаций и других правил с неограниченной вложенностью и рекурсивностью.
Неявным правилом является последовательная запись трансформации и примитива из примеров выше, формально это тоже правило языка, только без кодового слова.
Правило состоит из ключевого слова rule, названия (цифробуквенный идентификатор), открывающих и закрывающих фигурных скобок, внутри которых перечислены примитивы, трансформации и другие правила.
R1
rule R1 {
{ x 0.9 rz 6 ry 6 s 0.99 sat 0.99 } R1
{ s 2 } sphere
}
4. Стартовое правило
Если не объявить, какое из правил или примитивов вызывается первым, то мы получим пустое изображение. Порядок объявления не имеет значения, главное поставить хотя бы одно из них, в примере выше это R1.
Удивительно, но на этом практически и всё. Конечно, в языке имеется множество тонкостей, связанных с 3-d изображениями, ограничениями количества вычислений, генерацией последовательности цветов и т.д., но фактически достаточно изучить только набор примитивов, способы их трансформаций и запись этого всего в правила, чтобы начать создавать фигуры.
Как вы могли заметить, после задания стартового символа и правила выполнения, мы нигде не указываем, когда это прекратится. Как уже было неоднократно сказано, правила допускают рекурсивное вложение и перекрестные ссылки. И более того, это и есть основа основ построения всех фрактальных объектов, которые, теоретически, бесконечны.
Для борьбы с бесконечностью действует ряд ограничений, которые могут применяться явно или неявно:
- глобальный лимит числа объектов на сцене (maxobjects)
- предел числа поколений фигур (maxdepth).
Они как заданы по умолчанию, так и могут быть переопределены в начале скрипта, комбинируя их разные сочетания, можно получать интересные и часто неожиданные эффекты.
Для более тонкой настройки, к правилу могут быть приписаны локальные ограничения (maxdepth), что позволяет строить замысловатые фигуры, которые, к примеру, растут в длину больше, чем в ширину.
Также есть ограничители на максимальный (maxsize) и минимальный размер (maxsize) объекта в текущей трансформации. Если объект не удовлетворяет критерию, то не отображается, но следующая итерация может отобразиться нормально, если объект на ней снова попадает в рамки. Эти настройки, к примеру, позволяют строить хитрые паттерны с выпадающими фрагментами.
Даже с этими настройками наш язык кажется черезчур детерминированным и фигура будет черезчур упорядоченной и симметричной. Для борьбы с этим добавлена “игра хаоса”, выраженная в том, что имена различных правил могут повторяться. При выполнении будет выбираться случайно то или иное правило на основе генератора случайных чисел. К одинаковым правилам может быть приписан вес (weight), повышающий или понижающий его вероятность. Именно в этом месте и начинают получаться фигуры, похожие на живую природу, ведь в ней очень редко встречается строгая упорядоченность.
В итоге добавляется случайность выбора цвета, задаваемая одной из нескольких встроенных схем.
Рассмотренная программа является с одной стороны очень простой, с другой — очень сложной. Для полноценного творчества в ней требуется не только хорошее пространственное воображение, но и знание основ 3D-графики и школьной стереометрии с тригонометрией. Фигуры ведут себя непредсказуемо, уходят не туда, куда надо, бывают скучны и банальны, в общем демонстрируют все известные проблемы творческого процесса.
Полученные объекты могут быть прекрасными (или унылыми) как сами по себе, так и усилены экспортом в популярные среды типа Blender, в котором они являют обычный набор полигонов, к которым могут быть сопоставлены модели освещения, тумана, амбиентности, а также шейдеры. Также существует плагин для популярной среды реалтаймового видео VVVV, позволяющий сделать из скрипта интерактивную 3D-инсталляцию.
Можно предположить будущее таких программ. Развитие аппаратной поддержки 3D-языки описания шейдеров и модель вычислений CUDA, а также популярные библиотеки физического моделирования могут неимоверно украсить сцены, добавив туда “игру” не только с плоским цветом, но и с поверхностями, тенями, эффектами и искажениями перспективы. Именно “игру” как набор трансформаций внутри сцены, а не более реалистичный рендер средствами рейтрейсинга типа SunFlow.