Объявление объектов
Мы можем объявить переменную, значением которой является объект. Например:
#declare MySphere=
sphere
{ <0,0,0>,1
pigment { color <1,0.5,0> }
}
Заметим, что пока мы только объявили объект, но еще не создали его. Чтобы создать объект, понадобиться команда object
:
object { MySphere }
Внутри блока object
можно задавать преобразования объекта.
Способ, позволяющий создавать несколько объектов с одним именем, мы рассмотрим в следующей главе.
Преобразования
POV-Ray позволяет выполнять различные преобразования объектов: перенос, вращение, масштабирование, а также явным образом задавать матрицу преобразований объекта.
Перенос (translation) . Бывает очень удобно объявить объект, создать несколько его копий в начале координат, а затем перенести эти копии на нужные места. Например:
#declare MySphere=
sphere
{ <0,0,0>,1
pigment { color <1,0.5,0> }
}
object
{ MySphere
translate <10,0,5>
}
object
{ MySphere
translate <-10,0,0>
}
Здесь создаются две сферы и одна перемещается в точку <10,0,5>
, а другая -- в <-10,0,0>
.
Вектор, стоящий после translate
, суммируется с вектором координат объекта. Например, если ваш объект расположен в <1,2,3>
и вы переносите его на <50,60,70>
, то новыми координатами объекта будут <51,62,73>
.
Поворот (rotation). В следующем примере
box
{ <-1,-1,-1>,<1,1,1>
rotate <0,0,45>
}
создается бокс, каждая сторона которого равна 2. Затем он поворачивается на 45 градусов вокруг оси {\(Z\)}.
Важно запомнить: объекты всегда вращаются относительно начала отсчета . Если нужно повернуть объект вокруг своей оси, то он должен находиться в начале отсчета. В противном случае объект будет вращаться вокруг начала отсчета, подобно тому как Луна вращается вокруг Земли (хотя иногда это -- как раз то, что нужно).
Компоненты вектора поворота представляют собой углы поворота, заданные в градусах. Если вектор поворота равен <angle1,angle2,angle3>
, то объект вначале поворачивается на angle1
градусов вокруг оси {\(X\)}, затем на angle2
градусов вокруг оси {\(Y\)} и, наконец, на angle3
градусов вокруг оси {\(Z\)}. Если угол поворота положительный, то объект поворачивается против часовой стрелки, а если отрицательный, то -- по часовой (вообразите, что вы сидите в начале отсчета и смотрите вдоль оси поворота: положительным считается поворот, выполненный против часовой стрелки).
Рассмотрим следующий пример:
camera { location <0,4,-9> look_at <0,0,0> angle 35 }
light_source { <10,20,-40> color 1 }
#declare MyBox =
box { <-1,-1,-1>,<1,1,1> pigment { color <1,1,1> } }
object
{ MyBox
translate <-1.5,0,0>
}
object
{ MyBox
translate <1.5,0,0>
rotate <0,0,30>
}
На сцене два бокса. Первый перенесен на 1.5 единицы влево (т. е. в отрицательном направлении оси {\(X\)}). Второй повернут против часовой стрелки вокруг оси {\(Z\)} на 30 градусов и затем перенесен на 1.5 единицы вправо. В результате мы получим вот такую картинку:
Обратите внимание на порядок выполнения преобразований. Он имеет существенное значение. Если мы сначала перенесем бокс, а затем повернем его, результат будет совсем другим:
-- второй бокс будет двигаться по "орбите" вокруг первого и повернется по ней на 30 градусов.
Масштабирование (Scale) . Увеличивать или уменьшать размеры объекта можно как равномерно так и на разную величину вдоль каждой оси. Команда scale cm
увеличивает все размеры объекта в cm
раз, где cm
-- коэффициент масштабирования .
Важно: масштабирование выполняется относительно начала отсчета . Например, если задана сфера с центром в <1,0,0>
и она масштабируется на 2 (scale 2
), то координаты каждой точки пространства (в том числе и точек сферы) увеличиваются вдвое. В результате, центр сферы будет находится в точке <2,0,0>
.
Посмотрим как это выглядит на практике. Создадим сферу с центром <1,0,0>
и выполним ее масштабирование. Для контроля поместим в начале координат сферу красного цвета.
camera { location <0,8,-8> look_at <0,0,0> angle 35 }
light_source { <100,200,-200> color 1 }
sphere
{ <0,0,0>,0.25
pigment { color <1,0,0> }
}
#declare MySphere = sphere
{ <1,0,0>,0.25
pigment { color <1,1,1> }
}
object
{ MySphere }
object
{ MySphere
scale 2
}
Большая сфера -- это результат масштабирования.
Если вам нужно просто изменить размеры объекта (без его переноса), то сначала перенесите его в начало координат, измените размеры, а затем верните объект на место:
object
{ MySphere
translate <-1,0,0>
scale 2
translate <1,0,0>
}
Исходная сфера оказалась внутри увеличенной.
Как видно из примера, внутри определения объекта можно помещать несколько преобразований. Не стесняйтесь сделать их столько, сколько вам нужно: количество преобразований не влияет на скорость рендеринга -- перед его выполнением POV-Ray выполнит все преобразования, в результате получится единственная матрица итогового преобразования размерности 4x4.
При отрицательных значениях коэффициента масштабирования выполняется зеркальное отражение объекта. POV-Ray не допускает нулевых значений коэффициента масштабирования. Поэтому, если вы хотите получить очень тонкий объект, используйте маленькие значения, например, cm = 0.00001
.
Пример:
camera { location <0,4,-9> look_at <0,0,0> angle 35 }
light_source { <10,20,-40> color 1 }
#declare MySphere =
sphere { <0,0,0>,1 pigment { color <1,1,1> } }
object
{ MySphere
translate <-1.5,0,0>
}
object
{ MySphere
scale <1,0.5,3>
translate <1.5,0,0>
}
Первая сфера перенесена на 1.5 влево. Вторая вначале масштабируется (ее размер вдоль оси {\(Y\)} умножается на 0.5, вдоль оси {\(Z\)} -- увеличивается в 3 раза, а вдоль оси {\(X\)} остается неизменным), а затем переносится на 1.5 вправо. И вот результат:
Комментарии
comments powered by Disqus