<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Vjatcheslavwv</id>
		<title>Linuxformat - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Vjatcheslavwv"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Vjatcheslavwv"/>
		<updated>2026-05-13T15:39:25Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF132:pov-ray</id>
		<title>LXF132:pov-ray</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF132:pov-ray"/>
				<updated>2017-04-28T09:40:00Z</updated>
		
		<summary type="html">&lt;p&gt;Vjatcheslavwv: Свободная лицензия ''POV-Ray''&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: '''''POV-Ray''''' Создавайте новые миры всего несколькими строчками кода&lt;br /&gt;
&lt;br /&gt;
==''POV-Ray'': Строим новый мир==&lt;br /&gt;
&lt;br /&gt;
: Трехмерное моделирование – это не только ''Blender''. '''Вячеслав Ястребцев''' представляет другие рендереры, дающие новые возможности.&lt;br /&gt;
&lt;br /&gt;
{{Цикл/pov-ray}}&lt;br /&gt;
&lt;br /&gt;
Принято считать, что Linux обделён мультимедийными приложениями. До последнего времени это было обоснованным мнением, однако сегодня сообщество активно разрабатывает многочисленные программы для создания и просмотра мультимедиа. Трехмерные приложения – бесспорный лидер этого процесса. Стремительно развивающийся редактор трёхмерных сцен ''Blender'' (http://www.blender3d.org), используемый для создания трёхмерной графики и анимации профессионального качества; продвинутый рендерер ''YafAray'' (http://www.yafaray.org); наконец, вершина современных технологий визуализации – ''LuxRender'' (http://www.luxrender.net), обеспечивающий отрисовку изображений, практически неотличимых от фотографий – все они обещают скорый бум свободного ПО в медиа-индустрии. Но в тени стремительно растущих современных проектов тихо, без громких обещаний, развивается, пожалуй, самая почтенная система 3D-моделирования и визуализации, уходящая своими корнями в далёкие 80‑е, но достойная пристального внимания даже сегодня. Имя этому аксакалу – ''POV-Ray''.&lt;br /&gt;
&lt;br /&gt;
===Приготовимся к старту===&lt;br /&gt;
&lt;br /&gt;
Как и всякий старец, ''POV-Ray'' отличается консерватизмом и непростым характером. Двоичная версия релиза 3.6, доступная на http://www.povray.org, вышла аж в 2004 году, и её нормальная работа в современных дистрибутивах не гарантируется. Лучше сразу скачать исходный код ''POV-Ray'' 3.7 Beta и собрать его самостоятельно. Тут нас поджидают дополнительные хлопоты: при запуске конфигурационного скрипта требуется указать своё имя с помощью опции '''COMPILED_BY=«имя»''' (подойдёт любая комбинация букв и цифр). Кроме того, бета-версия требует постоянного ввода некого кода. Для его получения необходимо ввести в консоли команду ''povray --betacode''; программа напечатает набор символов, который необходимо присвоить переменной '''POVRAY_BETA''' и далее экспортировать, выполнив ''export POVRAY_BETA=код''.&lt;br /&gt;
&lt;br /&gt;
Установив программу, настройте параметры рендеринга. Откройте файл '''~/.povray/3.7/povray.ini''' и добавьте в его конец две строки: '''Pause_When_Done=On''', чтобы окно с готовым изображением не пропадало по завершении отрисовки, и '''Output_File_Name=«pov_render.png»''' – она указывает, в какой файл записывать созданное изображение.&lt;br /&gt;
&lt;br /&gt;
===Лицензии, лицензии===&lt;br /&gt;
&lt;br /&gt;
Неприятный сюрприз: ''POV-Ray'' не является свободным ПО. Да, исходные тексты доступны, и вы можете найти программу в репозиториях своего дистрибутива; но в 1986 году, когда была начата работа над проектом, GPL еще не была столь популярна. За прошедшие 24 года над ''POV-Ray'' успело потрудиться множество людей, поэтому изменить лицензию на более приемлемую в современном Linux-мире, увы, не представляется возможным. (Примечание: однако, по состоянию на 2017 год, версии POV-Ray с 3.7 и выше - имеют свободную лицензию GNU Affero General Public License; для устаревших версий программы действуют отдельные лицензии).&lt;br /&gt;
&lt;br /&gt;
===Азбука ''SDL''===&lt;br /&gt;
&lt;br /&gt;
Итак, всё готово для знакомства. ''POV-Ray'' не имеет встроенных средств интерактивного моделирования: есть множество программ, экспортирующих в его формат (в том числе альфа-версия ''Blender'' 2.5). Однако всю мощь ''POV-Ray'' можно раскрыть, только описывая сцену на ''SDL'' (Scene Description Language) – интерпретируемом языке программирования с ''С''-подобным синтаксисом.&lt;br /&gt;
&lt;br /&gt;
Сцены ''POV-Ray'' состоят из объектов, описываемых единым образом. Сам объект задаётся конструкцией вида:&lt;br /&gt;
&lt;br /&gt;
 тип_объекта {параметры}&lt;br /&gt;
&lt;br /&gt;
Параметры бывают двух видов: обязательные и дополнительные. Обязательные необходимо указывать при создании объекта, сразу после открывающей фигурной скобки. Если забыть это сделать, ''POV-Ray'' сообщит об ошибке и аварийно завершит работу. Обязательные параметры могут быть числами или векторами, имеют фиксированный порядок и разделяются запятыми. Дополнительные параметры, напротив, требуют указания имени параметра, за которым следует его значение (число, вектор или объект). Разделять дополнительные параметры запятой не нужно.&lt;br /&gt;
&lt;br /&gt;
Вектора в нотации ''POV-Ray'' записываются так:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;несколько чисел через запятую&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примером вектора может служить &amp;lt;1, 3, -2&amp;gt; или &amp;lt;0.2, 0.4, 0.9, 0.1&amp;gt;. Вектора используются для обозначения координат и цветов.&lt;br /&gt;
&lt;br /&gt;
Для ускорения работы ''POV-Ray'' позволяет использовать ряд сокращений: '''x, y, z''' – единичные вектора, совпадающие с соответствующими осями координат ('''x''' заменяет вектор &amp;lt;1, 0, 0&amp;gt;, '''y''' – &amp;lt;0, 1, 0&amp;gt;, '''z''' – &amp;lt;0, 0, 1&amp;gt;); при вводе дробей с нулевой целой частью можно не писать ноль перед точкой ('''.1''' вместо '''0.1''').&lt;br /&gt;
&lt;br /&gt;
Следует отметить различия координатной системы ''POV-Ray'' и ''Blender'': в последнем ось '''z''' направлена в зенит, а вращение объектов происходит по часовой стрелке (если смотреть по направлению оси вращения). В ''POV-Ray'' ось '''z''' направлена к горизонту виртуального мира, а вращение происходит против часовой.&lt;br /&gt;
&lt;br /&gt;
Вооружившись этими простыми правилами, приступим к написанию нашей первой сцены. Создайте текстовый файл с именем '''sphere.pov''', откройте его в любом текстовом редакторе (''Vi, Emacs, Kate'' «понимают» синтаксис SDL) и введите следующий текст:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
 camera {&lt;br /&gt;
 	 location &amp;lt;0, 0, -4&amp;gt;&lt;br /&gt;
 	 look_at &amp;lt;0,0,0&amp;gt;&lt;br /&gt;
 	 angle 50&lt;br /&gt;
 }&lt;br /&gt;
 light_source {&lt;br /&gt;
 	 &amp;lt;4,4,-3&amp;gt;, rgb 1&lt;br /&gt;
 }&lt;br /&gt;
 sphere {&lt;br /&gt;
 	 &amp;lt;0, 0, 0&amp;gt;, 1&lt;br /&gt;
 	 pigment {&lt;br /&gt;
 		 color rgb x&lt;br /&gt;
 	 }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В первой строке создаётся камера и определяются её основные характеристики: положение, отслеживаемая точка и угол поля зрения, соответственно. Положение камеры и точки обзора задаётся векторами. Как видите, ничего сверхъестественного нет – точно те же параметры (если не больше) мы бы указали, размещая камеру в ''Blender''. В шестой строке создаётся источник света, которому требуются два обязательных параметра: вектор, задающий положение лампы, и цветовой вектор, задающий окраску и интенсивность света. На последнем стоит остановиться подробнее. Строго говоря, цвет в ''POV-Ray'' описывается пятью числами: привычной RGB-триадой основных цветов, пропусканием [transmit] и фильтрацией [filter]. Ключевое слово '''rgb''' подсказывает ''POV-Ray'', что мы определяем только RGB-компоненты цвета, а пропускание и фильтрация будут нулевыми. Внимательный читатель может воскликнуть: «Цвет задаётся вектором, а в коде после rgb стоит число!» Ничего страшного в этом нет: ''POV-Ray'' догадается, что вы имели в виду, и заменит его на вектор требуемой размерности, все компоненты которого будут равны указанному числу. В нашем случае, получится вектор &amp;lt;1, 1, 1&amp;gt; обозначающий чистый белый свет.&lt;br /&gt;
&lt;br /&gt;
Наконец, в девятой строке создаётся сфера. Указываются два обязательных параметра: положение (вектор) и радиус (число), а далее идёт объявление нового объекта «пигмент» (pigment), вложенного в сферу. Пигменты задают цвет поверхности объекта-родителя: без них ''POV-Ray'' успешно отрисует сцену, но сфера будет выглядеть чёрным кругом. Внутри пигмента содержится параметр '''color'''. Здесь есть ещё одна причина для удивления: нам нужно задать цвет, а переменная '''x''' вроде бы описывает координаты? Все в порядке: '''x''' – это просто псевдоним для вектора &amp;lt;1, 0, 0&amp;gt;, что бы ни значили его компоненты; в данном случае они определяют красный цвет.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF132_65_1.jpg|200px]] Проба пера: красная сфера на черном фоне в десяти с небольшим строках кода.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
Созданную сцену необходимо скомпилировать (отрисовать). Откройте консоль, перейдите в каталог, содержащий файл '''sphere.pov''', введите команду ''povray sphere.pov'', и на экране появится изображение сферы. Вдоволь налюбовавшись на свое первое творение, щелкните по окну, чтобы закрыть его.&lt;br /&gt;
&lt;br /&gt;
===Мир без полигонов===&lt;br /&gt;
&lt;br /&gt;
Многие читатели, уже хорошо знакомые с трёхмерной графикой, могут заинтересоваться количеством полигонов в отрисованной сфере: уж больно гладкая у неё поверхность. Сообщаем: ни одного! Для описания сцены ''POV-Ray'' применяет математиче­ские функции, на ходу рассчитывая точки пересечения лучей света с идеально гладкими поверхностями их графиков, и хотя полигональные объекты можно использовать в сценах, они служат только для импорта моделей из сторонних приложений. С одной стороны, такой подход к моделированию непривычен, с другой – мы избавлены от многих «узких мест»: выбора между высоким качеством и объёмом занимаемой памяти, видимых изломов на поверхностях при достаточно малом расстоянии от камеры до объекта; наконец, сложные поверхности (например, горные хребты), требуют для корректного отображения просто чудовищного числа полигонов.&lt;br /&gt;
&lt;br /&gt;
В ''POV-Ray'' существует два основных способа моделирования: с помощью объединения базовых форм (сфер, цилиндров, кубов и т. д.) в более сложные объекты, либо путем создания собственных функций, описывающих сложную поверхность. Первый подход удобно применять для разнообразных технических изделий – деталей механизмов, зданий; второй же идеален для создания ландшафтов. Сегодня мы подробнее остановимся на моделировании с помощью функций, а механикой позанимаемся в следующей части.&lt;br /&gt;
&lt;br /&gt;
===Небо и земля===&lt;br /&gt;
&lt;br /&gt;
Поставим себе задачу изобразить планету радиусом около 6 000 условных километров, поднять на ней горы повыше Джомолунгмы, налить океан, прикрыть её атмосферой толщиной в десяток километров, а в довершение – вывести виртуальную камеру на орбиту и сфотографировать пейзаж. Не нужно бежать искать терабайтный винчестер – всё уместится в несколько килобайт!&lt;br /&gt;
&lt;br /&gt;
Для лучшего контроля за визуализацией нашей сцены, создадим новый файл с настройками рендерера. Просто скопируйте '''planet.ini''' с LXFDVD в директорию с вашим проектом – основные настройки ''POV-Ray'' в нем снабжены подробными комментариями; советую прочитать и их.&lt;br /&gt;
&lt;br /&gt;
Некоторые величины, описывающие геологию планеты (радиус, высота гор и т. д.), нам понадобятся не раз, и лучше сразу дать им понятные имена, чтобы не запутаться. Для определения имён разнообразных объектов в ''POV-Ray'' используется оператор '''#declare'''. Допишите в файл '''planet.pov''' следующие строчки:&lt;br /&gt;
&lt;br /&gt;
 #declare atmoradius = 6020;&lt;br /&gt;
 #declare planetradius = 6000;&lt;br /&gt;
 #declare reliefheigth = 30;&lt;br /&gt;
 #declare oceandeep = 11;&lt;br /&gt;
