Создание текстур -- одна из самых развитых возможностей POV-Ray и в нашем маленьком руководстве мы познакомимся лишь с малой частью этих возможностей. Собственно говоря, это предупреждение можно было бы написать в начале каждой главы, но для текстур оно особенно актуально.

Текстура задается следующим образом:

texture
{ pigment
  { ...
  }
  finish
  { ...
  }
  normal
  { ...
  }
}

Блок pigment определяет окраску объекта, finish -- отражающие свойства его поверхности, normal -- неровность поверхности.

Каждый элемент текстуры можно задать отдельно, не включая его в блок texture (в прошлой главе мы поступали так с цветовым пигментом pigment). Но блок texture удобен когда создается новая текстура.

Объявить можно текстуру целиком или отдельные ее элементы. Например:

#declare MyTexture=
  texture
  { pigment { команды pigment }
    finish { команды finish }
    normal { команды normal }
  }

#declare MyPigment=
  pigment
  { команды pigment
  }

Когда вы будете использовать объявленные текстуры или их элементы, убедитесь, что вы помещаете объявление внутрь нужного блока: текстуру внутрь texture, пигмент внутрь pigment и т. п. Например:

object
{ MyObject1
  texture { MyTexture }
}
object
{ MyObject2
  pigment { MyPigment }
}

Блоки finish и normal относятся к поверхности объекта. Кроме них, в текстуре texture можно задать блок interior для определения характеристик внутренней области объекта. Например, можно задать объект выполненным из стекла с заданным коэффициентом преломления. Об этом мы поговорим чуть позже, а пока...

Пигмент

Пигмент определяет как будет окрашена поверхность объекта. Для того чтобы задать однородный цвет объекта есть несколько возможностей.

Цвет может иметь до пяти компонентов: красный (red), зеленый (green) и синий (blue) цвета, а также filter и transmit. Каждый компонент можно определить независимо от других, например:

pigment { red 1 green 0.5 blue 0.1 filter 0.2 transmit 0.5 }

Обязательных компонентов в определении пигмента нет.

Другой вариант: использовать ключевое слово color и вектор цвета. Раньше мы использовали не более трех его компонент, но вообще-то их пять. Пример:

pigment { color <1, 0.5, 0.1, 0.2, 0.5> }

Первые три компоненты нам уже знакомы -- это красный, зеленый и синий цвета. Четвертая компонента -- это filter, а пятая -- transmit. Если мы опустим одну или несколько из этих величин в конце вектора, то POV-Ray будет считать их равными нулю. Кроме того, можно комбинировать вектор цвета и отдельно задавать filter и transmit, например:

pigment { color <1, 0.5, 0.1> transmit 0.5 }

Есть еще и третья возможность задать цвет -- с помощью команд rgb, rbgf, rgbt или rgbft. Вот как это выглядит:

pigment { rgb <1, 0.5, 0.1> }
pigment { rgbf <1, 0.5, 0.1, 0.2> }
pigment { rgbt <1, 0.5, 0.1, 0.5> }
pigment { rgbft <1, 0.5, 0.1, 0.2, 0.5> }

Команда rgb задает вектор из трех компонент цвета. В rgbf и rgbt к трем цветам добавляется четвертая компонента -- filter или transmit соответственно. Наконец, rgbft задает все пять компонент цвета и эквивалентна color.

Мы уже видели что команда transmit придает объекту прозрачность. При этом цвет проходящего сквозь объект света не изменяется, из-за чего объект выглядит более тусклым чем окрашенный тем же цветом, но непрозрачный.

Команда filter похожа на transmit, но она изменяет цвет проходящего сквозь объект света, то есть действует подобно тонированному стеклу.

Рассмотрим пример использования filter и transmit:

camera { location <0,8,-8> look_at <0,0,0> angle 35 }
light_source { <100,100,-200> color 1 }

plane { <0,1,0>,-1 pigment { rgb <1,1,1> } }
plane { <0,0,-1>,-2 pigment { rgb <1,1,1> } }

sphere { <-2.5,0,0>,1 pigment { rgbf <1,0,0,0.7> } }
sphere { <0,0,0>,1 pigment { rgbt <1,0,0,0.7> } }
sphere { <2.5,0,0>,1 pigment { rgbft <1,0,0,0.7,0.7> } }

Для левой сферы значение filter равно 0.7, для центральной такую же величину имеет transmit, а у правой сфере и filter и transmit равны 0.7. В результате получим:

filter_transmit.png

