Raytracing mit POV-Ray: CSG

Aus Wikibooks


In Povray kann man mit Hilfe von "Constructiv Solid geometry", im weiteren "CSG", z.B Ecken o.ä. von Objekten abschneiden oder die Schnittmenge zweier(oder mehrerer) Objekte zu bilden.

Die Differenz von Objekten[Bearbeiten]

Die Differenz von Objekten beschreibt man mit "difference". Um einen ausgehöhlten blauen Quader also eine Kiste darzustellen benötigt man folgenden code:

difference{
  box{<0,0,0>,<3,3,3>}
  box{<1,1,1>,<2,4,2>}
  pigment{color Blue}
 }

Hierbei ist es sinnvoll, den zweiten Quader bzw. allgemein den Subtrahend etwas überstehen zu lassen, da die Übergänge sonst sehr unschön werden.


Die Schnittmenge von Objekten[Bearbeiten]

Es ist manchmal einfacher die Schnittmenge von zwei Objekten darzustellen, als denselben Effekt durch die Differenzbildung zu erreichen. Wenn man z.B. die Ecken eines Gegenstandes abrunden will wäre es sehr mühsam dies allein mit der Differenzbildung zu schaffen. Es ist viel einfacher dies durch die Schnittmenge eines Quaders und einer Kugel darzustellen. Hier ist der Code für einen Würfel dessen Ecken mit Hilfe von "intersection" abgerundet werden:

intersection{
  box{<0,0,0>,<4,4,4> pigment{color Green}}
  sphere{<2,2,2>,2.5 pigment{color Red}}
  }

Weiterhin gibt es die Möglichkeit mittels des Schlüsselwortes "inverse" die Schnittmenge umzukehren.

Die Vereinigung von Objekten[Bearbeiten]

Die Vereinigung von Objekten erhält man mit den Schlüsselwörtern "union" und "merge", z.B.

union {
   objekt1
   objekt2
}

Der Unterschied zwischen "union" und "merge" ist nur bei durchsichtigen Körpern wichtig. Bei "union" bleiben die Oberflächen der einzelnen Körper, die innerhalb der Vereinigung liegen, sichtbar, bei "merge" werden die innerhalb der Vereinigung liegenden Flächen entfernt.


Clipped_by[Bearbeiten]

Bounded_by[Bearbeiten]

Oft sind die Ergebnisse eine Boolschen Operation deutlich kleiner als die Ausgangsobjekte. Da zur Bestimmung des Ergebnisses Schnitte der Lichtstrahlen mit alles beteiligten Grundformen berechnet werden müssen ist es von Vorteil, Pov-Ray mitzuteilen, in welchem Raumbereich dieses Ergebnis zu finden ist. Dies geschieht mit der Eigenschaft bounded_by. Beispiel: Um eine Linse zu modellieren wird man zwei Kugeln mittels intersection schneiden. Die entstehende Linse ist in einem Zylinder von sehr kleinem Ausmaß im Vergleich zu den Kugeln selbst zu finden.

intersection{
    sphere{ <-20,0,0> 21}
    sphere{ < 20,0,0> 21}
    bounded_by{cylinder{<-1,0,0> <1,0,0> sqrt(21*21-1*1)}}
    texture{pigment{rgbf<1,1,1,0.9>}}
    interior{ ior 1.2}
}

Vorsicht: Ist das Objekt, das bei bound_by übergeben wird kleiner als das tatsächliche Ergebnis, treten Berechnungsfehler auf, da nur in diesem Bereich nach dem Ergebnis gesucht wird.