прямоугольник, точка, поверхность.
Для описания примитива достаточно написать зарезервированное кодовое слово.
Пример примитивов:
box
sphere
grid
line
dot

2. Трансформации
Трансформации описывают всевозможные действия, применяемые к текущему состоянию (примитиву): сдвиг по осям x, y, z, повороты по трем осям, изменение цвета (абсолютное значение в RGB, смешивание текущего цвета с другим, изменение параметров тона-яркости-насыщенности (HSV), изменение альфа канала), масштабирование объекта в трех осях, зеркальное отражение, применение матрицы поворота.
Трансформации записываются в фигурных скобках и выглядят как буква (сокращение названия трансформации) и числовое значение-аргумент. Аргумент идет обязательно после пробела.
Аргументом является или число с плавающей запятой или целочисленное значение, зависит от типа.
Изменение в 3d-координатах это float, модификация цвета — integer.
Внутри одной трансформации может быть произвольное количество действий, если происходит несколько однотипных действий, то они автоматически складываются.
Также трансформации могут быть заданы рандомным числом.
Примеры:
{ x 1} // сдвигает текущее состояние по оси x на единицу
{x 2 y 2 z 2} // равномерно сдвигает состояние на 2 единицы по трем осям
{rx 30} // поворачивает относительно оси x на 30 градусов
{sat 10 hue -30} //изменяет атрибуты цвета
{x 1 x 1 x 1} // равно {x 3 }
Трансформации записываются сразу перед примитивами (или правилами). Либо это одна трансформация, либо их список, но со знаком умножения, который означает повторение трансформации N раз (итерация).
Пример:
1 * { hue 30 x 1 } // равно { hue 30 x 1}
10 * { x 1 hue 36 } 10 * { y 1 sat 0.9 } 10 * { z 1 b 0.9 } box
Итерация из примера выше является важным элементом языка.
Запись N * { transform t }, где N и t — некоторые числа, а transform — некоторая трансформация, эквивалентна N записям вида:
{ transform t} …
{ transform t*2} …
{ transform t*3} …
{ 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.
Сейчас это всего лишь набор полигонов или кубиков, рисуемых, чего греха таить, сильно отстающей от современных возможностей видеокарт, библиотекой OpenGL, что в итоге не сильно отличается от первой 3D-графики начала 1990-х.
Добавление четвёртого измерения — времени — позволит строить меняющиеся на ходу ландшафты, и, в принципе, некоторые намеки на это есть уже сейчас: встроенные примеры показывают, как сделать анимацию пошагового разрастания фигуры-дерева.
Альтернативные браузеры для iOS