Обратите внимание, что тень за объектом с ненулевым filter также подкрашена.

Шаблоны окрашивания

Помимо однородного окрашивания в POV-Ray существуют различные шаблоны окрашивания поверхности (трафареты). Мы рассмотрим три из них: checker (шашки), hexagon (шестиугольники) и brick (кирпичи).

Для того, чтобы задать шаблон checker нужно указать два цвета (точнее -- два пигмента, так как можно задавать еще filter и transmit). Например, для задания черно-белой "шахматной доски", нужно указать следующее:

plane
{ <0,1,0>,0
  pigment { checker rgb <0,0,0>, rgb <1,1,1> }
}

Шаблон hexagon требует задания трех цветов и покрывает поверхность шестиугольниками-"сотами". Для создания подобия кирпичной стены шаблону brick нужно указать два цвета.

Посмотрим, как выглядят эти три типа шаблонов:

camera { location <0,8,-8> look_at <0,0,0> angle 35 }
light_source { <100,200,-200> color 1 }

// Пол в "шашечку"
plane { <0,1,0>,-1 pigment { checker rgb <0,0,0>, rgb <1,1,1> } }

// Куб, окрашенный "сотами"
box
{ <-1,-1,-1>,<1,1,1>
  pigment
  { hexagon rgb <1,0,0>, rgb <1,1,0>, rgb <1,0.5,0>
    scale 0.3
  }
  translate <-1.5,0,0>
}

// Куб, закрашенный "кирпичиками"
box
{ <-1,-1,-1>,<1,1,1>
  pigment
  { brick rgb <0.5,0.2,0>, rgb <1,0,0>
    scale 0.2
  }
  translate <1.5,0,0>
}

color_patterns.png

Видно, что каждая текстура преобразуется независимо от других.

Небольшое замечание по поводу текстур и преобразований: порядок, в котором задаются текстуры и преобразования имеет значение! Если вы сначала преобразуете объект, а потом зададите его текстуру, то текстура не будет преобразована вместе с объектом. Для этого нужно сначала задать текстуру, а уже потом преобразовать объект. Кроме того, преобразования, выполненные внутри блока texture влияют только на текстуру и не преобразовывают сам объект.

Чтобы продемонстрировать сказанное, рассмотрим следующий пример:

camera { location <0,8,-8> look_at <0,0,0> angle 35 }
light_source { <100,200,-200> color 1 }

// Бокс сначала масштабируется, а затем покрывается текстурой:
box
{ <-1,-1,-1>,<1,1,1>
  scale <0.5,1,2>
  pigment { checker rgb <1,0,0>, rgb <1,1,0> scale 0.3 }
  translate <-1.5,0,0>
}

// Бокс сначала покрывается текстурой, а потом масштабируется:
box
{ <-1,-1,-1>,<1,1,1>
  pigment { checker rgb <1,0,0>, rgb <1,1,0> scale 0.3 }
  scale <0.5,1,2>
  translate <1.5,0,0>
}

textures_transforms.png

В результате текстура изменилась только у правого бокса.

Как мы уже упоминали, для задания шаблона можно использовать не только цвет, но и вообще -- пигмент. То есть внутри блока pigment могут находиться другие пигменты:

pigment { checker pigment { Pigment1 }, pigment { Pigment2 } }

а внутри них, в свою очередь, еще пигменты -- и так еще и еще. Таким образом можно получить, например, шахматную доску, клетки которой будут казаться выполненными из белого и черного мрамора, а не просто нечто, окрашенное два однородных цвета.

Готовые текстуры

Большинство существующих в POV-Ray пигментов и текстур останутся за пределами этого руководства. Где найти цвета мы знаем, а найти текстуры можно в файле textures.inc.

Рассмотрим пример:

#include "colors.inc" // Нужно подключить до "textures.inc"
#include "textures.inc"

camera { location <0,8,-8> look_at <0,0,0> angle 35 }
light_source { <100,200,-200> color White }

box
{ <-3,-1,-3>,<3,0,3>
  pigment
  { checker pigment { Jade }, pigment { Red_Marble }
    scale 6/8
  }
}

В результате получим вот такой пол из нефрита и красного мрамора:

textures_inc.png

textures.inc как и colors.inc -- это обычный текстовый файл, который вы можете открыть и посмотреть в любом текстовом редакторе (точнее, отрывать нужно файл textures.v2, так как textures.inc просто подключает этот последний файл).



Комментарии

comments powered by Disqus