[LinuxFocus-icon]
Home  |  Plan  |  Index  |  Suchen

Nachrichten | Archiv | Links | Über uns
Dieser Artikel ist verfübar in: English  Castellano  Deutsch  Francais  Russian  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Photo of the Author]
von Antonio Castro
<acastro(at)ctv.es>

Über den Autor:

Ich bin Informatiker und habe die Gelegenheit gehabt, mit verschiedenen Unixsystemen zu arbeiten. Darüberhinaus hatte ich verschiedene Aufgaben von Softwaredesign bis Systemadministration.



Übersetzt ins Deutsche von:
Katja Socher <katja(at)linuxfocus.org>

Inhalt:

 

POVRAY IV: Der Gebrauch von Texturen in Povray

[Illustration]

Zusammenfassung:

In diesem Artikel schauen wir uns an, wie man Texturen benutzt. Wir haben sie schon auf einem theoretischen Niveau in den vorhergehenden Kapiteln (I, II, III) beschrieben.



 

Der Gebrauch von Texturen in Povray

Wenn wir ein Objekt in Povray designen, müssen wir zwei ganz verschiedene Dinge entscheiden:



Wir haben die enorme Vielseitigkeit von Povray, Farbmuster und verschiedene Formen von Oberflächen zu benutzen, gesehen, aber da ist noch mehr.

... dies ist eine Szene aus dem vielfältigen Angebot beim Gebrauch von Texturen.
In der Szene, die wir jetzt erklären werden, wurden viele Bilder benutzt, um die Objekte angemessen mit Farben, Glanz und Farbmustern sowie Zeichnungen und digitalen Fotos einzuwickeln (wrap). Aus diesem Grund nenne ich diese Szene ein abwechlungsreiches Angebot im Gebrauch von Texturen.

Viele Elemente wurden vorgestellt, um die verschiedenen Techniken beim Gebrauch von Texturen zu illustrieren. Wir werden lernen, flache, zylindrische und kugelförmige Objekte unter Benutzung von Bildern einzuwickeln.

Man muß anmerken, daß die Technik des Einwickelns von Objekten mit Bildern sehr mächtig ist. Mit einem guten Repertoire von texturierten Bildern kann fast alles gemacht werden. Man könnte versucht sein, immer diese Technik des Einwickelns zu benutzen mit Bildern, die von anderen erstellt wurden, aber auf diese Weise wird man niemals die kreative Flexibilität haben, die das Design von Texturen bereithält. Wir können unabhängige Muster, Farbverteilungen, Typen von Wirbeln, Intensität von Wirbeln, etc... variieren

Wir begleiten die Beschreibungen mit Illustrationen. Alle Bilder, die für die Erzeugung der Szene benutzt werden sowie die vollständige Auflistung des Povraycodes für die Szene kann man erhalten. In tar.gz Format

Wir beschreiben jetzt die verschiedenen Aspekte und Details der Szene.



Teil der Auflistung
#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>

Beispiel: 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>
  }
//Primero centrar el cubo en <0,0,0>
  translate <-0.5, -0.5, -0.5>
  scale <TamDisquete,TamDisquete,
                    TamDisquete/10 >
}  // end 'Disquete.inc';
Beispiel: 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';
       

 

Grundobjekte in Kastenform

In diesem Abschnitt sprechen wir über eine Technik, die sehr nützlich für das Einwickeln aller Klassen von Abbildungen ist, die Kästen ähnlich sind. In unserer Szene kann ein Blatt Papier als ein Kasten betrachtet werden, nur ist es total flach. Die Disketten haben etwas eines echten Kastens, da sie einige Millimeter dick sind.

In beiden Fällen benutzen wir für das Einwickeln eines Gegenstandes nur ein Bild. Wir benutzen in allen von ihnen die Projektion für flache Objekte. Im Fall der Bücher benutzen wir ein Bild für die Titelseite und ein anderes für den Buchrücken, aber wir erklären die Konstruktion jedes dieser Gegenstände.

