Объявление объектов

Мы можем объявить переменную, значением которой является объект. Например:

#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 единицы вправо. В результате мы получим вот такую картинку:

moved_boxes.png

Обратите внимание на порядок выполнения преобразований. Он имеет существенное значение. Если мы сначала перенесем бокс, а затем повернем его, результат будет совсем другим:

moved_boxes2.png

-- второй бокс будет двигаться по "орбите" вокруг первого и повернется по ней на 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
}

scale.png

Большая сфера -- это результат масштабирования.

Если вам нужно просто изменить размеры объекта (без его переноса), то сначала перенесите его в начало координат, измените размеры, а затем верните объект на место:

object
{ MySphere
  translate <-1,0,0>
  scale 2
  translate <1,0,0>
}

scale2.png

Исходная сфера оказалась внутри увеличенной.

Как видно из примера, внутри определения объекта можно помещать несколько преобразований. Не стесняйтесь сделать их столько, сколько вам нужно: количество преобразований не влияет на скорость рендеринга -- перед его выполнением 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 вправо. И вот результат:

scale3.png



Комментарии

comments powered by Disqus