Titelbild

Hauptseite | Amiga Bedroom Programmer | Nächste Seite

Kray II: Oberflächen

Texturen

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:

  1. Laden der Bitmap (Bsp: bitmap bitm, "karo.bmp"; )
  2. Mapping (Bsp: mapping kugel_map, sphere,(-400,0,0),<0,0,0>; ). Mehr dazu im nächsten Kapitel
  3. Textur erzeugen (Bsp: texture kugel_tx, bitmap, kugel_map, bitm; )
  4. Surface erzeugen (Bsp: surface kugel_surf, shaded, kugel_tx; )

Anschließend kannst du das Surface wie gewohnt für Objekte verwenden.

Mapping

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.

Kugel-Mapping

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.

Zylinder-Mapping

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.

Ebenen-Mapping

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.

Beispiel

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:

Mapping-Beispiel

Oberflächeneigenschaften

Neben der Farbe gibt es noch weitere Eigenschaften, die das Aussehen der Objekte beeinflußen:

Spiegelung

surface NAME, metalic;

Glanz

surface NAME, reflect, AUSDRUCK; Je höher der Wert, desto kleiner der Glanzpunkt.

Glas

surface NAME, glass, AUSDRUCK. Der Wert legt den Lichtbrechungsfaktor fest

Transparenz

surface NAME, transparent, COLOR;

Mischungen

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).

Beispiel

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";

Oberflächen Beispiele
Nach oben