POV-Ray может создавать новые объекты на основе уже имеющихся. Благодаря этому, из небольшого набора базовых объектов (примитивов) можно создать объект практически любой формы. Делается это с помощью пяти операций: инверсии, объединения, слияния, пересечения и разности. Все это действо называется конструктивная блочная геометрия (constructive solid geometry, CSG).

Внутри и снаружи

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

Инверсия

Инверсия меняет местами внутреннюю и внешнюю части пространства относительно данного объекта. Для ее применения используется ключевое слово inverse. В следующем примере инверсия приведет к тому что вместо сферы мы получим новый объект -- все пространство с вырезанной из него сферой:

sphere { <0,0,0>,100 inverse }

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

Внимание: если вы поместите камеру внутрь объекта, то POV-Ray выдаст предупреждение, потому что это может повлиять на такие эффекты, как туман и т. п. Поэтому, когда вы используете inverse, убедитесь, что вы не забыли камеру внутри какого-нибудь объекта.

Объединение

Объединение (union) позволяет создать группу объектов. После того как объекты объединились, любые преобразования выполняются уже над всей группой. Таким образом мы можем указать одно имя для группы объектов, например:

#declare MyObject =
  union
  { sphere { <-1,0,0>,2 }
    sphere { <1,0,0>,2 }

    pigment { color <1,1,1> }
  }

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

#declare MyObject=
  union
  { sphere
    { <0,-1,0>,2
      pigment { color <1,0,0> }
    }
    sphere
    { <0,1,0>,2
      pigment { color <0,1,0> }
    }
    sphere { <-1,0,0>,2 }
    sphere { <1,0,0>,2 }

    pigment { color <1,1,1> }
  }

Первая сфера будет красного цвета, вторая -- зеленого, а две последние -- белого, т. е. цвета, заданного глобальной текстурой объекта MyObject:

union.png

Кстати, текстура -- это рисунок, служащий для окраски поверхности объекта. В нашем случае это просто цвет.

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

Слияние

Объединение группирует объекты, но каждый из них сохраняет свою отдельную внутреннюю область. Это можно увидеть, если сделать объекты полупрозрачными:

union
{ sphere { <-1,0,0>,2 }
  sphere { <1,0,0>,2 }
  pigment { color <1,1,1> transmit 0.5 }
}

union_in.png

Такой эффект далеко не всегда желателен, особенно для прозрачных объектов. Чтобы избавиться от отдельных "внутренностей" существует операция слияния.

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

merge
{ sphere { <-1,0,0>,2 }
  sphere { <1,0,0>,2 }
  pigment { color <1,1,1> transmit 0.5 }
}

merge.png

Разница очевидна.

Пересечение

Пересечение (intersection) действует как логическая операция "И": точка принадлежит пересечению объектов тогда, когда она принадлежит каждому из объектов. Заменим в прошлом примере merge на intersection (и удалим полупрозрачность -- она больше не нужна):

intersection
{ sphere { <-1,0,0>,2 }
  sphere { <1,0,0>,2 }
  pigment { color <1,1,1> }
}

Получим:

intersection.png

Разность

Разность (difference) позволяет вычитать одни объекты из других. В результате ее выполнения второй и все последующие объекты вычитаются из первого объекта. Заменим intersection на difference и повернем полученный объект так, чтобы лучше рассмотреть результат вычитания:

difference
{ sphere { <-1,0,0>,2 }
  sphere { <1,0,0>,2 }
  pigment { color <1,1,1> }
  rotate <0,30,0>
}

difference.png

Что произойдет, если в рассмотренном примере вычитаемые сферы будут иметь разные текстуры? А вот что: часть, принадлежавшая первой сфере, будет иметь ее текстуру, а часть, принадлежавшая второй сфере останется со своей текстурой. Убедимся в этом:

difference
{ sphere { <-1,0,0>,2 pigment { color <1,1,0> } }
  sphere { <1,0,0>,2 pigment { color <0,1,0> } }
  rotate <0,30,0>
}

Теперь первая сфера желтая, вторая -- зеленая, и вот что даст вычитание:

difference2.png



Комментарии

comments powered by Disqus