прямоугольник, точка, поверхность.

Для описания примитива достаточно написать зарезервированное кодовое слово.

Пример примитивов:

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

Андрей Федив

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату