id() | S |
Тождественное отображение. |
scale(k) | S |
Сжатие к началу координат с коэффициентом k. |
scale(kx,ky,kz) | A |
Сжатие к началу координат с коэффициентами kx,ky,kz вдоль соответствующих осей. |
rotate(x,y,z,angle) | S |
Поворот на угол angle вокруг оси проходящей через начало координат и точку (x,y,z). |
rotate(x,y,z,angle,along,across) | A |
То же что и предыдущее, но дополнительно происходит сжатие вдоль оси
с коэффициентом along и поперек с коэффициентом across. |
rotate(angle) | S |
Поворот на угол angle вокруг оси (0,0,1) |
translate(x,y,z) | S |
Сдвиг на вектор (x,y,z). |
translate(x,y) | S |
Сдвиг на вектор (x,y,0). |
reflect(x,y,z) | S |
Отражение относительно плоскости проходящей через начало координат и имеющей нормаль (x,y,z). |
matrix(ax,ay,az,bx,by,bz,cx,cy,cz) | A |
Линейное преобразование заданное матрицей 3x3:
|
affine2d(ax,ay,bx,by,tx,ty) | A |
Композиция translate(tx,ty,0) matrix(ax,ay,0,bx,by,0,0,0,0).
Удобна для задания двумерных самоаффинных фракталов. |
stretch(x,y,z,k) | M |
Сохраняющее ориентацию мёбиусово преобразование переводящее шар единичного радиуса
с центром в начале координат сам на себя и сдвигающее его центр в направлении (x,y,z) на расстояние k. |
inverse(x,y,z,r) | M |
Отражение относительно сферы с центром (x,y,z) и радиусом r.
Это мёбиусово преобразование, меняющее ориентацию. |
bound(x,y,z,r) | M |
Это не совсем отображение. Ограничивающий оператор bound помечает,
что мёбиусово-порождённое множество, на которое он действует, лежит в шаре с
центром (x,y,z) и радиусом r. Мёбиусовы отображения, порождающие
данное множество, должны быть сжимающими в этом шаре. Каждому
мёбиусово-инвариантному множеству (аттрактору) должен быть сопоставлен
оператор bound, если это множество в заданной IFS или Digraph-IFS
системе выражается через себя. |
empty() | |
Ставит в соответствие любому множеству пустое.
Удобно для задания случайно-порождённых фракталов. |
Атрибут | По умолчанию | Описание |
position(x,y,z) | обязателен |
Точка (x,y,z) задает положение камеры(наблюдателя). |
direction(x,y,z) | выбирается автоматически |
Вектор (x,y,z) задает направление взгляда. |
vertical(x,y,z) | обязателен |
Вектор (x,y,z) задает вертикальное направление. |
fov(angle) | 50 градусов |
Число angle задает угол обзора по вертикали. |
stereo(eyeDist, scrDist) | режим 'mono' |
Включить режим стереоизображения,
eyeDist - расстояние между глазами,
scrDist - расстояние от наблюдателя до экрана. |
Освещённость сцены рассчитывается широко известным методом трассировки лучей (ray-tracing),
который требует чтобы были заданы источники света и отражающие свойства поверхности
объектов (цвет, зеркальность и т.п.)
Количество источников в сцене может быть произвольным, при этом они могут быть разных типов.
Следующая таблица поясняет назначение атрибутов.
Атрибут | Лампа | Прожектор | Солнце | Описание |
position (x,y,z) | R | R | N/A |
Точка (x,y,z) задает положение источника. |
direction (dx,dy,dz) | N/A | R | R |
Вектор (x,y,z) задает направление, в котором светит источник. |
spot_angles (a1,a2) | N/A | R | N/A |
Углы задающие размеры пятна у направленного источника света. |
attenuation (qa,la,ca) |
по умолчанию (1,0,0) | N/A |
Коэффициент квадратичного, линейного и постоянного ослабления яркости источника от расстояния. |
shadows (1 | 0) |
по умолчанию (1) |
1 - источник загораживается объектами, 0 - не загораживается. |
attachment (1 | 0) |
1 - источник привязан к системе координат объекта, 0 - камеры. |
diffuse (r,g,b,lum) |
Требуется хотя бы один.
По умолчанию (0,0,0,0) |
Задает рассеяный цвет/яркость источника. |
specular (r,g,b,lum) |
Задает зеркальный цвет/яркость источника. |
color (r,g,b,lum) |
Задает одновременно рассеяный и зеркальный цвет/яркость источника |
Примечание: N/A - атрибут нельзя задавать, R - атрибут требуется задавать.
3. Отражающие свойства поверхностей.
Свойства поверхности задаются после команды build.
Так как слово build может встречаться несколько раз, имеется возможность строить в одной
сцене объекты с разными свойствами поверхности.
Свойство | Примечания | Описание |
ambient(r,g,b,lum) |
Аргументы можно задать в виде (r,g,b) или (lum) |
Устанавливает цвет/яркость фоновой составляющей. |
diffuse(r,g,b,lum) |
Устанавливает цвет/яркость рассеянной составляющей. |
specular(r,g,b,lum) |
Устанавливает цвет/яркость зеркальной составляющей. |
color(r,g,b) |
для простоты |
Задает цвет фоновой и рассеянной составляющей.Зеркальная устанавливается в (1,1,1). |
metall(r,g,b) | |
Задает металлическую поверхность : устанавливает цвет рассеянной и зеркальной составляющей. |
Подстановки
Для упрощения задания множеств и отображений можно использовать подстановки
(аналог директивы #define в C/C++) задаваемые как:
<имя> := <значение> ;
Примечание: мы собираемся в будущем избавиться от этой не очень естественной языковой конструкции,
т.е. отображения можно будет присваивать обычным переменным.
Арифметические выражения
В формулах принят синтаксис общий для языков C++/Java/Perl/PHP.
Имена переменных могут состоять из символов a-z,A-Z и подчёркивания "_"
Вещественные функции:
ln(x),exp(x),sqrt(x),abs(x),sign(x),sin(x),cos(x),tan(x),atan(x)
atan2(y,x),arg(x,y) - эти две возвращают arctg(y/x)
rnd(x) - случайное вещественное число в отрезке [0,x]
Поддерживаемые вещественные и логические операции:
= += -= *= /= + - * / , () ?: ++ -- == != < <= > >=
Константы: PI и E.
Пример: Снежинка Коха
camera position (0,0,-80) vertical(0,1,0) fov(50);
light color (0,1,0) position (1, 1,-3) shadows(0);
light color (1, 1, 0) position (3,-1,-1) shadows(0);
ambient(1,1,1,.05);
background(0,1,1,0.5);
s=sqrt(3);
f1 := translate(1/2, 1/2/s,0)*scale(1/s)*rotate(0,0,-1,150);
f2 := translate(1,0,0)*scale(1/s)*rotate(0,0,-1,-150);
f3 := translate(-1/2,s/2,0)*scale(s)*rotate(0,0,-1,30);
f4 := translate(-1/2,-s/2,0)*scale(s)*rotate(0,0,-1,-90);
f5 := translate(1,0,0)*scale(s)*rotate(0,0,-1,150);
set KochCurve = (f1+f2)KochCurve;
set KochSnowflake = (f3+f4+f5)KochCurve;
build Snowflake;
Данный скрипт сначала опрделяет структуру кривой Коха (KochCurve), состоящей из двух своих уменьшенных копий
f1(KochCurve) и f2(KochCurve), а затем определяет и саму снежинку Коха (KochSnowflake), состоящую из трёх образов
кривой Коха.
Случайно-порождённые фракталы
При построении аттрактора IFS системы, можно указать, что
отображения дробящие множество (атрактор) на кусочки (далее называемые порциями),
необходимо выбирать случайным образом из некоторого заданного набора отображений.
Правила задания случайного фрактала:
-
При построении, всему множеству, каждой его порции, каждой подпорции и т.п. сопоставляется псевдослучайное число.
Число соответсвующее всему множеству можно задать вызвав перед оператором build функцию
randState(аргумент), где вещественный аргумент лежит на отрезке [0,1].
Например: randState(rnd(1));
- Оператор (...)%n , где n - целое число, выбирает из скобок
n отображений (или n порций), остальные выкидывает.
Для выбора использует псевдослучайное число соотвествующее порции, которая дробится.
Пример: (f1+f2+f3)%2.
- В операторе (...)%n после каждого отображения можно в фигурных скобках
указать вес отображения (вещественное число большее нуля).
Вероятность, с которой это отображение будет выбираться, вычисляется,
как вес отображения делённый на сумму весов.
Если вес не указан, он полагается равным единице.
Например: (f1{2}+f2{3})%1
- При дроблении некоторой порции, по умолчанию псевдослучайное число передаётся её подпорциям без
изменений. Но если встретилась конструкция f|m, то "случайное" число для
подпорции, полученной применением отображения f, изменяется способом m,
точнее изменяется под действием псевдослучайного генератора, зависящего от параметра m.
Так, если у двух отображений номер m совпадает
(например, в конструкции (f1|1+f2|1) ), то соответсвующие подпорции,
получаемые под действием отображений f1,f2, получат одинаковое псевдослучайное число,
и будут дробиться одинаковым образом.
Управляющие конструкции
- { оператор1; оператор2; ... }
Составной оператор. Выполняет последовательность операторов, расположенных в фигурных скобках.
- if(выражение) оператор1; [ else оператор2;]
Выполняет оператор1, если выражение отлично от нуля, иначе выполняет оператор2.
Раздел else необязателен.
Вместо любого из операторов можно использовать составной оператор.
- for(инициализация; выражение; итерация) тело;
Сначала выполняется инициализация. Затем, в цикле вычисляется выражение
и пока оно отлично от нуля выполняются тело цикла и итерация.
- while(условие) тело;
Пока условие отлично от нуля, выполняется тело цикла.
- do { тело; } while(условие);
Выполяет тело цикла, затем проверяет условие,
и если оно отлично от нуля, снова выполнянет тело, затем снова проверяет условие и т.д.
- echo <переменные и строки>;
Печатает на консоль переменные и текст, размещённый в двойных кавычках.
Текст и имена переменных должны разделяться пробелом.
Единицы измерения углов
angles ( degree | radian ) - устанавливает единицы измерения углов,
влияет на fov,rotate,spot_angles и тригонометрические функции.
Значение по умолчанию: degree.
Анимация
Для записи кадра анимации нужно вызвать функцию save_frame().
Для записи последовательности кадров рекомендуется использовать оператор цикла for.