Für das Blatt Papier ist es nicht notwendig, einen Würfel zu definieren. Das Bild ist auf die Kamera projiziert, statt aufwärts. Wir rotieren den Würfel um 90 Grad auf der x-Achse aus dem Grund, daß das verbleibende Bild aufwärts gedreht wird und wir geben ihm die passenden Proportionen. Wir geben den Blättern eine Dicke.

Die Disketten sind Gegenstände, die durch Benutzen des include Befehls erstellt werden. Es ist notwendig, die Werte, die wir als Parameter benutzen, um die Dimensionen der Diskette und seines Bildes zu setzen, zu initialisieren.

Auf der linken Seite kannst du die Auflistung von "Disquete.inc" sehen.


Jetzt wird es ein bißchen kompliziert, um die Bücher zu entwerfen, da dafür mehr Parameter gebraucht werden.

Für die Oberfläche, die den Rücken des Buches darstellt, müssen wir ein Gradientenmuster benutzen.

Wir konstruieren das Buch so, als ob es ein perfekter Würfel wäre, zentrieren den Würfel bei <0,0,0> und geben ihm die gewünschten Dimensionen. Auf diese Weise ist es einfacher die Position des Buchrückens und der Buchvorderseite, die auf der Vorderseite des Würfels plaziert wird, zu berechnen. Rücken und Vorderseite werden hinzugefügt, so als wären sie Kästen und dann drücken wir sie zusammen und machen sie sehr dünn.


Wir definierten Epsil als einen Betrag, der klein genug ist, um vom menschlichen Auge nicht wahrgenommen zu werden. Gleichzeitig ist er groß genug, um keine Division durch Null zu produzieren oder andere merkwürdige Effekte in flachen Oberflächen von verschiedenen Gegenständen, die genau dieselbe Position besetzen.

Auf der linken Seite siehst du die include Datei, die für die Bücher benutzt wurde. Wir lassen es als eine Übung für den Leser, ein allgemeineres Objekt zu konstruieren, das sechs Bilder akzeptiert, eines für jede Seite.

 

Glasobjekte

Unten sehen wir einige Muster mit Streifen. Sie stellen das Relief einer Oberfläche dar und wir werden sie benutzen, um ein Glas zu dekorieren wie graviertes Glas. Wir benutzen das Bild als ein Muster, um die normale Komponente in den verschiedenen Punkten auf dem Gegenstand zu verändern. Du kannst auf das Bild klicken, um weitere Details zu sehen.


 

Das Glas ist ein Kegelrumpf, wo wir einfach einen anderen inneren Rumpf, der etwas gerader ist und der die richtige Länge hat, um mit der Höhe des Wassers zu enden, hinzufügen müssen. Glas und Wasser sind daher das gleiche. Dies ist so, da wir der Einfacheithalber angenommen haben, daß Wasser und Glas identische Brechungskoeffizienten besitzen. Das Ergebnis ist eine geometrishe Form eines einzigen Materials. Dies ist sehr geeignet, da bekannt ist, daß das Glas mit Wasser beinahe durchsichtig wird aufgrund der Annäherung ihrer Brechungsindices.

Die Wasserflasche muß ein bißchen genauer herausgearbeitet werden, da sie aus mehreren einfachen kombinierten Formen zusammengesetzt ist (Zylinder, Rümpfe von Würfeln und Teile von einer Kugel), aber dieser Aspekt ist für uns in diesem Artikel nicht von Interesse, wir sagen nur, daß die benutzte Technik diesselbe ist wie für das Glas. Es ist nur einfach ein komplexerer Gegenstand.

 

Wände

Manchmal haben wir die Möglichkeit, zwischen der Benutzung von durch Povray generierte Muster oder der Benutzung eines Bildes zu wählen. Die Wände würden sich perfekt durch den Mustertyp bump herstellen lassen mit einer geeigneten Farbmap.

