Как это делается?
POV-Ray: общая характеристика
Простые сцены для трассировки
Более сложные сцены для трассировки
Если хочется большего
Технические характеристики
Заключение
Литература

Трассировка лучей (ray tracing) - метод машинной графики, позволяющий создавать фотореалистические изображения любых трехмерных сцен. Трассировка лучей моделирует прохождение лучей света через изображаемую сцену. Фотореализм достигается путем математического моделирования оптических свойств света и его взаимодействия с объектами. Сначала отдельные объекты располагаются в трехмерном пространстве-сцене, а также задаются физические и оптические свойства их поверхностей и их цвет. Затем определяется, где будут расположены источники света и наблюдатель. И наконец, с помощью программы трассировки лучей создается математическая модель сцены, света и наблюдателя, с помощью которой вычисляется цвет каждого пиксела графического изображения, получаемого на экране дисплея.

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

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

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

Затем для определения цвета пиксела производится проход дерева снизу вверх, при котором суммируются интенсивности цвета всех поверхностей, пересеченных первичным и всеми вторичными лучами с учетом затухания. Если ни одна из поверхностей не была пересечена первичным лучом, то пикселу присваивается цвет фона. Проблемы вычисления интенсивности цвета поверхностей очень подробно разбираются в работе [1].

Как это делается?

Трассировка лучей используется в МГ давно и успешно. Программы, выполняющие трассировку, нередко являются составной частью сложных систем геометрического моделирования, таких как, например, Alias Power Animator. Однако надо заметить, что, обеспечивая очень высокое качество изображений, трассировка лучей как метод визуализации требует довольно много времени и, как правило, применяется на финальных стадиях подготовки изображений. Зачастую одна картинка может трассироваться на протяжении нескольких часов и даже суток, но результаты оправдывают затраты. Совсем недавно это обстоятельство препятствовало широкому распространению трассировки среди пользователей ПК. Однако сейчас, когда мощные и сравнительно дешевые Pentium-системы сильно потеснили дорогие профессиональные графические рабочие станции, трассировка лучей и удивительные миры света и теней могут войти в каждый дом и в каждую лабораторию.

Среди широкого семейства программ, в которых так или иначе используется трассировка лучей, особое место занимает POV-Ray. Это de-facto одновременно стандартная программа трассировки и формат данных для описания сложных трехмерных сцен. Но что, пожалуй, самое важное - она абсолютно бесплатная. И здесь нет никаких подводных камней. Программа POV-Ray [2-4] разработана группой программистов, именующих себя POV-Ray team, и доступна для бесплатного копирования из http://www.povray.org/ пользователям Windows 3.1/Win32s, Windows 95/NT, MS DOS, Macintosh, i86 Linux, Unix, SGI IRIX, SunOS и Amiga. Сам я открыл для себя POV-Ray несколько лет назад и с тех пор постоянно использую его как в своих научных исследованиях, так и в учебном процессе в курсе "Компьютерная графика" на ПК, a также на рабочих станциях SGI и HP.

POV-Ray: общая характеристика

Итак, программа POV-Ray (Persistence Of Vision Raytracer) написана на стандартном C и доступна вместе с текстами программ для всех широко используемых платформ. После инсталляции POV-Ray представляет собой один исполняемый файл - собственно трассировщик и несколько каталогов с файлами палитр цветов, текстур и примеров 3D-сцен. Сцены для трассировки описываются в текстовых файлах на С-подобном языке. Эти файлы вместе с возможным дополнительным файлом параметров для визуализации являются входными данными для программы pov-ray. Результат работы трассировщика - изображение, нарисованное на экране дисплея и сохраненное в файле в формате TGA или GIF.

Простые сцены для трассировки

Рассмотрим, как описываются сцены в POV-Ray. На рис. 2 приведен пример описания простой сцены для трассировки.

#include "colors.inc"
#include "shapes.inc"
#include "textures.inc"
camera 
{
	location  <0, 3, -4>
	up <0, 1, 0>
	right <1, 0, 0>
	look_at   <0, 2,  2>
}
light_source 
{
	<2, 4, -3>
	color White
}
sphere 
{
	<0, 2, 2>, 2
	texture  
	{
		pigment {color Green}
		finish {phong 1}
 	}
}
plane
{
	<0,1,0>,0
	pigment 
	{
	checker
		color Red
		color Blue
	}
}

