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>} |
|
|
|
|