Эта заметка доступна на: English Castellano Deutsch Francais Russian Turkce |
автор Antonio Castro Об авторе: Я учёный и имел возможность работать с различными аспектами Юникса. Кроме того, я решал различные задачи от разработки программ до системного администрирования. Содержание: |
Резюме:
В этой статье мы увидим, как использовать текстуры. В теории это уже было описано в предыдущих статьях (I, II, III).
Когда мы создаём объект в Povray нужно выбрать две различные вещи:
Мы уже видели огромную разносторонность Povray, когда использовали паттерны цветов и различные отделки поверхностей, но есть ещё многое....
|
Многие элементы были введены для иллюстрации различных техник использования текстур. Мы будем учиться обёртывать картинками плоские, цилиндрические и сферические объекты.
Можно заметить, что техника обёртывания объектов картинками очень мощная. С хорошим запасом текстур можно создать почти всё. Кто-то может соблазниться этим и всегда использовать картинки созданные кем-то другим, но этот путь никогда не даст той свободы творчества, которую предоставляют текстуры в Povray . Мы можем варьировать различные паттерны, распределение цветов, типы турбулентности и так далее ...
Мы сопроводим описания иллюстрациями. Все картинки использованные для создания сцены, а также все pov-файлы могут быть получены здесь в формате tar.gz
Теперь мы опишем различные аспекты и детали сцены.
|
Фрагменты главного файла |
---|
#declare Papel = object { box { <0,0,0,> <1,1,1> } texture { pigment{ image_map { gif "gifs/hoja.gif" } } finish { ambient 0.4 diffuse 0.6 } } rotate x*90 scale <12, 0.001, 20> |
Пример использования Disquete.inc |
#declare TamDisquete = 5; #declare PortadaDisquete = "gifs/disquete1.gif" #include "Disquete.inc" object { Disquete rotate x*90 translate <80, -10, 147> } |
Disquete.inc |
#declare Epsil = 0.0001; #declare Disquete = object { box { <0, 0, 0> <1,1,1> texture { pigment{ image_map { gif PortadaDisquete once } } } translate <-0.5,-0.5,-0.5> } //Пример куба с центром в <0,0,0> translate <-0.5, -0.5, -0.5> scale <TamDisquete,TamDisquete, TamDisquete/10 > } // end 'Disquete.inc'; |
Пример использования Libro.inc |
#declare LargoLibro = 20; #declare AnchoLibro = 12; #declare GruesoLibro = 3.5; #declare PortadaLibro = "scan_gif/bookp2.gif" #declare LomoLibro = "scan_gif/bookl2.gif" |
Libro.inc |
#declare Epsil = 0.0001; #declare TextureLibro = texture { pigment { gradient z color_map { [0.0 colour White ] [0.1 colour Gray90 ] [0.2 colour White ] [0.3 colour Gray95 ] [0.4 colour White ] [0.5 colour Gray80 ] [0.6 colour White ] [0.6 colour Gray95 ] [0.8 colour White ] [0.9 colour Gray90 ] [1.0 colour Gray85 ] } // end colourmap; } // end pigment; finish { ambient 0.3 diffuse 0.7 } scale <1, 1, 0.3> } // end Texture; #declare Libro = object { union { box { <0, 0, 0> <1,1,1> texture { TextureLibro } translate <-0.5, -0.5, -0.5> } // Portada del libro; box { <0,0, 0> <1, 1, 1> texture { pigment{ image_map { gif PortadaLibro once } } } translate <-0.5, -0.5, -0.5> scale <1-Epsil, 1-Epsil, 1+Epsil> } // end box; // Lomo del libro; box { <0,0,0 > <1 ,1 ,1 > texture { pigment{ image_map { gif LomoLibro once } } } translate <-0.5, -0.5, -0.5> scale <1-Epsil, 1-Epsil, 1+Epsil> rotate y*90 } // end box; } // end union translate <-0.5, -0.5, -0.5> // Centrar el cubo en <0,0,0>; scale <AnchoLibro,LargoLibro, GruesoLibro> } // end 'Libro.inc'; |
В этом разделе мы поговорим о технике очень полезной при обёртывании любых фигур подобных коробке. В нашей сцене лист бумаги будет представлен коробкой, но абсолютно плоской. Дискеты это настоящие коробки, так как они имеют толщину несколько миллиметров.
В обоих случаях мы будем использовать только одну картинку для обёртывания с проекцией для плоских объектов. Для книг мы будем использовать одну картинку для лицевой стороны и другую для обратной, а также объясним создание каждого из этих объектов.
Для листа бумаги нет необходимости определять куб. Картинка проецируется от камеры, а не вверх. Мы повернули куб на 90 градусов вокруг оси x для того, чтобы картинка была повёрнута вверх, а также дали ей правильные пропорции. Мы также определили толщину листа.
Флоппи диски были выполнены с использованием оператора include. Необходимо инициализировать значения, которые мы будем использовать как параметры для того, чтобы задать размеры дискеты и её вид.
Слева вы можете видеть листинг "Disquete.inc"
Немного сложнее будет создать книгу, так как необходимо больше параметров.
Для обратной поверхности книги мы используем градиент.
Мы создадим книгу, как если бы она была правильным кубом с центром в <0,0,0> и необходимыми размерами. Так будет легче вычислить положение обратной и лицевой стороны, которые будут помещены перед кубом. Обратная и лицевая стороны будут добавлены как коробки, мы только сделаем их очень тонкими.
|
Мы определили Epsil как размер достаточно маленький для того, чтобы не быть видным человеческому глазу. В то же время он должен быть достаточно большим, чтобы не приводить к делению на ноль или странным эффектам на плоских поверхностях, которые занимают одно и тоже положение.
Слева вы видите include файл используемый для книг. Мы предоставляем читателю самому сконструировать более общий объект, который строится на основании шести картинок, одной для каждой стороны как упражнение.
Ниже вы видите несколько паттернов с полосками. Они представляют рельеф поверхности, и мы будем использовать их для украшения стекла похожего на гравировку. Мы используем картинку как паттерн для изменения нормальных компонент в различных точках объекта. Чтобы увидеть больше деталей кликните на картинке.
|
Стакан это просто конический корпус, к которому мы просто добавили ещё один внутренний с длиной равной уровню воды. Так что хрусталь и вода это один предмет. Это потому, что для простоты мы предположили, что вода и стакан имеют одинаковый коэффициент преломления. Полученная геометрическая форма создана из одного материала. Это допустимо, так как известно, что стекло в воде становится практически невидимым из-за близости коэффициентов преломления.
Бутылка воды была проработана больше, так как она создана объединением нескольких форм (цилиндров, конусов и фрагментов сферы) но это не так важно для этой статьи, скажем только, что мы использовали ту же технику, что и для стакана. Это просто более сложный объект.
Иногда у нас есть возможность выбора между паттернами сгенерированными Povray и картинками. Стены могут быть отлично представлены выпуклыми паттернами с подходящей цветовой картой.
Так как нам нужно проецировать текстуру на две угловых стены, то мы повернём текстуру на 45 градусов относительно оси y. Это может привести к искажению пропорций, но для этого мы соответственно скорректируем масштаб.
Детали можно увидеть в полном листинге сцены.
Этот объект проще построить, чем кажется на первый взгляд. В другом примере мы проектировали цвет, но проекция подходит также и для сферических тел.'map_type 1' крепление из бронзы и подставка из дерева. Можно выбрать наиболее подходящую структуру дерева из каталога Povray.Здесь мы использовали 'DMFDarkOak'.
Несмотря на то, что глобус создан из простых форм интересно посмотреть, в каком порядке он был собран. Все мы знаем, что не всё равно, в каком порядке мы собираем части объекта.
Всё это можно увидеть в полном листинге в конце статьи.
|
Можно рассказать о других объектах этой сцены, таких как стакан для карандашей, карандаши, пол и стол. Но тут нечего особо сказать, кроме того, что для стола мы использовали текстуру изменив её яркость и интенсивность цвета так, чтобы стол выглядел полированным.
После того, как элементы сцены размещены, всегда стоит вернуться к коду и попробовать несколько вариантов освещения. Мы использовали общее освещение возле потолка и центра.
Чтобы увидеть более яркую и большую сцену кликните на картинке.
В конце статьи мы воспроизводим полный листинг сцены.
Окончательный листинг Estudio.pov | |
---|---|
//////////////////////////////////////////// // // Autor: Antonio Castro Snurmacher // //////////////////////////////////////////// #include "colors.inc" #include "textures.inc" #include "glass.inc" #declare Plastico = finish { ambient 0.4 diffuse 0.45 reflection 0.15 phong 0.3 phong_size 20 } #declare Camera_pl_general = camera { location <0,45, -20> look_at <80, -20, 200> angle 20 } #declare Camera_detalle_vaso = camera { location <0,45, -20> look_at <97,-6, 170> angle 3.2 } #declare Camera_detalle_botella = camera { location <0,45, -20> look_at <45,0, 190> angle 8 } #declare Camera_detalle_papel = camera { location <0,45, -20> look_at < 85, -10, 145> angle 10 } //camera { Camera_detalle_botella } //camera { Camera_detalle_vaso } //camera { Camera_detalle_papel } camera { Camera_pl_general } // Fuente de luz blanca en el techo light_source { <0, 40, 90> color White } // Fuente de luz tenue de mesa light_source { <0, 40, 190> color White spotlight radius 8 falloff 12 tightness 10 point_at // < 70, -10, 160> < 65, -10, 155> } #declare Cubilete = object { intersection { cylinder { <0,0,0> <0,6,0> 2 } cylinder { <0,1,0> <0,6.5,0> 1.9 inverse } } } #declare GloboTierra = object { union{ union{ sphere { <0,0,0> 1 texture { pigment{ image_map { gif "gifs/geoideok.gif" map_type 1 // Esfera } } finish { Plastico } } interior{ I_Glass} //rotate y*25 rotate y*-25 } cylinder { <0,-1.28, 0> <0, 1.28, 0> 0.1 texture { Bronze_Metal } interior{ I_Glass} } intersection { sphere { <0,0,0> 1.28 } box { <0,-1.5,-0.06> <1.5, 1.5, 0.06> } sphere { <0,0,0> 1.1 inverse } texture { Bronze_Metal } interior{ I_Glass} } rotate z*-20 } union{ // pie cylinder { <0, -1.1, 0> <0, -1.8, 0> 0.15 texture { Bronze_Metal } interior{ I_Glass} } cone { <0, -1.8, 0> 1 <0, -1.6, 0> 0.7 texture { pigment { DMFDarkOak } scale <0.3, 0.3, 0.3> } interior{ I_Glass} } } } translate <0, 1, 0> scale <7,7,7> } #declare VasoAgua = object { intersection { cone { <0, 0, 0> 2.5 <0,7,0> 2.9 } cone { <0, 4, 0> 2.45 <0,7.5,0> 2.8 inverse } } texture { Glass2 normal { bump_map { gif "gifs/vaso_norm.gif" map_type 2 // Clindro bump_size 0.5 } } scale <7,7,7> } interior{ I_Glass} } #declare BotellaAgua = object { union { intersection { merge { cylinder { < 0, 18.1, 0> < 0, 20 , 0> 0.9 } cone { < 0, 14 , 0> 2.9 < 0, 18.1, 0> 0.9 } sphere { < 0, 12.5, 0> 3.3 } cylinder { < 0, 0 , 0> < 0, 12 , 0> 3.2 } } merge { cylinder { < 0, 18 , 0> < 0, 20.1, 0> 0.8 } cone { < 0, 13.9, 0> 2.8 < 0, 18.0, 0> 0.8 } sphere { < 0, 12.4, 0> 3.2 } cylinder { < 0, 6 , 0> < 0, 12.5, 0> 3.1 } inverse } texture { Glass2 normal { bump_map { gif "gifs/botella_norm.gif" map_type 2 // Clindro bump_size 1 } } scale <15, 15, 15> } interior{ I_Glass} } |
cylinder { < 0, 20, 0> < 0, 19, 0> 1.1 // Tapon texture { pigment {Blue} finish { Plastico } } // fin Tapon interior{ I_Glass} } } } #declare Papel = object { box { <0,0,0,> <1,1,1> } texture { pigment{ image_map { gif "gifs/hoja.gif" } } finish { ambient 0.4 diffuse 0.6 } } interior{ I_Glass} rotate x*90 scale <12, 0.001, 20> } #declare RadLapiz = 0.3; #declare Lapiz = object { union { cylinder { <0,0,0> <0,7.5,0> RadLapiz texture { pigment { DMFDarkOak }} interior{ I_Glass} } cylinder { <0,7.5,0> <0,8.5,0> RadLapiz texture { Gold_Metal } } cone { <0,0,0>RadLapiz <0,-0.8,0> 0.1 texture { pigment { White_Wood } } interior{ I_Glass} } cone { <0,-0.8,0> 0.1 <0,-1, 0> 0 texture { pigment { Black } } interior{ I_Glass} } } } #declare Paredes = object { box { <-100,-50, -50> <100,80, 200> } texture { pigment{ image_map { gif "gifs/gotelet.gif" } } finish { ambient 0.3 diffuse 0.6 } rotate y*45 scale <5, 7, 5> } interior{ I_Glass} } #declare TextuSuelo = texture { pigment { checker color Black color Blue} } #declare Suelo = object { plane { y, -49.9 } texture { PinkAlabaster } interior{ I_Glass} } #declare Mesa = object { union { box { < -80, -10.001, 140> < 100, -13 , 200> } box { < -79, -50, 141> < -75, -10, 145> } box { < 99, -50, 199> < 95, -10, 195> } box { < -79, -50, 199> < -75, -10, 195> } box { < 99, -50, 141> < 95, -10, 145> } } texture { EMBWood1 rotate y*90 rotate x*90 scale <5,5,5> finish { ambient 0.1 diffuse 0.1 specular 1 reflection 0.2 roughness .1 } } interior{ I_Glass} } object {GloboTierra translate <90, -4, 190> } object { Paredes } object { Suelo } object { Mesa } object { Lapiz rotate z*10 translate < 70, -10, 165> } object { Cubilete translate < 70, -10, 165> texture { pigment { White_Wood } } interior{ I_Glass} } object { VasoAgua translate <97,-10, 170> } object { BotellaAgua translate <45,-10, 190> } object { Lapiz rotate z*90 translate < 80, -10+(RadLapiz/2), 155> } object { Papel rotate y *-30 translate < 85, -10, 145> } // ***** Libro LinuxBible ***** #declare LargoLibro = 20; #declare AnchoLibro = 12; #declare GruesoLibro = 4.5; #declare PortadaLibro = "gifs/bookp2.gif" #declare LomoLibro = "gifs/bookl2.gif" #include "Libro.inc" object { Libro rotate x*90 rotate y *-60 translate <36, -10, 165> } // ***** Varios Libros ***** #declare LargoLibro = 20; #declare AnchoLibro = 12; #declare GruesoLibro = 13; #declare PortadaLibro = "gifs/bookp1.gif" #declare LomoLibro = "gifs/bookls1.gif" #include "Libro.inc" object { Libro rotate x*90 rotate y *-90 translate <55, -10, 195> } #declare TamDisquete = 5; #declare PortadaDisquete = "gifs/disquete1.gif" #include "Disquete.inc" object { Disquete rotate x*90 translate <80, -10, 147> } #declare TamDisquete = 5 ; #declare PortadaDisquete = "gifs/disquete2.gif" #include "Disquete.inc" object { Disquete rotate x*90 rotate y*30 translate <90, -10, 165> } // vim: set sw=2 ts=2 et : |
|
Webpages maintained by the LinuxFocus Editor team
© Antonio Castro, FDL LinuxFocus.org Click here to report a fault or send a comment to LinuxFocus |
Translation information:
|
2001-08-23, generated by lfparser version 2.17