Рисунок 2.

Первые три команды #include необходимы для подключения библиотек стандартных цветов, геометрических объектов и текстур. Команда camera{} задает положение наблюдателя в точке с координатами (0, 3, -4), смотрящего в направлении точки с координатами (0, 2, 2). POV-Ray использует левую прямоугольную декартову систему координат XYZ, где оси X и Y параллельны экрану дисплея, а ось Z направлена внутрь. Следующая команда light_source{} задает положение одного точечного источника света в точке (2, 4, -3), излучающего белый свет. Команда sphere{} задает геометрические и оптические параметры блестящей зеленой сферы радиуса 2 с центром в точке (0, 2, 2). И наконец, команда plane{} определяет еще один геометрический объект - бесконечную горизонтальную плоскость, окрашенную в шахматную клетку с красными и синими полями. Сохранив этот текст в файле с именем my_scene.pov, нам остается только запустить программу povray:

povray +Imy_scene.pov +Omy_scene.tga +FT +V +D +H400 +W400

Параметры программы определяют, где находится файл описания сцены и в каком файле сохранить картинку, а также задают режим синхронного вывода изображения на экран дисплея и размер самого изображения 400x400. Результат работы программы приведен на рис. 3. Надо заметить, что рисовать картинку в процессе трассировки вовсе не обязательно, так как она будет записана в файл изображения по окончании процесса. Это позволяет выполнять трассировку на удаленных компьютерах в пакетных режимах счета.

Посмотрим теперь, как можно изменить внешний вид объектов, добавив тем самым больше реализма в изображение. Например, заменив в описании сферы графические атрибуты на

texture
{ 
	pigment {color Green} 
	normal {bumps 0.8  scale 0.2} 
	finish {phong 1} 
}

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

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

#include "colors.inc"
#include "shapes.inc"
#include "textures.inc"
camera 
{
  location  <0, 3, -4>
  up <0, 1, 0>
  right <1, 0, 0>
  look_at   <0, 2,  2>
}
light_source 
{
  <2, 4, -3>
  color White
}

union
{
  cone 
  {
    <0,0,1>,0.8
    <0,4.5,1>,0.0
    texture {White_Wood  scale 0.5}
  }
  difference
  {
    sphere 
    {
      <0, 2, 2>, 2
      texture { pigment {color Green} finish {phong 1}}
    }
    cylinder 
    {
      <0,2,-1.2>,<0,2,4.2>,0.5
      texture{Gold_Metal}
    }
  }
}
plane
{
  <0,1,0>,0
  pigment 
  {
    checker
      color Red
      color Blue
  }
}

Рисунок 6.

В следующем примере мы добавим в сцену другие геометрические объекты, "сделанные" из разных материалов, и применим к ним теоретико-множественные операции. В сцене (описание - рис. 6) в зеленой сфере сделана цилиндрическая дырка с золотыми стенками (мы вычли цилиндр из сферы), и затем все это проткнулось деревянным конусом. Здесь использовались операции union{} и difference{}.

Более сложные сцены для трассировки

К ним относятся объекты с "размытой" границей, которые можно использовать для моделирования облаков, тумана, пыли, дыма, пламени и светящихся газов. Для этих целей служат объекты halo, которые строятся на основе геометрических примитивов POV-Ray. Так, например, пламя, смоделировано в описании (рис. 8) путем превращения в объект halo уже известной нам сферы. Параметры объекта halo указывают, что объект должен излучать свет. Цвет объекта определяется заданной таблицей цветов с ее сферическим отображением на объем объекта с заданными параметрами и турбулентностью.

#include "colors.inc"
camera {
 location <0, 0, -2.5>
 look_at <0, 0, 0>
   }

light_source { <10, 10, -10> color rgb 1 shadowless }

