Beschreibungen und Beispiele zum Raytracer POV-Ray von Friedrich A. Lohmüller
    CSG - Constructive Solid Geometry -
English English English
Italiano Italiano
Français français

Home
- POV-Ray Tutorial
- Download-Seite

  - CSG Constructive
            Solid
            Geometry
    - union + merge
   > difference
    - intersection
       + invers
    - clipped_by
    - Koinzidenzprobleme
    - Texturen u. CSG
                                           
Boolesche Algebra mit Körpern - Teil III

Über "difference"

Differenz

difference{...}

Mittels der Differenz lassen sich aus vorhandenen Körpern Löcher, Ausbuchtungen, Abschrägungen, Einkerbungen und dergleichen herausfräsen. Die Schnittfläche erhält jeweils die Textur des abgezogenen Körpers. Soweit die Theorie.
Eine Quelle tiefsten Frustes - nicht nur für Anfänger - ist folgende hinterhältige Falle:
Reicht der abzuziehende Körper nicht eindeutig über den Körper von dem er abgezogen wird hinaus, sondern liegen die Grenzflächen genau aufeinander d.h. die Flächen sind koinzident. So kann der Raytracer nicht klar entscheiden, welche Fläche noch übrig bleiben soll. Als Folge bleibt je nach Blickwinkel eine mehr oder weniger perfekte Trennfläche stehen, d.h. die Differenz scheint nicht richtig zu funktionieren!
Dies ist kein Fehler des Programms, sondern eine prinzipielle Beschränkung durch die Rundungsfehler, welche bei Berechnungen mit Computern unvermeidlich auftreten, da ein Computer nur mit endlich vielen Nachkommastellen rechnen kann. So rechnen wir problemlos z.B. 1/3*3 = 1, ein Computer rechnet jedoch: 0,333333*3 = 0,999999 < 1.
Es ist daher unerlässlich solche Uneindeutigkeiten bei Flächen bereits bei der Beschreibung der abzuziehenden Körper klar zu vermeiden.
(Siehe auch: "Koinzidenzprobleme")

Das Schadbild:
difference{
box{<-0.5,0.0,-0.1>,< 0.5,1.0,0.1>
    texture{ pigment{ color rgb<1,0.65,0>}
             finish { phong 1.0 }}
   }
box{<-0.3,0.2,-0.1>,< 0.3,0.8,0.1>
    texture{ pigment{ color Magenta}
             finish { phong 1.0 }}
   }
rotate<0,-30,0> translate<0,0,0>}
Die Problemlösung:
#declare D = 0.0001;// Ein kleines Bißchen!
difference{
box{ <-0.5,0.0,-0.1>,< 0.5,1.0,0.1>
     texture{ pigment{ color rgb<1,0.65,0>}
              finish { phong 1.0 }}
   }
box{ <-0.3,0.2,-0.1-D>,< 0.3,0.8,0.1+D>
     texture{ pigment{ color Magenta }
              finish { phong 1.0 }}
   }
rotate<0,-30,0> translate<0,0,0>}

CSG | union + merge | difference | intersection + inverse | clipped_by | Koinzidenz | Texturen
top

© Friedrich A. Lohmüller, 2012
www.f-lohmueller.de