Spezialformen


Wenn keine der Primitiven paßt, kann man eine Reihe von Spezialformen verwenden.

Das Dreieck (triangle) ist die allgemeinste Form, aus der man bereits beliebige Körper zusammensetzen könnte. Das Dreieck zeichnet sich dadurch aus, daß die Flächennormale an jedem Punkt der Fläche identisch ist:



/* ...................*/

#declare P0 = <0, 0, -1>
#declare P1 = <0, 0,  1>
#declare P2 = <0, 1,  0>

triangle {P0, P1, P2
     texture {
      pigment {
         color rgb <0.9, 0.2, 0.2>
      }
      finish {
         phong 0.9
         ambient 0.5
      }
     }
}

Das gebogene Dreieck (smooth_triangle) ist zum Zusammensetzen großer Körper deshalb besser geeignet, da mit diesem auch gekrümmte Teile des Körpers erzeugt werden können. Die Krümmung wird durch die Angabe der Flächennormalen an den 3 Punkten spezifiziert:



/* ............... */

#declare P0 = <0, 0, -1>
#declare P1 = <0, 0,  1>
#declare P2 = <0, 1,  0>

#declare N0 = <0.5, 0, 1.5>
#declare N1 = <0.5, 0, -1.5>
#declare N2 = <0.5, 1, 0>

smooth_triangle {P0, N1, P1, N1, P2, N2
     texture {
      pigment {
         color rgb <0.9, 0.2, 0.2>
      }
      finish {
         phong 0.9
         ambient 0.5
      }
     }
}

Gut geeignet sind auch Bezier-Flächen (bicubic_patch). POVRAY versucht auf der Grundlage 16 vorgegebener Stützpunkte eine Fläche mit einer Annäherung "flatness" an diese und einer X-Z-Granulation von "u_steps" und "v_steps" zu realisieren.



/* .................*/

#declare P0 = <-1, 1.0, -1> 
#declare P1 = < 0, 0.5, -1> 
#declare P2 = < 1, 0.2, -1> 
#declare P3 = < 2, 0.0, -1> 
/**************/
#declare P4 = <-1,  0.8, 0> 
#declare P5 = < 0,  0.6, 0> 
#declare P6 = < 1,  0.5, 0> 
#declare P7 = < 2,  0.4, 0> 
/**************/
#declare P8 = <-1,  1.2, 1> 
#declare P9 = < 0,  0.9, 1> 
#declare P10 = < 1, 0.7, 1> 
#declare P11 = < 2, 0.6, 1> 
/**************/
#declare P12 = <-1, 1.97 2> 
#declare P13 = < 0, 1.0, 2> 
#declare P14 = < 1, 0.9, 2> 
#declare P15 = < 2, 1.0, 2> 

bicubic_patch {
	type 0
	flatness 0.1
	u_steps 100
	v_steps 100
	P0,  P1,  P2,  P3,
	P4,  P5,  P6,  P7,
	P8,  P9,  P10, P11,
	P12, P13, P14, P15
	texture {
		pigment {
			color rgb <0, 0, 1>
		}
		finish {
			phong 0.90
		}
	}
}

Hilft gar nichts, so kann man auch ein GIF-Image zur Beschreibung des Körpers verwenden. Dabei wird der Umstand ausgenutzt, daß im GIF-Image zunächst ein maximal 256 Einträge langer Colortable enthalten ist. Dieser beschreibt die RGB-Werte von bis zu 256 Farben. Die Pixel werden dann mit Hilfe dieser Indizes beschrieben, d.h. es folgt die Beschreibung der Punkte als Folge von Indexwerten. Dieses wird beim sogenannten "height_field" ausgenutzt. Hierbei spielt der Farbwert des Punktes keine Rolle, wohl aber sein Index. Das GIF-Image wird in die X-Z-Ebene gelegt und so skaliert, daß es die Fläche <0, 0, 0> bis <1, 0, 1> einnimmt, wodurch den Punkten des GIF-Images X-Z-Wertes des POVRAY-Images zugeordnet werden.

Die Y-Werte (Höhe) ergeben sich durch den Index, den der Punkt im GIF-Image hat. Ein Punkt, der durch den Index 0 beschrieben wird, hat die Höhe 0. Ein Punkt, der durch den Index 255 beschrieben ist, hat die Höhe 1. Dadurch nimmt das heigh_field einen Würfel mit der Kantenlänge 1 ein.

Durch Skalieren, und Verschieben läßt es sich an jeden Punkt des POVRAY-Koordinatensystems befördern, wo es beliebige Größen annehmen kann. Allerdings ist die Skalierung umso besser möglich, je größer das GIF-Image ist.


camera {
	location <-1.5, 3, -3>
	look_at  <-1.5, 1,  0>
	
}

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

light_source {
	<0, 100, -6>
	color rgb <1, 1, 1>
}

height_field { gif "tulogo1.gif"
      texture {
         pigment {
            color rgb <1, 1, 0.2>
         }
         finish {
            phong 0.7
         }
      } 
      rotate <0, 0, 180>
      scale <3, 100, 3>
}