Stattdessen nemhem wir ein Bild, das wir benutzen. Um ein Bild als eine kontinuierliche Textur benutzen zu können, begrenzt man die Größe des Bildes. Die rechte Ecke fährt mit der linken und die obere Ecke mit der unteren fort, ohne das es bemerkt würde. Es gibt viele Bilder, die als Texturen benutzt werden können und es ist sehr günstig, einen guten Katalog von ihnen verfügbar zu haben.

Da wir diese Textur auf zwei Eckwänden projizieren müssen, rotieren wir die Textur um 45 Grad auf ihrer y-Achse. Dies würde eine Skalenverzerrung verursachen, weshalb wir die Skala der Textur entsprechend korrigieren.

Dieses Detail kann man in der abschließenden Auflistung der Szene sehen.

 

Der Globus

Dieser Gegenstand ist einfacher zu erstellen, als es auf den ersten Blick scheint. In dem anderen Beispiel haben wir Farbe projiziert, aber die Projektion ist genauso für kugelförmige Körper geeignet.. Der Sockel ist aus Bronze und der Fuß aus Holz. Durch Benutzen von Povrays eigenem Katalog von erzeugten Texturen können wir das Holz auswählen, das uns am besten gefällt. In diesem Fall haben wir 'DMFDarkOak' benutzt.

Obwohl der Globus aus einfachen Formen konstruiert wurde, ist es interessant zu sehen, in welcher Reihenfolge er zusammengesetzt wurde. Alles, was wir wissen, ist, daß es nicht dasselbe ist, die Teile der Gegenstände in irgendeiner Weise zusammenzusetzen. In diesem Fall gibt es einige Achsen, um die Teile angemessen zu plazieren.

  1. Wir errichten die Kugel
  2. Wir rotieren die Kugel gemäß der Süd/Nordachse, um den Teil des Globus auszuwählen, der uns interessiert.
  3. Wir fügen den Bogen und die bronzene Achse hinzu.
  4. Wir rotieren alles vorherige um 20 Grad (Neigung der Erdachse).
  5. Wir fügen den Fuß hinzu.

All dies kann in der vollständigen Auflistung am Ende gesehen werden.

 

Abschließende Details

... Es lohnt sich immer, einige Variationen in der Helligkeit auszuprobieren.

Wir könnten über einige weitere Gegenstände dieser Szene sprechen, wie das Trinkglas, die Bleistifte, den Boden, den Tisch, aber es gibt nicht mehr viel zu sagen, was herausragen würde, außer, daß wir im Falle des Tisches eine Textur benutzt und seinen Glanz und seine Leuchtkraft verändert haben, bis er wie der polierte Tisch aussah, den du in der Szene sehen kannst.

Sind einmal alle Elemente plaziert, ist es immer die Mühe wert, zu der Auswahl zurückzukehren und einige Variationen in der Beleuchtung zu testen. Wir haben eine allgemeine Beleuchtung neben der Decke und am Zentrum benutzt.

[the scene]

Du kannst auf das Bild klicken, um die letzte Szene glänzender und größer zu sehen.

 

Die vollständige Szene

Um den Artikel abzuschließen, reproduzieren wir die komplette Auflistung der Szene.

Final Listing 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 :

 

Referenzen

 

Quellen und Bilder des Artikels

 

Talkback für diesen Artikel

Jeder Artikel hat seine eigene Seite für Kommentare und Rückmeldungen. Auf dieser Seite kann jeder eigene Kommentare abgeben und die Kommentare anderer Leser sehen:
 Talkback Seite 

Der LinuxFocus Redaktion schreiben
© Antonio Castro, FDL
LinuxFocus.org

Einen Fehler melden oder einen Kommentar an LinuxFocus schicken
Autoren und Übersetzer:
es --> -- : Antonio Castro <acastro(at)ctv.es>
es --> en: Katja Socher <katja(at)linuxfocus.org>
en --> de: Katja Socher <katja(at)linuxfocus.org>

2002-02-24, generated by lfparser version 2.25