Dokumentation

Texturen und Bumpmaps

<- Kombinationen und Zusammenfassungen
-> Variablen und arithmetische Ausdrücke
Allgemeines zu Texturen
Texturen verschieben, drehen und skalieren
Basistextur: Würfel
Basistextur: Marmor
Basistextur: Holz
Basistextur: Wolken
Bitmaps projizieren
Turbulenz
Bumpmaps

 

Allgemeines

Texturen verhalten sich genau wie Zusammenfassungen (container). Der einzige Unterschied ist, dass sie je nach Position eines Punktes im Raum eine andere Farbe annehmen.
Eine Textur besteht aus einem Basisalgorithmus, der die grundsätzliche Zuordnung von Farben zu Raumkoordinaten vorgibt, und beliebig vielen Modifiziereren. Diese können die Raumkoordinaten vor der Zuordnung transformieren. Auf diese weise kann die Textur rotiert, skaliert und verschoben werden. Zusätzlich gibt es noch die Modifizierer Noise und Turbulence, die die Textur nach bestimmten Regeln zufällig durcheinanderwirbeln. Auf diese Weise entstehen natürlich aussehnde Holz- Marmor- und Wolkenstrukturen.
Eine Textur mit Modifizierern wird so definiert:

new texture{
  Basisalgorithmus(..);

  Modifizierer1(..);
  Modifizierer2(..);
  ..

  new Objekt1{
    ...
  }
  new Objekt2{
    ...
  }
  ...
}
Basisalgorithmus und Modifizierer werden dabei durch Funktionsaufrufe hinzugefügt. Dabei muss immer genau ein Basisalgorithmus angegeben werden. Die Modifizierer können in beliebiger Anzahl und Reihenfolge angegeben werden. Dabei bestimmt die Reihenfolge, in der die Modifizierer angegeben werden, auch die Reihenfolge, in der die Operationen ausgeführt werden.

[
nach oben]
 

Texturen verschieben, drehen und skalieren

Diese drei Operationen können durch den Aufruf von Modifizierern durchgeführt werden, nämlich:

  textscale( [scalex, scaley, scalez] );
  textrotate( [ax, ay, az] );
  texttranslate( [deltax, deltay, deltaz] );
textscale skaliert die Textur in den drei Raumrichtungen mit den angegebenen Skalierungsfaktoren scalex, scaley und scalez. textrotate rotiert, hier gelten die gleichen Regeln wie beim Rotieren von Objekten. Mit texttranslate wird die Textur um den angegebenen Betrag verschoben.
Wie gesagt, ist die Reihenfolge, in der die Operationen angegeben werden, von Bedeutung.

[
nach oben]

Quelltext

Basisalgorithmus: Würfel

Dieser Basisalgorithmus erzeugt ein einfaches Würfelmuster, wie links zu sehen ist:

new texture{
  cubes([r1, g1, b1], [r2, g2, b2]);
  ...
}
Als [r1, g1, b1] und [r2, g2, b2] sind die beiden Farben, die sich abwechseln sollen, einzusetzen. Die Würfel haben (ohne Skalierung) die Kantenlängen 1.

[
nach oben]

Quelltext

Basisalgorithmus: Marmor

Der Basisalgorithmus "marble" erzeugt zunächst dieses einfache Streifenmuster. Mit etwas Turbulenz (s.u.) entsteht dadurch tatsächlich eine Marmortextur.

new texture{
  marble([r1, g1, b1], [r2, g2, b2], pot);
  ...
}
Mit [r1, g1, b1] und [r2, g2, b2] werden wieder die beiden Farben angegeben. pot ist ein Parameter, der die Breite der Streifen beeinflusst. Bei pot=1 sind sie gleich breit, je höher pot, desto ungleicher werden die Streifen.

[
nach oben]

Quelltext

Basisalgorithmus: Holz

Der wood-Algorithmus erzeugt ein Ringmuster, dessen Symmetrieachse die y-Achse ist. Auch diese Textur wird mit etwas Turbulenz erst realistisch.

new texture{
  wood([r1, g1, b1], [r2, g2, b2]);
  ...
}
Auch hier müssen wieder die beiden Farben, die sich abwechseln sollen, angegeben werden.

[
nach oben]

Quelltext

Basisalgorithmus: Wolken

Der Wolken-Algorithmus ist ausschließlich dazu gedacht, auf Nebel (dust) angewendet zu werden. Hier wird nicht wie bei den anderen Texturen die Farbe verändert, sondern die Transparanz. Ansonsten funktioniert sie fast genau wie die Marmor-Textur.

new texture{
  cloud(pot);
  ...
}
Der Parameter pot regelt wie beim Marmor wieder die Streifendicke.

[
nach oben]

Quelltext


Quelltext


Quelltext

Bitmaps projizieren

Eine weitere Möglichkeit für Texturen bietet das Projizieren von Bitmaps. Dazu kann eine Textur aus einer Windows-TrueColor-BMP-Datei eingelesen werden und auf drei Arten auf das Objekt projiziert werden:
xy-Projektion:
Hier wird die Textur einfach frontal auf das Objekt projiziert, das heißt, die x- und y- Koordindaten in der Textur ergeben sich aus den x- und y- Koordinaten im dreidimensionalen Raum.
Die Textur wird dabei so skaliert, dass sie gerade auf einen Einheitswürfel passt. Bei größeren Objekten wird sie periodisch wiederholt (wenn man sie nicht explizit anders skaliert).

new texture{
  mapxy("dateiname.bmp");
  ...
}
Zylinderprojektion:
Hier wird die Textur um einen Zylinder entlang der y-Achse gewickelt. In y-Richtung wird die Textur wie oben auf die Höhe 1 skaliert und dann periodisch wiederholt.
new texture{
  mapcylindrical("dateiname.bmp");
  ...
}
Kugelprojektion:
Hier wird die Textur auf eine Kugel projiziert. x- und y-Koordinaten in der Textur werden dabei aus Längen- und Breitengrad auf der Einheitskugel errechnet.
new texture{
  mapspherical("dateiname.bmp");
  ...

[
nach oben]

Quelltext


Quelltext


Quelltext

Turbulenz

Die Turbulenz ist wie das Rotieren, Skalieren und Verschieben ein Modifizierer. Hierbei wird die Textur nach einem bestimmten Muster durcheinandergewirbelt. Dabei gibt man zwei Parameter an: Eine Gitterauflösung und die Stärke der Verzerrung:

  textturbulence( n, s);
n gibt eine Anzahl von Gitterpunkten pro Längeneinheit an. Mit dieser Anzahl wird dann ein intern dreidimensionales Gitter erzeugt, in welchem Verschiebungswerte berechnet werden. Je höher n, desto feiner die Verschiebung. Je größer s, desto größer wird sie. Hier ist immer ein bisschen Experimentieren gefragt. Auch kann es sinnvoll sein, die Textur vor und nach der Turbulenz zu skalieren. Als Anfangspunkte kann man ja die hier gezeigten Beispiele nehmen.

[
nach oben]
 

Bumpmaps

Bumpmaps werden zwar vom Raytracer unterstützt, können aber in der Script-Sprache z.Zt. leider noch nicht angesprochen werden.

[
nach oben]

Martin Melcher