Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
эта страница доступна на следующих языках: English  Castellano  Deutsch  Francais  Russian  Turkce  

[Photo of the Author]
автор Antonio Castro

Об авторе:

Я учёный и имел возможность работать с различными аспектами Юникса. Кроме того, я решал различные задачи от разработки программ до системного администрирования.


Содержание:

 

POVRAY IV: Использование текстур в Povray

[Illustration]

Резюме:

В этой статье мы увидим, как использовать текстуры. В теории это уже было описано в предыдущих статьях (I, II, III).



 

Использование текстур в Povray

Когда мы создаём объект в 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'.

Несмотря на то, что глобус создан из простых форм интересно посмотреть, в каком порядке он был собран. Все мы знаем, что не всё равно, в каком порядке мы собираем части объекта.

  1. Располагаем сферу
  2. Поворачивая сферу по оси север - юг выбираем, какая именно часть глобуса нас интересует.
  3. Добавляем арку и бронзовую ось.
  4. Поворачиваем всё это на 20 градусов (наклон земной оси).
  5. добавляем подставку.

Всё это можно увидеть в полном листинге в конце статьи.

 

Финальные детали

... Всегда стоит попробовать несколько вариантов освещения.

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

После того, как элементы сцены размещены, всегда стоит вернуться к коду и попробовать несколько вариантов освещения. Мы использовали общее освещение возле потолка и центра.

[the scene]

Чтобы увидеть более яркую и большую сцену кликните на картинке.

 

Законченная сцена

В конце статьи мы воспроизводим полный листинг сцены.

Окончательный листинг 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 :

 

Ссылки

 

Листинги и картинки для статьи

 

Страница отзывов

У каждой заметки есть страница отзывов. На этой странице вы можете оставить свой комментарий или просмотреть комментарии других читателей.
 talkback page 

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:
es -> -- Antonio Castro
es -> en Katja Socher
en -> ru Yury Chursa

2001-08-23, generated by lfparser version 2.17

mirror server hosted at Truenetwork, Russian Federation.