Здравствуй, хабр. Вчера я игрался с новой Ubuntu 11.10 и совершенно случайно наткнулся на такое замечательное приложение, как Structure Synth. Structure Synth уже обсуждался на хабре, а я бы хотел набросать вольно-литературный перевод краткого туториала с официального сайта.
О чем это он?
Structure Synth — это кросс-платформенное приложение для построения сложных трехмерных структур. Структуры строятся путем выполнения набора правил на языке Eisenscript. Грамматика была первоначально разработана человеком по имени Chris Coyne и используется в приложении для построения двухмерных изображений Context Free Art. Structure Synth написан на C++ с использованием OpenGL и Qt. Доступны сборки для Windows, Mac OS и Linux.
Состояния, трансформации и действия.
Краеугольным камнем в SS служит состояние. Состояние описывает текущую систему координат и режим окраски. Система координат определяет позицию, ориентацию и размер всех объектов, созданных в текущем состоянии.
Состояние модифицируется трансформациями. Например, мы можем сдвинуть текущую систему координат на единицу по оси Х применив трансформацию
{ x 1 }
. Таким же образом можно повернуть систему координат на 90 градусов вокруг оси Х с помощью трансформации { rx 90 }
. Трансформации комбинируются при парсинге, так что { x 1 x 1 }
эквивалентно { x 2 }
.Состояние можно комбинировать с вызовом правил, создавая действия. Например,
{ x 2 } box
представляет собой трансформацию, следом за которой вызывается правило. Встроенное правило «box» создаст куб в координатах (0, 0, 0) -> (1, 1, 1) в текущей системе координат.Давайте взглянем на такой пример:
box
{ x 2 } box
{ x 4 } box
{ x 6 } box
Результатом будет примерно такое изображение:
Код из примера выше создает четыре куба с одинаковыми промежутками. Обратите внимание на то, что мы определяем несколько действий друг за другом. Каждое действие применяется к одному и тому же состоянию — в нашем случае исходному. Действия не применяются к состоянию, созданному предыдущим действием.
Итерации
Существует возможность описывать множественные действия (итерации) с помощью символа умножения. Например,
3 * { x 2 } box
полностью идентично коду из первого примера.Цветовые трансформации
Мы можем изменять текущий цвет рендеринга таким же образом, как и применять пространственные трансформации. Structure Synth использует схему HSV (Hue, Saturation, Value) для представления цвета. Для трансформации цвета используются операторы
hue
, sat/saturation
и b/brightness
.Пример, демонстрирующий итерации и трансформацию цвета:
10 * { x 1 hue 36 } 10 * { y 1 sat 0.9 } 10 * { z 1 b 0.9 } box
Результат:
Еще один пример с различными трансформациями:
10 * { x 2 } box
1 * { y 2 } 10 * { x 2 rx 6 } box
1 * { y 4 } 10 * { x 2 hue 9 } box
1 * { y 6 } 10 * { x 2 s 0.9 } box
Результат:
Встроенные правила
box
это лишь один из примитивов — встроенных правил — в Structure Synth. В вашем распоряжении имеются также: sphere, dot, grid, line, cylinder, mesh, cylindermesh
.Вот как выглядят некоторые примитивы (слева на право: mesh, grid, line, dot, box, sphere):
Пользовательские правила
Пользовательские правила — ключ к созданию сложных и замысловатых структур. Правила задаются с помощью ключевого слова
rule
. Пользовательское правило используется точно так же, как и встроенное. Важная особенность правил — правило способно вызывать само себя. Взгляните на следующий пример:R1
rule R1 {
{ x 0.9 rz 6 ry 6 s 0.99 sat 0.99 } R1
{ s 2 } sphere
}
Что в результате даст:
Обратите внимание, правило
R1
рекурсивно вызывает само себя. По логике вещей такой код никогда не завершится, но в Structure Synth существует максимально допустимая глубина рекурсии (по умолчанию — 1000 рекурсивных вызовов). Достижение максимальной глубины рекурсии можно считать достижением базы рекурсии. Значение максимальной глубины рекурсии можно изменить с помощью команды set maxdepth xxx
. Еще один способ принудительного завершения рекурсий — установка максимально допустимого количества объектов с помощью set maxobjects xxx
.Random
Дабы сделать структуры более интересными, мы добавим нечто менее статичное — добавим случайности. В SS случайность достигается определением нескольких правил с одним и тем же именем. Например:
R1
rule R1 {
{ x 0.9 rz 6 ry 6 s 0.99 sat 0.99 } R1
{ s 2 } sphere
}
rule R1 {
{ x 0.9 rz -6 ry 6 s 0.99 sat 0.99 } R1
{ s 2 } sphere
}
В данном примере правило R1 определено дважды. Теперь, каждый раз, когда необходимо вызвать такое правило, случайным образом будет выбираться одна из его реализаций. Выполнение примера выше может выдать, например, вот такой результат:
Послесловие
На этом, пожалуй, все. Надеюсь, что мне удалось привлечь внимание хабраобщества к Structure Synth и в ближайшее время можно ожидать появление новых замысловатых
Пара ссылок по теме: