Im ersten Teil des Workshops haben wir gesehen, wie wir Objekte färben können. Es gibt aber auch die Möglichkeit, Bilder auf die Objekte zu legen. Dazu sind folgende Schritte erforderlich:
bitmap bitm, "karo.bmp";
)mapping kugel_map,
sphere,(-400,0,0),<0,0,0>; ). Mehr dazu im nächsten
Kapiteltexture kugel_tx, bitmap,
kugel_map, bitm; )surface kugel_surf, shaded,
kugel_tx; )Anschließend kannst du das Surface wie gewohnt für Objekte verwenden.
Die Bitmap kann nicht direkt auf das Objekt gelegt werden, sondern sie muss auf ein Referenzobjekt 'gemappt' werden. Zur Auswahl stehen Kugel, Zylinder und Ebene. Kray projiziert die Textur auf das Zielobjekt. Du kannst dir das so vorstellen, als ob von jedem Pixel der Bitmap ein Farbstrahl ausgeht, der das Objekt schneidet. Ideal ist es natürlich, wenn das geometrische Objekt die gleiche Form hat wie das Referenzobjekt. Andernfalls musst du halt ein Referenzobjekt nehmen, das der Form des Zielobjekts am Ähnlichsten ist. Es kommt dann allerdings zu Verzerrungen des Bildes.
Die Mapping-Kugel hat als Parameter den Mittelpunkt und die Achsorientierung der Kugel. Es gibt keine Möglichkeit, eine Wiederholung festzulegen. Wenn du also einen Boing-Ball erzeugen willst, musst du alle roten und weißen Felder bereits in der Bitmap anlegen.
Der Mapping-Zylinder hat neben Lage und Achsorientierung noch einen Längenparameter. Damit kannst Du eine Wiederholung in Längsrichtung festlegen. Im nachfolgenden Beispiel habe ich den Mapping-Zylinder halb so hoch wie das Zylinderobjekt gemacht. Deshalb erscheint die Textur in Längsrichtung zwei mal.
Mit den ersten beiden Vektoren legst du fest, wie die x- und y-Achse der Bitmap im Raum ausgerichtet wird. Mit dem 3. Vektor bestimmst du, wo der Nullpunt der Bitmap platziert wird. Die Größe der Bitmap hängt dabei von der Länge der ersten beiden Vektoren ab. Jetzt kommt das Überaschende: du musst den Kehrwert der Länge einsetzen. Wenn die Bitmap sich auf einem 300 Einheiten langen Element 5 mal wiederholen soll, muss der Vektor die Länge 5/300) haben.
Es folgt ein Beispiel, in dem alle 3 Mapping-Arten zum Einsatz kommen. Das Bild 'karo.bmp' besteht aus 4 farbigen Rechtecken. Ich habe es zuvor mit einem Malprogramm erzeugt.
blend total_blend, total; blend none_blend, none; background color,(0,0,.5); light parallel,(-10,10,10), (1,1,1); camera picture, 400, 300, 300, (500,-500,-500), <-35,-40,0>; bitmap bitm, "karo.bmp"; mapping kugel_map, sphere,(-400,0,0),<0,0,0>; texture kugel_tx, bitmap, kugel_map, bitm; surface kugel_surf, shaded, kugel_tx; mapping zylinder_map, tube,(0,0,0),<0,0,0>,100; texture zylinder_tx, bitmap, zylinder_map, bitm; surface zylinder_surf, shaded, zylinder_tx; mapping rechteck_map, rect,(2/200,0,0),(0,-2/100,0),(0,0,0); texture rechteck_tx, bitmap, rechteck_map, bitm; surface rechteck_surf, shaded, rechteck_tx; shape kugel, sphere, (-400,0,0),100; object kugel, kugel_surf, total_blend; shape zylinder, tube, (0,0,0), <0,0,0>, 100, 300; object zylinder, zylinder_surf, total_blend; shape quader, box,(400,0,0),<0,0,0>,200,100,100; object quader, rechteck_surf, total_blend; antialias uniform,0,0; outputto "text.bmp";
Das Ergebnis sieht dann so aus:
Neben der Farbe gibt es noch weitere Eigenschaften, die das Aussehen der Objekte beeinflußen:
surface NAME, metalic;
surface NAME, reflect, AUSDRUCK; Je höher der Wert,
desto kleiner der Glanzpunkt.
surface NAME, glass, AUSDRUCK. Der Wert legt den
Lichtbrechungsfaktor fest
surface NAME, transparent, COLOR;
Zum Kombinieren verschiedener Eigenschaften gibt es die
surface NAME hybrid-Befehle. Je nach dem, ob du 2, 3
oder 4 Eigenschaften mischen willst, musst du hybrid2,
hybrid3 oder hybrid4 verwenden. Den
Eigenschaften folgt jeweils ein Wert zwischen 0 und 1, der angibt,
wie stark die Eigenschaft auf die Gesamtoberfläche durchschlägt. Da
einige Kombinationen recht häufig sind, gibt es dafür eigene
Befehle. Z.B. surface NAME shademetrefl (Farbe +
Spiegelung + Glanz).
variable radius, 140; blend total_blend, total; //blend none_blend, none; background color,(.5,0,.5); light parallel,(-10,10,20), (1,1,1); camera picture, 320, 256, 256, (0,0,0), <0,0,0>; bitmap wand_bm, "checker.bmp"; mapping wand_map, rect,(1/200,0,0),(0,1/200,0),(0,0,0); texture wand_tx, bitmap, wand_map, wand_bm; surface wand_surf, shaded, wand_tx; shape wand, wall, (0,0,1200), (0,0,-1); object wand, wand_surf, total_blend; texture farb_tex, color, (1,0.5,0.5); surface farb_surf, shaded, farb_tex; surface spiegel_surf, metalic; surface glanz_surf, reflect, 10; surface glas_surf, glass,1.05; surface trans_surf, transparent,(400,300,200); surface farb_spiegel_glanz_surf1, hybrid3, farb_surf,1, spiegel_surf,0.2,glanz_surf,1; surface farb_spiegel_glanz_surf2, shademetrefl, farb_tex,1, 0.2, 10, 1; surface farb_glas_surf, hybrid2, farb_surf,1,glas_surf, .2; // links oben, gefaerbt shape kugel1, sphere, (-400,-300,1000),radius; object kugel1, farb_surf, total_blend; // mitte oben, spiegelnd shape kugel2, sphere, (0,-300,1000),radius; object kugel2, spiegel_surf, total_blend; // rechts oben, glaenzend shape kugel3, sphere, (400,-300,1000),radius; object kugel3, glanz_surf, total_blend; // links mitte, transparent shape kugel4, sphere, (-400,0,1000),radius; object kugel4, trans_surf, total_blend; // mitte mitte, glas shape kugel5, sphere, (0,0,1000),radius; object kugel5, glas_surf, total_blend; // rechts mitte, hybrid shape kugel6, sphere, (400,0,1000),radius; object kugel6, farb_spiegel_glanz_surf1, total_blend; // links unten, farbe + spiegel + glanz shape kugel7, sphere, (-400,300,1000),radius; object kugel7, farb_spiegel_glanz_surf2, total_blend; // mitte unten, farbe + glas shape kugel8, sphere, (0,300,1000),radius; object kugel8, farb_glas_surf, total_blend; antialias uniform,0,0; outputto "oberfl.bmp";