sphere { 0, 1
  pigment { color rgbt <1, 1, 1, 1> }
  halo {
        emitting
        spherical_mapping
        linear
        turbulence 1.5
        color_map {
                      [ 0.0 color rgbt <1, 0, 0,   1.0> ]
                      [ 0.5 color rgbt <1, 1, 0, -1.0> ]
                      [ 1.0 color rgbt <1, 0, 0,   1.0> ]
                        }
        frequency 2
        samples 20
        scale 0.5
         }
   hollow
   scale 1.5
 }

Рисунок 8.
Описание сцены с объектом halo.

Чтобы дать общее представление о том, как с помощью простых и сложных объектов, текстур и световых эффектов можно создавать сложные виртуальные миры, объединим все вместе и рассмотрим, как сделана сцена. Это "классический" для МГ чайник, смоделированный POV-Ray в стиле Tiffany&Co, к которому для пущей выразительности добавим еще пара.

Основная часть описания этой сцены приведена на рис. 10. Команда plane описывает горизонтальную плоскость, на которой стоит чайник. Цвет плоскости задан компонентами красного, зеленого и синего цветов. Затем в программе определяются четыре сложных геометрических объекта с именами Cyl1_Pot, Cyl2_Pot, Cyl3_Pot, Tri_Pot, описанные в файлах с именами teapot.c1, teapot.c2, teapot.c3, teapot.tri соответственно. В этих файлах задаются цилиндры, задающие диагональные, горизонтальные и вертикальные сечения чайника, а также треугольники, задающие его поверхность. Эти файлы большие и скучные, так как состоят только из обращений к примитивам cylinder{} и triangle{}, и потому мы их пропустим, отметив, что POV-Ray позволяет разбивать сцены на модули и хранить их в разных файлах.

plane { y, -1
    pigment { color red 0.13 green 0.37 blue 0.41  }
    finish { ambient 0.1 }
}