&lt;br /&gt;
Как всегда, хорошим тоном будет сразу разнести основные компоненты нашей сцены (материалы, функции и сами объекты) по отдельным файлам. Скажем, создайте файлы '''planet_texture.inc''' и '''planet_functions.inc''', а в '''planet.pov''' добавьте строки &lt;br /&gt;
&lt;br /&gt;
 #include «planet_functions.inc» &lt;br /&gt;
 #include «planet_texture.inc» &lt;br /&gt;
&lt;br /&gt;
Первую из них придется продублировать и в начале файла '''planet_texture.inc'''. Ключевое слово '''#include''' велит ''POV-Ray'' перед дальнейшей обработкой сцены открыть и прочитать указанный файл.&lt;br /&gt;
&lt;br /&gt;
Приступим к созданию объектов. Добавьте в '''planet.pov''' следующие строчки, создающие камеру и источник света:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
 camera {&lt;br /&gt;
 	 location z*-12000&lt;br /&gt;
 	 look_at 0&lt;br /&gt;
 	 angle 90&lt;br /&gt;
 }&lt;br /&gt;
 light_source {&lt;br /&gt;
 	 x*15000, rgb 1&lt;br /&gt;
 	 rotate y*40&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выражение '''z*-12000''' обозначает умножение вектора '''z''' на число -12 000, т.е. перемещение камеры на 12 000 единиц назад от центра мира ('''z''' – это вектор &amp;lt;0, 0, 1&amp;gt;, значит, z*-12000 – &amp;lt;0, 0, -12000&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
По умолчанию, в сцене ''POV-Ray'' присутствует рассеянное освещение для смягчения тени, но в космосе рассеянного света нет, поэтому нам следует отключить его:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
 global_settings {&lt;br /&gt;
 	 ambient_light 0&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь перейдите в файл '''planet_functions.inc''' – мы приступаем к созданию поверхности планеты. Сама она будет иметь форму шара, на котором располагаются микроскопические (относительно размеров планеты) неровности – горы. Для описания планеты необходимы минимум две функции: первая задает сферическую поверхность, вторая – создает рельеф. Нам же потребуется ещё одна: прибрежные области, как правило, имеют ровный, плоский рельеф, а в горах много провалов, трещин и изломов – третья функция будет отвечать за пересечённость местности.&lt;br /&gt;
&lt;br /&gt;
===Время кодировать===&lt;br /&gt;
&lt;br /&gt;
Начнём с создания сферы. Добавьте в '''planet_functions.inc''' строку:&lt;br /&gt;
&lt;br /&gt;
 #declare planetoid = function { sqrt( pow(x,2) + pow(y,2) + pow(z,2) ) }&lt;br /&gt;
&lt;br /&gt;
Она начинается с уже знакомого нам ключевого слова '''#declare''', после которого идёт имя определяемого объекта. Слово '''function''' за знаком равенства создаёт новый объект-функцию, математическое выражение для которой приведено в фигурных скобках. Если у вас есть вопросы – обратитесь к полному листингу на LXFDVD; он снабжен подробными комментариями. Необходимо отметить, что переменные '''x, y''' и '''z''' внутри функций меняют своё поведение: теперь это не вектора единичной длины, а координаты точки в пространстве, для которой вычисляется значение функции. В нашем случае, значением функции будет расстояние от точки в пространстве до центра сцены, а множество равноудалённых от центра точек образуют сферу.&lt;br /&gt;
&lt;br /&gt;
Чтобы сделать сферу видимой, нужно превратить абстрактную формулу в поверхность. Для этого применяется специальный объект – изоповерхность ('''isosurface'''), делающий видимыми области, в которых функция принимает определённое значение. Вернитесь в файл '''planet.pov''' и припишите к нему:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
 isosurface {&lt;br /&gt;
 	 function { planetoid(x,y,z) }&lt;br /&gt;
 	 threshold planetradius&lt;br /&gt;
 	 accuracy .000000001&lt;br /&gt;
 	 max_gradient 1.6&lt;br /&gt;
 	 contained_by { sphere { 0, planetradius+150 } }&lt;br /&gt;
 	 pigment { biosphere }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При создании объекта '''isosurface''' необходимо указать функцию, на основе которой будет строиться поверхность. У нас это '''planetoid()''', определённая ранее в файле '''planet_functions.inc'''. Следующий параметр – '''threshold''' (порог), сообщающий, через область с каким значением функции пройдёт будущая поверхность. Мы используем здесь ранее заданную переменную '''planetradius''', значение которой равно 6000 – это радиус сферы. Далее идут два важнейших для создания нормального изображения параметра: '''accuracy''' (точность) и '''max_gradient''' (максимальный градиент). Если их значения будут не оптимальны, мы получим чрезмерно долгую отрисовку с артефактами (тёмные полосы, дыры в поверхностях и т. д.). Легче всего настроить максимальный градиент: если он слишком мал или велик, ''POV-Ray'' напечатает в консоли предупреждение, предложив оптимальное значение. С '''accuracy''' сложнее: точность не должна быть ни слишком высокой, ни слишком низкой. Обычно требуются небольшие значения (порядка нескольких тысячных), а если очень малая '''accuracy''' не помогает избавится от артефактов, а, наоборот, усиливает их – это повод начать её увеличение. &lt;br /&gt;
&lt;br /&gt;
Параметр '''contained_by''' задаёт объект, ограничивающий пространство, в котором может располагаться изоповерхность. В нашей сцене ограничителем служит сфера с радиусом на 150 единиц большим, чем у планеты. Последний параметр назначает для нашей изоповерхности текстуру – это пигмент '''biosphere''', который пока что определен в '''planet_texture.inc''' следующим образом:&lt;br /&gt;
&lt;br /&gt;
 #declare biosphere = pigment { color rgb .6 }&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF132_66_1.jpg|200px]] Заготовка для нашей будущей планеты готова!|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
Посмотрите, что получилось: запустите в консоли ''povray planet.ini'' (или взгляните на рисунок). Да, это простой серый шар, но теперь мы можем деформировать поверхность, чтобы создать рельеф.&lt;br /&gt;
&lt;br /&gt;
===Поднимем горы===&lt;br /&gt;
&lt;br /&gt;
Вернитесь в файл '''planet_functions.inc''' и определите функцию, описывающую горы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
 #declare highland = function {&lt;br /&gt;
 	 pattern {&lt;br /&gt;
 		 crackle&lt;br /&gt;
 		 warp {&lt;br /&gt;
 			 turbulence .4&lt;br /&gt;
 			 octaves 4&lt;br /&gt;
 			 lambda 2&lt;br /&gt;
 			 omega .7&lt;br /&gt;
 		 }&lt;br /&gt;
 		 scale planetradius*.025&lt;br /&gt;
 	 }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь используется метод определения функции через встроенные в ''POV-Ray'' генераторы-паттерны [pattern], другими словами – процедурные текстуры. Функции, задаваемые с помощью паттернов, возвращают значения от '''0''' (чёрный цвет на текстуре) до 1 (белый цвет). В нашем случае используется паттерн '''crackle''' (аналог текстуры '''voronoi''' в ''Blender''); слово '''warp''' определяет искажение базовой формы, '''turbulence''' – тип и силу искажения; '''octaves, lambda''' и '''omega''' — дополнительные параметры; '''scale''' – модификатор, изменяющий размер рисунка (паттерны, их модификаторы и процедурные текстуры будут детально рассмотрены в следующей статье, а самые нетерпеливые могут обратиться к комментариям в файле на диске).&lt;br /&gt;
&lt;br /&gt;
Создадим еще одну функцию, описывающую контуры континентов и характер рельефа ('''bozo''' – близкий родственник ''Blender''-текстуры по имени '''clouds'''):&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF132_67_3.jpg|300px]] Лучше гор могут быть только горы, на которых еще не бывал...|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
 #declare lowlands = function {&lt;br /&gt;
 	 pattern {&lt;br /&gt;
 		 bozo&lt;br /&gt;
 		 warp {&lt;br /&gt;
 			 turbulence 1&lt;br /&gt;
 			 octaves 4&lt;br /&gt;
 			 lambda 2&lt;br /&gt;
 			 omega .4&lt;br /&gt;
 		 }&lt;br /&gt;
 		 scale planetradius*.3&lt;br /&gt;
 	 }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Наконец, объединим две предыдущие функции в одну, описывающую весь рельеф планеты:&lt;br /&gt;
&lt;br /&gt;
 #declare landscape = function {(lowlands(x,y,z)+highland(x,y,z)*pow(lowlands(x,y,z),4))*.7}&lt;br /&gt;
&lt;br /&gt;
Осталось лишь применить созданную функцию к изоповерхности. Вернитесь в файл '''planet.pov''' и замените соответствующую строку на&lt;br /&gt;
&lt;br /&gt;
 function { planetoid(x,y,z) - landscape(x,y,z)*reliefheigth }&lt;br /&gt;
&lt;br /&gt;
Снова запустите отрисовку командой '''povray planet.ini'''. Теперь она будет идти довольно долго, но вместо голого шара появится нечто, испещрённое горами и ущельями. Рельеф планеты готов!&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголоко=Скорая помощь|Содержание= Иногда ''POV-Ray'' 3.7 Beta выдает сообщение об ошибке: «Parse Error: Redeclaring functions is not allowed - #undef the function first!». Создаваемая функция считается уже объявленной, что вызывает аварийное завершение работы. Проблема решается путём добавления команды '''#undef &amp;lt;имя функции&amp;gt;''' перед объявлением последней.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
===Вдохнем жизнь===&lt;br /&gt;
&lt;br /&gt;
Как мёртвый каменный мир, наша планета неплохо смотрится уже сейчас, но куда интересней она будет выглядеть с атмосферой, водоёмами и лесами. Давайте нальем океаны – для этого нужно просто создать в '''planet.pov''' сферу со следующими настройками:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
 sphere {&lt;br /&gt;
 	 0, planetradius+oceandeep&lt;br /&gt;
 	 pigment { color rgb &amp;lt;0,.05,.5&amp;gt; }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь перейдём в файл '''planet_texture.inc''' и как следует разукрасим нашу планету. На Земле вершины гор скрыты льдом, сами скалы лишены растительности и окрашены в красно-коричневые оттенки, равнины покрыты густой зеленью, а прибрежные зоны – песком или галькой; нам нужно воспроизвести это чередование цветов. Вначале зададим основные цвета, вписав перед определением пигмента '''biosphere''' строки:&lt;br /&gt;
&lt;br /&gt;
 #declare silt = color rgb .7;&lt;br /&gt;
 #declare beach = color rgb &amp;lt;.5, .45, .05&amp;gt;;&lt;br /&gt;
 #declare forests = color rgb &amp;lt;0, .2, .02&amp;gt;;&lt;br /&gt;
 #declare rock = color rgb &amp;lt;.2, .08, .02&amp;gt;;&lt;br /&gt;
 #declare ice = color rgb .8;&lt;br /&gt;
&lt;br /&gt;
Далее надо изменить сам пигмент '''biosphere''' следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
 #declare biosphere = pigment {&lt;br /&gt;
 	 function { landscape(x,y,z) }&lt;br /&gt;
 	 color_map {&lt;br /&gt;
 		 [0 color silt]&lt;br /&gt;
 		 [.36 color silt]&lt;br /&gt;
 		 [.365 color beach]&lt;br /&gt;
 		 [.37 color beach]&lt;br /&gt;
 		 [.38 color forests]&lt;br /&gt;
 		 [.48 color forests]&lt;br /&gt;
 		 [.54 color rock]&lt;br /&gt;
 		 [.55 color rock]&lt;br /&gt;
 		 [.56 color ice]&lt;br /&gt;
 		 [1 color ice]&lt;br /&gt;
 	 }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь мы воспользовались объектом '''color_map''' чтобы из­менять цвет поверхности в зависимости от значения функции '''landscape()'''.&lt;br /&gt;
&lt;br /&gt;
Наконец, добавим атмосферу, определив в файле '''planet.pov''' объект '''sphere''' с параметрами:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF132_67_1.jpg|200px]] Нальем моря и пустим воздух. А заодно высадим лес.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
 sphere {&lt;br /&gt;
 	 0, atmoradius&lt;br /&gt;
 	 hollow&lt;br /&gt;
 	 material {atmosphere}&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Атмосфера рассеивает и поглощает солнечный свет. В объявлении сферы использовано ключевое слово '''hollow''', которое подготавливает объект к имитации объёмной среды, рассеивающей свет. Вместо пигмента задан материал (material) – сложнейший объект, объединяющий все оптиче­ские свойства предмета: от цвета поверхности до подповерхностного рассеивания света.&lt;br /&gt;
&lt;br /&gt;
Перейдём в файл '''planet_texture.inc''' и добавим в нём еще один интересный материал, следующего вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
 #declare atmosphere = material {&lt;br /&gt;
 	 texture { pigment { color rgbt 1 } }&lt;br /&gt;
 	 interior {&lt;br /&gt;
 		 media {&lt;br /&gt;
 			 scattering { 3, rgb &amp;lt;.1,.8,1&amp;gt;*.003 }&lt;br /&gt;
 			 absorption rgb &amp;lt;.1,.8,1&amp;gt;*.003&lt;br /&gt;
 		 }&lt;br /&gt;
 	 }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустив отрисовку, мы увидим голубоватую дымку, привычно окутывающую планету.&lt;br /&gt;
&lt;br /&gt;
===Запустим спутник===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF132_67_2.jpg|300px]] Земля в иллюми­наторе! Ну, не совсем Земля...|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
То, что у нас получилось – это не просто шар с текстурой! Замените старое описание камеры на следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
 camera {&lt;br /&gt;
 	 #local camLoc = -6200 * z;&lt;br /&gt;
 	 location camLoc&lt;br /&gt;
 	 sky -x&lt;br /&gt;
 	 look_at camLoc - x + .3*z&lt;br /&gt;
 	 angle 90&lt;br /&gt;
 	 rotate &amp;lt;-26, -.8, 0&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Камера подойдёт ближе к поверхности планеты (по земным меркам, высота над поверхностью составит около 150 километров) и повернётся к одному из хребтов. Выполните отрисовку еще раз – и вы увидите горную цепь с ущельями, напоминающими русла рек. Подобные пейзажи можно найти по всей виртуальной планете: просто изменяйте вектор после слова '''rotate''', чтобы переезжать с места на место.&lt;/div&gt;</summary>
		<author><name>Vjatcheslavwv</name></author>	</entry>

	</feed>