#declare Cyl1_Pot = union { #include "teapot.c1" }
#declare Cyl2_Pot = union { #include "teapot.c2" } #declare 
Cyl3_Pot = union { #include "teapot.c3" }
#declare Tri_Pot = union { #include "teapot.tri" }

union {
    object { Cyl1_Pot texture { T_Gold_3C } }
    object { Cyl2_Pot texture { T_Gold_3C } }
    object { Cyl3_Pot texture { T_Gold_3C } }
    object { Tri_Pot
        texture { T_Gold_3C
            	  normal { granite 0.3 scale 0.2 }
        	}
    }
    cone {<0,0,4>,6
          <0,0,0>,0.2
          pigment { color rgbt <1, 1, 1, 1> }
          halo {
              attenuating
              spherical_mapping
              linear
              turbulence 1.0
              color_map {
                         [ 0 color rgbt <1, 1, 1, 1> ]
                         [ 1 color rgbt <1, 1, 1, 0> ]
                             }
              samples 10
                }
          hollow
          no_shadow
          scale<0.6,0.6,0.8>
          translate<3.1600,0.0000,2.40>
        }

    translate y 1
    translate ((3.15-2.0)/2)   z
    rotate -x 90
    rotate y 60
}

Рисунок 10.
Описание сцены "чайник с паром".

Следующей в описании сцены встречается команда union{}, объединяющая в одну сцену три группы цилиндров, треугольники и пар. Цилиндрам придана золотая текстура. Для треугольников используется такая же текстура, но с пертурбацией нормалей. Наконец, пар смоделирован как объект halo внутри задающего перевернутого конуса, приблизительно так, как это рассматривалось в предыдущем примере. Пар первоначально смоделирован в начале координат, а затем смасштабирован до требуемых размеров с помощью команды scale{} и перенесен к носику чайника командой translate{}. В заключение все объекты, объединенные командой union{}, сдвигаются вдоль координат y и z, с поворотом вокруг осей X и Y.

Описание методов и массу примеров трассировки лучей можно найти на узлах http://www.ntu.edu.sg/home/assourin и http://www.u-aizu.ac.jp/public/www/labs/sw-sm/FrepWWW/F-rep.html.

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

Здесь на помощь могут прийти диалоговые геометрические моделирующие программы, которые позволяют интерактивно размещать в трехмерном пространстве геометрические объекты, задавать источники света, определять положение наблюдателя и назначать графические атрибуты и материалы отдельным объектам. Результатом работы таких программ является файл в формате POV-Ray описывающий моделируемую сцену. Затем файл отрисовывается программой POV-Ray, и делаются необходимые изменения, чтобы наконец запустить окончательную трассировку.

Надо заметить, что POV-Ray team не разрабатывает никаких интерактивных средств моделирования сцен, но ссылки на два из них содержатся в http://www.povray.org/, и еще добрый десяток freeware программ может быть найден в сети для Windows/Windows 95.

Если хочется большего

POV-Ray поддерживается и, можно сказать, питается своими пользователями. Кроме основного набора функций, которые выполняет POV-Ray, существует еще очень много дополнительных библиотек и расширений программы. Часть из них поддерживается собственно POV-Ray team, но гораздо больше сделано и распространяется для POV-Ray его пользователями. Список того, что можно делать с помощью всех этих утилит и расширений, велик и разнообразен. Это и автоматическое моделирование деревьев, цепей и канатов. Это и набор линз и соответствующих эффектов для наблюдения смоделированных сцен. Это и средства, позволяющие "взорвать" любой сложный объект POV-Ray и превратить его в красиво разлетающиеся кусочки. Это и программы генерации ракушек и змей. Наконец, это программа конверсии файлов описания рельефа Digital Elevation Model.

Достаточно интересно расширение POV-Ray, разработанное R. Сузуки (http://www.public.usit.net/rsuzuki/e/povray/), которое позволяет производить трассировку объектов, заданных любой вещественной функцией вида f(x,y,z), где точки считаются принадлежащими объекту, если функция их координат больше или равна нулю. Это расширение позволяет включать практически любой тип геометрического объекта в моделируемую сцену. О математических методах моделирования геометрических объектов с помощью таких функций говорилось в статье [5], авторы которой используют упомянутое расширение POV-Ray для получения качественных изображений.

Технические характеристики

POV-Ray:

  • язык высокого уровня для описания 3D-сцен;
  • библиотеки типовых сцен, цветов, текстур и геометрических примитивов;
  • высококачественные изображения (до 48 бит на пиксел), встроенная программа вывода изображений для 15-ти и 24-битных дисплеев;
  • моделирование поверхностей по заданным высотам;
  • разнообразные источники света: прожектор, цилиндрические источники и поверхностные протяженные источники;
  • закраска по Фонгу, изображение бликов и излучений для реалистичных поверхностей;
  • моделирование атмосферных эффектов, включая туман, радугу и изображение светящихся объектов с неопределенными границами: облака, пыль, огонь и пар;
  • набор основных геометрических примитивов: сфера, параллелепипед, цилиндр, конус, поверхности второго порядка, треугольник и плоскость;
  • сложные геометрические объекты, включающие тор, гиперболоид, параболоид, поверхность Безье, высотные поля, потенциальные поля, поверхности четвертого порядка, сглаженные треугольники, текст, фракталы, суперквадрики, поверхности вращения, призмы, полигоны и планки;
  • возможность собирать объекты в более сложные, используя их объединение, включение, пересечение и вычитание (конструктивная геометрия - CSG);
  • возможность задания различных материалов с помощью стандартных текстур и изображений в файлах;
  • встроенные стандартные цвета, узоры и орнаменты;
  • возможность использования нескольких слоев полупрозрачных текстур или узоров из текстур, в том числе и созданных пользователем;
  • вывод графического изображения на экран в процессе трассировки.

Заключение

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


Литература

  1. A. S. Glassner,et al., "An Introduction to Ray Tracing", Academic Press, London, 1989.
  2. C. Young and D. Wells, "Ray Tracing Creations", 2d Ed., Waite Group Press 1994.
  3. A. Enzmann, L. Kretzschmar, C. Young, Ray Tracing Worlds with POV-Ray, Waite Group Press 1994.
  4. E. Schwan, Ray Tracing for the Macintosh CD, Waite Group Press, 1994.
  5. В. Аджиев, А. Пасько, В. Савченко, А. Сурин Моделирование форм с использованием вещественных функций. Открытые системы, 1996, #5 (19), с. 14-18.