š“Syntax20b.Scn.FntPSyntax16b.Scn.Fntr'-Syntax10.Scn.FntW[„&š’’’ £Zą„ParcElemsAlloc Ęź  ż ī’’’ £Zą„ą•Ą°Ņ  ż? š’’’ £Zą„ Ęź  ż !ī’’’ £Zą„ĄüąÉŌ  ż:š’’’ £Zą„ Ęź  ż.ī’’’ £Zą„ĄüąÉŌ  żÖ š’’’ £Zą„ Ęź  ż ī’’’ £Zą„ ć€ćÖ  żš’’’ £Zą„ Ęź  żī’’’ £Zą„ĄüąÉŌ  ż{ lš’’’ £Zą„ Ęź  ż ź’’’ £Zą„ĄįąäĖ  ż€¼éSyntax12.Scn.Fnt Syntax12i.Scn.Fnt  ē’’’ £Zą„ Ęź  żĄ— €ÆĄ«0(Syntax14b.Scn.Fnt Syntax12b.Scn.Fnt2 ź’’’ £Zą„ Ęź  ż Ą— Ąį.)-5/&4 BY ` R < B C _š’’’ £Zą„ Ęź  ż  žHArial14i.Scn.Fntķ Jh  >  b  ę’’’ £Zą„ Ęź  ż  ćĄĘ'Ąø’ #) . p%ź’’’ £Zą„ Ęź  ż €Ź€”#2;U  90%.= 3689"ē’’’ £Zą„ Ęź  ż  ćąś €Ž4)p[ Courier10.Scn.Fnt  Arial14b.Scn.FntŠ?  h‘T   ē’’’ £Zą„ Ęź  ż  ćąś Ą«0` ˜C o•H C" ab3cę’’’ £Zą„ Ęź  ż ą°€Ć= ‹Ś.xź’’’ £Zą„ Ęź  żą°ąś A4h(2",14l>ź’’’ £Zą„ Ęź  ż ą°€”#š“f8=#rntÖź’’’ £Zą„ Ęź  ż ą°€”#A Arial12.Scn.Fnt Syntax10i.Scn.Fnt U + 2   # 6 _Jź’’’ £Zą„ Ęź  ż ą°ąś ƒe©ā’’’ £Zą„ Ęź  żĄ—  Č€Ļ —Š Syntax14.Scn.FntSyntax14i.Scn.Fntw( ®  š’’’ £Zą„ Ęź  ż *iž>‡š’’’ £Zą„ Ęź  ż x% [ š’’’ £Zą„ Ęź  ż -ńę’’’ £Zą„ Ęź  żą° ČąŹ­ā’’’ £Zą„ Ęź  żą°ąś €ņ׹сƒć’’’ £Zą„ Ęź  ż€Ź€”# Ü?ĄÓöĮā’’’š¹õą„ Ęź  ż €Ź€”#€Ļą¢ēę’’’š¹õą„ Ęź  ż ćĄĘ'ąŃæź’’’š¹õą„ Ęź  ż ć Ü? š’’’š¹õą„ Ęź  ż ī’’’š¹õą„ ćŠŚŽ  żTć’’’š¹õą„ Ęź  ż ž €ÆąÄ2ąŲÕ ;Arial14.Scn.Fntrš’’’š¹õą„ Ęź  ż ź’’’š¹õą„ Ęź  ż ž  Č• @‹š’’’š¹õą„ Ęź  ż xē’’’ £Zą„ Ęź  ż  ć ­%€Ž4qš’’’š¹õą„ Ęź  ż ī’’’ £Zą„ ž €Čß  żDzš’’’ £Zą„ Ęź  ż Aš’’’ £Zą„ Ęź  ż ,å’’’ £Zą„ Ęź  żą•ĄÓöĄ–“š’’’ £Zą„ Ęź  ż!Yš’’’ £Zą„ Ęź  ż $/ß(…Raytracing Tool f…r OberonV4.0 Inhaltsverzeichnis: 1 Raytracing allgemein 1.1 Der Raytracing Algorithmus 1.2 Rekursive Implementierung des Raytracing 1.3 Licht und Schatten 1.4 Texturen 1.5 Farben 2 Dateikurzbeschreibung 3 Compilieren der Module des Raytracers 4 Datenstrukturen und Prozedurschnittstellen 4.1 Datenstrukturen des Module RayTrace 4.2 Prozedurschnittstelle des Module RayTrace 4.3 Datenstrukturen des Module World 4.4 Prozedurschnittstelle des Module World 5 Erweiterung des Raytracers um ein Objekt 6 Beispiele f…r die Benutzung des Raytracers 6.1 Beispiel 1 6.2 Beispiel 2 6.3 Beispiel 3 6.4 Beispiel 4 6.5 Beispiele von Oberflƒchendefinitionen 6.6 ffnen gespeicherter Bilder 7 Fehler bei der Szenendefinition  1 Raytracing allgemein:  Realistisch aussehende Computergraphiken werden immer hƒufiger in Spielfilmen und Werbung eingesetzt. Sie entstehen durch Anwendung eines Verfahrens, das man Raytracing nennt. Im folgenden werden die Grundlagen dieser Methode beschrieben. Mit Raytracing wird ein Verfahren bezeichnet, das gestattet, extrem realistische Bilder von einer nur mathematisch vorhanden Welt darzustellen. Bei Anwendung dieser Technik ist man in der Lage, mit spiegelnden und transparenten Materialien zu arbeiten und auf diese Weise sehr eindrucksvolle Szenarien zu produzieren. Da Raytracing derzeit die beste Simulation eines fikiven Universums ist, sind nahezu alle professionellen Computergraphiken f…r Film und Fernsehen mit der Raytracing-Methode hergestellt worden. So verwenden zum Beispiel auch Filme wie Star Wars oder Star Trek Raytracing-Bilder. Raytracing kann am besten mit Lichtstrahlverfolgung …bersetzt werden. Die grundlegende Idee dabei ist, daß rechnerisch der Weg eines Lichtstrahls - einer mathematischen Lichtquelle - durch einen mathematischen Raum verfolgt wird. Sobald dieser Lichtstrahl auf ein Objekt im Raum trifft, wird er entweder absorbiert oder reflektiert, oder er geht durch das Objekt hindurch. Auch eine Kombination aus diesen drei Alternativen kann vorkommen. Im selben mathematischen Raum befindet sich der Beobachter, der die Objekte - beleuchtet mit Lichtquellen - durch ein Beobachtungsfenster betrachtet. Beim Raytracing stellt Ihr Monitorbild das Fenster dar. Dabei wird jeder Punkt, den der Betrachter sieht, als Zusammenspiel von Objekten und Lichtquellen aufgefaßt. Ein Punkt auf der Oberflƒche eines Objektes wird durch verschiedene Lichtquellen beleuchtet: Da ist zunƒchst ein allgemein in der Umgebung vorhandenes diffuses Licht (Umgebungslicht). Dann existieren reflektierte Lichtstrahlen von anderen Oberflƒchen. Weiterhin gibt es Lichtstrahlen, die durch das Objekt hindurchgehen, und schließlich solche, die direkt von einer Lichtquelle auf den Oberflƒchenpunkt fallen. Die gesamte Berechnung aller Lichtwege und Lichtintensitƒten erfordert einen nicht unerheblichen Rechen und auch Zeitaufwand. ‚blicherweise wartet man auf ein Raytracing-Bild mehere Minuten, Stunden oder sogar Tage. Das hƒngt von der Anzahl der Objekte, deren Material, der Anzahl und der Art der Lichtquellen und der Komplexitƒt des ganzen Szenariums ab.  1.1 Der Raytracing Algorithmus:  Da der Bildschirm das Fenster zur darzustellenden mathematischen Welt ist, werden Farbe und Intensitƒt eines jeden Pixels (Bildpunktes) dadurch berechnet, daß der Lichtstrahl, der vom Auge des Betrachters durch das Zentrum dieses Bildpunktes geht in den mathematischen Raum auf der anderen Seite zur…ckverfolgt. Falls der Lichtstrahl auf ein Objekt trift, werden lokale Farbe und Intensitƒt des Oberflƒchenpunktes errechnet. Sie hƒngen von der Reflexion der direkten und indirekten Beleuchtung des Szenariums ab, sowie von Farbe und Beschaffenheit der Objektoberflƒche. Falls das Material an besagtem Punkt transparente oder spiegelnde Eigenschaften besitzt, sind auch die Lichtstrahlen, die durch diese Eigenschaften in Intensitƒt und Farbe des Bildpunktes eingehen, bestimmt. Solche Lichtstrahlen k„nnen wiederum auf Objekte mit spiegelnder oder transparenten Eigenschaften stoßen, die dann auch wieder zur…ckverfolgt werden m…ssen. Auf dieses Phƒnomen wird spƒter genauer eingegangen. Trifft einer der Lichtstrahlen kein Objekt, so wird die Hintergrundfarbe des Szenariums als seine Intensitƒt und Farbe angenommen. Die soeben skizzierten ‚berlegungen treffen f…r jeden Bildpunkt unseres Bildschirms zu und gehen in alle entsprechenden Berechnungen ein. Ein Vorteil des Raytracing ist, daß man keinen Hiddenline-Algorithmus (verdeckte Linien-Algorithmus) ben„tigt, wie er bei anderen dreidimensionalen Verfahren erforderlich ist. Das bedeutet, Punkte und Kanten von Objekten, die man nicht auf dem Bildschirm sieht, weil andere Objekte sie verdecken werden erst gar nicht berechnet.  1.2 Rekursive Implementierung des Raytracing:  Wie weiter oben schon erwƒhnt, wird ein Lichtstrahl vom Auge des Betrachters in den mathematischen Raum verfolgt, bis er entweder auf ein Objekt trifft oder in den Hintergrund geht. Falls er ein transparentes oder spiegelndes Objekt trifft, sind weiter Lichtstrahlen von diesem Schnittpunkt aus mit anderer Richtung zu verfolgen. F…r dieses nicht ganz einfache Problem bietet sich eine rekursive Implementierung an der Strahlenr…ckverfolgung an. Diese rekursive Funktion wird im weiteren mit Raytrace() bezeichnet. Als Funktions- parameter werden ihr Startpunkt und Richtung der Halbgeraden …bergeben, die den Lichtstrahl definiert. Mit dem Aufruf der Funktion wird der Lichtstrahl so lange verfolgt, bis er entweder auf den Hintergrund oder auf ein Objekt st„ßt. Trifft er auf den Hintergrund, ist die Strahlenverfolgung beendet. Trifft er auf ein Objekt, so werden die beiden durch Transparenz und Reflexion des Objekts entstehenden Lichtstrahlen rekursiv weiter zur…ckverfolgt, und zwar durch erneuten Aufruf von Raytrace(). Bei diesem Aufruf wird der Schnittpunkt der Geraden mit dem Objekt zum neuen Startpunkt. Die Richtung ist abhƒngig vom Einfallswinkel des urspr…nglichen Lichtstrahls auf die Oberflƒche des Objekts. Mit diesem rekursiven Verfahren lassen sich praktisch alle Reflexions- und Transparenzeffekte berechnen. Es ist jedoch wichtig, die Schachtelungstiefe der Rekursion zu kontrollieren. Stellt man sich vor, in einem Raum sind zwei perfekte Spiegel einader genau gegen…ber aufgestellt. Man sitzt als (lichtundurchlƒssiger) Betrachter zwischen diesen Spiegeln, mit Blickrichtung in einen der beiden. Man sieht in diesem Fall …berhaupt nichts im Spiegel, da jeder Lichtstrahl immer perfekt reflektiert wird und so nie auf ein Objekt st„ßt. Wenden man nun einen unkontrollierten rekursiven Algorithmus auf dieses Problem an, so endet dieser nie, da sich immer der eine Spiegel im anderen spiegelt und umgekehrt. Bei einer Implementation f…hrt dies unweigerlich zu einem ‚berlauf des Stacks, auf dem die Zwischenergebnisse der Rekursionen abgelegt werden. Um dieses Phƒnomen in den Griff zu bekommen, wird der Funktion Raytrace() ein weiterer Parameter mitgegeben, der die Schalchtelungstiefe darstellt. Vor jedem rekursiven Aufruf wird er zunƒchst um eine erh„ht. Beim Durchlaufen der Funktion wird er dann mit der globalen erlaubten Schalchtelungstiefe verglichen. Ist sie erreicht , finden keine weiteren rekursiven Aufrufe mehr statt, statt dessen wird die Farbe schwarz zur…ckgeliefert.  1.3 Licht und Schatten:  Da bei v„lliger Dunkelheit nichts außer schwarzen Objekten auf schwarzem Hintergrund zu berechnen ist, existieren in unserem mathematischen Raum nat…rlich auch Lichtquellen, von denen die eigendlichen Lichtstrahlen, die berechnet werden, ausgehen. Wenn diese Lichtquellen nun ein Objekt beleuchten, so sollte dieses Objekt auch einen Schatten werfen. Die Nat…rlichkeit der Darstellung erh„ht sich deutlich, da die Rƒumlichkeit durch den Schatten verstƒrkt wird. Ob eine Kugel auf der Ebene liegt oder …ber ihr schwebt, kann man einzig und allein am Schatten auf der Ebene erkennen. Nachdem also ein Lichtstrahl bis zu einem Objekt verfolgt wurde, ist fest- zustellen, von welchen Lichtquellen dieses wie stark beleuchtet wird. Bei diesem Berechnungsvorgang gehen die Distanz der Lichtquelle zum Objekt, ihre Stƒrke un ihre Farbe in die Helligkeit des Punktes ein. Um nun Schatten zu berechnen, wird wieder eine Halbgerade vom Schnittpunkt zu jeder Lichtquelle in den Raum geschickt. Trifft sie auf dem Weg zu einer Lichtquelle auf ein anderes Objekt, so kann diese Lichtquelle den Punkt nicht mehr beleuchten, da ein zweites Objekt einen Schatten wirft.  1.4 Texturen:  Eine andere, sehr wichtige Eingenschaft von Objekten ist, daß sie meist nicht einfƒrbig sind, sondern auf ihrer Oberflƒche, die je nach Material verschiedene Musterungen ,sogenannte Texturen, aufweisen. Holz oder Stein haben beispielsweise eine jeweils einzigartige Maserung. Die Texturen, die meist in zweidimensionaler Form vorliegen, m…ssen nun auf die Oberflƒche der Objekte aufgetragen werden. Da allerdings die Objekte in Form und Gr„ße meist nicht der Textur entsprechen, ist das Muster sozusagen mathematisch um das jeweilige Objekt zu wickeln, beispielsweise um eine Kugel. Dieses Verfahren, engl. texture mapping genannt, ist von Objektform zu Objektform unterschiedlich. Der hier vorgestellte Raytracer trƒgt Bilder, die in Form von Bitmap-Dateien (Windows Bitmap Format) vorliegen, auf die Objekte auf. Der Algorithmus, der eine Textur auf eine Flƒche auftrƒgt, sieht wie folgt aus: Zunƒchst wird der Winkel ermittelt, der durch den Vektor vom Schnittpunkt zum ersten Punkt des Polygons sowie dessen erster Seite definiert ist. Dieser Winkel wiederum definiert einen x- und y- Wert, der auf die Textur relativ abgebildet wird und so eine Farbe eines Oberflƒchenpunktes ergibt. Bei der Kugel findet ein ƒhnliches Verfahren Anwendung, bei dem der Winkel des Schnittpunktes und der z-Achse in x- und y- Richtung ausgemessen und dadurch ein bestimmter Punkt der Textur ausgewƒhlt wird. 1.5 Farben: Wichtig f…r eine realistische Darstellung von verschiedenen Objekten mit Mustern und Schattierungen ist die Palette der darstellbaren Farben. Eine Farbe in dem hier vorgestellten Raytracing-System setzen sich aus den drei Farbenteilen Rot, Gr…n und Blau zusammen, die jeweils Werte zwischen Null und Eins annehmen k„nnen. Diese Art der Farbangabe nennt man daher RGB-Modell. Es ist f…r Standardmonitore gedacht, deren Signale sich aus den Farben Rot, Gr…n und Blau zurammensetzen. Dabei ist (0,0,0) Schwarz und (1,1,1) Weiß. Dazwischen gibt es eine nahezu unbegrenzte Anzahl von Zwischenfarben, die jedoch nicht alle von einem Monitor dargestellt werden k„nnen. Den RGB-Farbraum kann man sich als W…rfel vorstellen, bei dem eine Kante die Intensitƒt der roten Farbe, eine andere die intensitƒt der gr…nen und eine dritte Kante die der blauen Farbe representiert. Das hier verwendete RGB-Farbmodell schließt alle menschlich sichtbaren Farben ein. Eine einfƒrbige rote Flƒche (1.0 , 0.0 , 0.0 ), die von einer mittelstarken Lichtquelle beleuchtet wird, hat an der Stelle, an der die Lichtquelle der Flƒche am nƒchsten ist, ein sehr helles Rot, fast schon Weiß. Je weiter der Punkt dieser Flƒche aber entfernt ist, desto dunkler wird das Rot, bis schließlich in weiter Entfernung fast kein Licht mehr ankommt und die Flƒche nur noch schwarz gesehen wird, obwohl sie eigendlich rot ist.  2 Dateikurzbeschreibung:  RayTrace.Mod Berechnet das Raytrace-Blid World.Mod Definition der Szenerie Raytrace.Text Dieser Text WorldErrors.Text Liste der Fehler  3 Compilieren der Module des Raytracers: Folds.Compile RayTrace.Mod \s World.Mod \s ~  4 Datenstrukturen und Prozedurschnittstellen: 4.1 Datenstrukturen des Module RayTrace: Color*=RECORD r*,g*,b*:REAL; END; Darstellung einer Farbe entsprechend des RGB-Modells Vector*=RECORD x*,y*,z*:Type; END; Darstellung eines Punktes um 3D-Raum Texture=RECORD pict*:Pictures.Picture; Windows Color Bitmap skale*:REAL; Skalierungsfaktor der Bitmap END; Surface*=POINTER TO SurfaceDesc; SurfaceDesc*=RECORD material*, Wie stark absorbiert das Material einen ankommenden Lichtstrahl. Bereich {0..1} mirror*, Wie stark spiegelt sich im Material die Umgebung. Breich {0..1} (1 perfekter Spiegel) trans*, Wie stark ist das Material transperent. Bereich {0..1} (1 perfektes Glas) difConst*, Wieviel Licht wird diffus reflektiert Bereich {0..1} specConst*, Wieviel Licht wird spiegelnd reflektiert. Bereich {0..1} highConst*, Konzentration der spiegelden Reflektion Bereich {0..100} velocity* Definiert die Winkelberechnung bei transparenten Materialien. Bereich {1..unendlich} :REAL;  colorType* colorType=COLOR => auf dem Objekt ist eine Farbe aufgetragen colorType=TEXTURE => auf dem Objekt ist eine Textur aufgetragen :INTEGER; color*:Color; Farbe des Objekts texture*:Texture; Textur des Objekts END; Object*=POINTER TO ObjectDesc; ObjectDesc*=RECORD surface*:Surface; Oberflƒche des Objects PROCEDURE (object:Object) Intersection (point,dir:Vector; VAR hitPoint,normal:Vector):BOOLEAN; Berechnet den Schnittpunkt der durch "point" und "dir" gegebenedn Halbgereden mit dem Objekt "object". "hitPoint" ist der Eintrittspunkt in das Objekt "normal" ist die Normale auf das Objekt im Eintrittspunkt PROCEDURE (object:Object) TexturePoint (hitPoint:Vector; VAR x,y:Type); Berechnet einen Oberflƒchenpunkt auf dem Objekt "object" mit dem Eintrittspunkt "hitPoint" next*:Object; das nƒchste Objekt END; Lamp*=POINTER TO LampDesc; LampDesc*=RECORD vector*:Vector; Position der Lampe im 3D-Raum color*:Color; Farbe der Lampe intens*:Type; "intens" gibt an nach welcher Entfernung die Intensitƒt der Lampe um die Hƒlfte abnimmt next*:Lamp; die nƒchste Lampe END;  World*=POINTER TO WorldDesc; WorldDesc*=RECORD lamp*:Lamp; Zeiger auf die erste Lampe object*:Object; Zeiger auf das erste Objekt observer*:Vector; Position des Betrachters im 3D-Raum lookAt*:Vector; Blickrichtung des Betrachters viewUp*:Vector; gibt die Richtung oben in der Szenerie an eye*:REAL; ffungswinkel vom Auge des Betrachters in Grad background*, intergrundfarbe der Szenerie ambient*:Color; Ambientes Licht in der Szenerie pWidth*, Breite des Fenters pHeight*:INTEGER; H„he des Fenters showFastPixel: INTEGER; Die Gr„ße der Quadrate in Pixel f…r die im ersten Bildaufbau nur eine Berechnung duchgef…hrt wird calcInTask: BOOLEAN; TRUE => Die Berechnung erfolgt in einem Task END;  4.2 Procedurschnittstelle des Module RayTrace: PROCEDURE CalcWorld (world: World; pict:Pictures.Picture); Berechnet das Raytracing-Bild. Die Berechnung kann durch das Dr…cken einer Taste abgebrochen werden. PROCEDURE VectAdd (a, b: Vector; VAR res: Vector); Vektoraddition res:=a+b PROCEDURE VectDist (a, b: Vector): REAL; Distanz zwichen zwei Punkten im Raum PROCEDURE VectDot (a, b: Vector): REAL; Skalarprodukt von a und b PROCEDURE VectMul (a: Vector; t: REAL; VAR res: Vector); Vektormultiplikation res:=a*t PROCEDURE VectNorm (v: Vector; VAR n: Vector); Berechnet normalisierten Vektor n in Richtung von v PROCEDURE VectProd (a, b: Vector; VAR res: Vector); Kreuzproduckt res:=a x b PROCEDURE VectSub (a, b: Vector; VAR res: Vector); Vektorsubtraktion res:=a-b  4.3 Datenstruckturen des Module World: Inval*= 0; Name *= 1; String* = 2; Int *= 3; Real *= 4; LongReal *= 5; Char *= 6; Color*=7; Vector*=8; Klassen des Scanners SphereObj*=POINTER TO SphereDesc; SphereDesc*=RECORD(RayTrace.ObjectDesc); radius*:REAL; Radius der Kugel vector*:RayTrace.Vector; Mittelpunkt der Kugel PROCEDURE (sphere: SphereObj) Intersection (point, dir: RayTrace.Vector; VAR hitPoint, normal: RayTrace.Vector): BOOLEAN; Berechnet den Schnittpunkt der durch den Punkt "point" und der Richtung "dir" gegebenen Halbgeraden mit der Kugel. Gibt es einen Schnittpunkt, dann wird der Eintrittspunkt "hitPoint" und die Normale auf die Kugeloberflƒche "normal" im Eintrittspunkt berechnet und "TRUE" zur…ckgegeben, ansonsten "FALSE" PROCEDURE (sphere: SphereObj) TexturePoint (hitPoint: RayTrace.Vector; VAR x, y: REAL); Berechnet mit den Eingabeparametern der Kugel und den Eintrittspunkt "hitPoint" eine rellative Oberflƒchen- position "x,y" auf der Kugel.. END; Edge*=POINTER TO EdgeDesc; EdgeDesc*=RECORD vector*:RayTrace.Vector; Kantenpunkt next*:Edge; nƒchste Kante END;  PolygonObj*=POINTER TO PolygonDesc; PolygonDesc*=RECORD(RayTrace.ObjectDesc); edge*:Edge; erste Kante des Polygons PROCEDURE (polygon: PolygonObj) Intersection ( point, dir: RayTrace.Vector; VAR hitPoint, normal: RayTrace.Vector): BOOLEAN; Berechnet den Schnittpunkt der durch den Punkt "point" und der Richtung "dir" gegebenen Halbgeraden mit dem Polygon. Gibt es einen Schnittpunkt, dann wird der Eintrittspunkt "hitPoint" und die Normale auf die Polygonoberflƒche "normal" im Eintrittspunkt berechnet und "TRUE" zur…ckgegeben, ansonsten "FALSE" PROCEDURE (polygon: PolygonObj) TexturePoint ( hitPoint: RayTrace.Vector; VAR x, y: REAL); Berechnet mit den Eingabeparametern des Polygons und den Eintrittspunkt "hitPoint" eine rellative Oberflƒchen- position "x,y" auf dem Polygon. END; Scanner*=RECORD(Texts.Scanner) color*:RayTrace.Color; Scanner-Klasse Farbe vector*:RayTrace.Vector; Scanner-Klasse Vektor END; World=POINTER TO WorldDesc; WorldDesc=RECORD(RayTrace.WorldDesc) actualSurface:RayTrace.Surface; aktuelle Oberflƒche name:ARRAY 32 OF CHAR; Name der Szenerie PROCEDURE (world: World) TrueColorReplCont (red, green, blue, x, y, w ,h, mode: INTEGER); Msg zur Darstellung in True-Color. END; Frame = POINTER TO FrameDesc; FrameDesc = RECORD (Display.FrameDesc) width, breite des Bildes height:INTEGER; h„he des Bildes file:Files.File; Daten des Bildes werden in einer Datei ausgelagert text:Texts.Text; Definitionstext der Szenerie END; ErrorElem = POINTER TO ErrorElemDesc; ErrorElemDesc = RECORD(Texts.ElemDesc) END;  4.4 Procedurschnittstelle des Module World: Syntax: Color=(R,G,B). R=REAL. G=REAL. B=REAL. Vektor=. x=REAL. y=REAL. z=REAL.  PROCEDURE Open; ffnet eine gespeichertes Bild Syntax: World.Open NAME PROCEDURE Store; Speichert ein Bild Syntax: World.Store NAME PROCEDURE Source; Offnet den Definitionstext eines Bild Syntax: World.Source oder "Document-Open Interclick im Bild" PROCEDURE OpenScanner (VAR S: Scanner); Setzt den Scanner auf den Parametertext auf PROCEDURE Scan (VAR S: Scanner); Liest das nƒchste Symbol PROCEDURE AddObj (obj: RayTrace.Object); F…gt der aktuellen Szenerie ein Objekt hinzu PROCEDURE Error (VAR S: Scanner; errorNr: INTEGER); Wird bei auftreten eines Fehlers aufgerufen. ‚bergeben wird der aktuelle Scanner und die Errornummer. PROCEDURE Define; Startkommando zur Definition und Berechnung einer Szenerie  PROCEDURE View; Definiert die Große des Ausgabefensters Syntax: World.View Breite H„he. Breite=INTEGER. H„he=INTEGER. Voreinstellung ist World.View 100 100 PROCEDURE ViewUp; Definiert in der Szenerie die Richtung die im Bild oben entspricht Syntax: World.ViewUp Vektor Voreinstellung ist World.ViewUp <0.0 0.0 1.0> PROCEDURE Title; Gibt der Szenerie eine Namen Syntax: World.Title String Voreinstellung ist World.Title "noname" PROCEDURE Ambient; Stellt das Ambiente licht ein Syntax: World.Ambient Color Voreinstellung ist World.Ambient (0.0,0.0,0.0) PROCEDURE Background; Stellt die Hintergrundfarbe ein Syntax: World.Background Color. Voreinstellung ist World.Background (0.0,0.0,0.0) PROCEDURE Observer; Position des Betrschters Syntax: World.Observer Vektor. Voreinstellung ist World.Observer <0.0 0.0 0.0> PROCEDURE LookAt; Blickrichtung des Betrschters Syntax: World.LookAt Vektor. Voreinstellung ist World.LookAt <1.0 0.0 0.0> PROCEDURE Eye; ffungswinkel des Auges vom Betrschter in Grad Syntax: World.Eye REAL. Voreinstellung ist World.Eye 57.0 PROCEDURE Lamp; F…gt der aktuellen Szenerie eine Lampe hinzu Syntax: World.Lamp Vektor Color REAL. Vektor=Position der Lampe Color=Farbe der Lampe REAL=Entfernung in der die Intensitƒt der Lampe auf die Hƒlfte abnimmt.  PROCEDURE Surface; Definiert die Aktuelle Oberflƒche Syntax: World.Surface Material Struktur. Material= Undurchsichtigkeit Spiegelung Transparenz Matte Reflexion Spiegelde Reflexion Konz. der spieg. Reflexion Velozitƒt. Struktur=Color | Textur. Textur=Bitmap Skalierung. Bitmap=String. Name der Bitmap-Datei Skalierung=REAL. Die Bitmap wird mit diesem Faktor multipliziert und auf das Objekt aufgetragen Undurchsichtigkeit=REAL. 0.0...durchsichtig 1.0...undurchsichtig Spiegelung=REAL. 0.0...spiegelt nicht 1.0...perfekter Spiegel Transparenz=REAL. 0.0...keine 1.0...total Matte Reflexion=REAL. 0.0...keine 1.0...total Spiegelde Reflexion=REAL. 0.0...keine 1.0...total Konz. der spieg. Reflexion=REAL. 0.0...keine konzentration 100...max. konzentration Velozitƒt=REAL. Definiert die Winkelberechnung bei transparenten Materialien. Bereich {1..unendlich} Voreinstellung ist World.Surface 1.0 0.0 0.0 0.7 0.7 1.0 1.0 (1.0 1.0 1.0)  PROCEDURE Sphere; F…gt der aktuellen Szenerie eine Kugel hinzu Syntax: World.Sphere Mittelpunkt Radius. Mittelpunkt=Vektor. Radius=REAL. PROCEDURE Polygon; F…gt der aktuellen Szenerie ein Polygon hinzu Syntax: World.Polygon Punkt {Punkt} Punkt=Vektor. PROCEDURE Cylinder; F…gt der Szenerie einen Zylinder hinzu der durch die Angabe seiner Kanten definiert wird Syntax: World.Cylinder Kante {Kante}. Kante=Vektor Vektor.  PROCEDURE CalcMode; Stellt den Berechnungsmodus ein. Syntax: World.CalcMode "normal" | "fast" size | "task". size=INTEGER. Voreinstellung ist World.CalcMode normal Standard: Das Bild wird in einem durchlauf Pixel f…r Pixel berechnet. (normal) Schnell: Die Berechnung erfolgt in zwei Schritten. Im 1. Schritt wird nur f…r Bildschirmbereiche von "size"x"size" Pixel eine Strahlenverfolgung durchgef…hrt. Man erhƒlt schnell einen ‚berblick …ber die Anordnung der Objekte in der Szenerie. Im 2. Schritt werden die fehlenden Strahlenverfolgungen ergƒnzt. (fast) Task: Die Berechnung erfolgt in einem Task. Wƒhrend der Bildberechnung kann weitergearbeitet werden. (task) Syntax: World.CalcMode "normal" | "fast" size | "task". size=INTEGER. Voreinstellung ist World.CalcMode normal  5 Erweiterung des Raytracers um ein Objekt: MODULE MyObj; IMPORT RayTrace,World; MyObj*=POINTER TO MyDesc; MyDesc*=RECORD(RayTrace.ObjectDesc); private Daten des Objekts END; PROCEDURE (myobj:MyObj) Intersection( point,dir:RayTrace.Vector; VAR hitPoint,normal:RayTrace.Vector):BOOLEAN; BEGIN WITH myobj:MyObj DO Berechnet den Schnittpunkt der durch den Punkt "point" und der Richtung "dir" gegebenen Halbgeraden mit dem Objekt. Gibt es einen Schnittpunkt, dann wird der Eintrittspunkt "hitPoint" und die Normale auf die Objektoberflƒche "normal" im Eintrittspunkt berechnet und "TRUE" zur…ckgegeben, ansonsten "FALSE" END; END Intersection; PROCEDURE (myobj:MyObj) TexturePoint( hitPoint:RayTrace.Vector; VAR x,y:REAL); BEGIN WITH myobj:MyObj DO Berechnet mit den Eingabeparametern "myobj" und den Eintrittspunkt "hitPoint" eine rellative Oberflƒchen- position "x,y" auf dem Objekt. END; END TexturePoint;  PROCEDURE Add*; VAR S:Scanner; myobj:MyObj; BEGIN NEW(myobj); World.OpenScanner(S); World.Scan(S); IF(S.class=.......)THEN Einlesen der privaten Daten World.AddObj(myobj); ELSE Error(S,errornummer); END; END Add; END MyObj; Beispiel f…r das Einbinden in die Szenerie: World.Define World.Title "MyObj.Pict" World.LookAt <0.0 0.0 50.0> World.Observer <0.0 500.0 200.0> World.ViewUp <0.0 0.0 1.0> World.View 100 100 World.Background (0.0 0.0 0.0) World.Ambient (0.2 0.2 0.2) World.Lamp <0.0 0.0 200.0> (1.0 1.0 1.0) 8000.0 MyObj.Add Private Daten ~  6 Beispiele f…r die Benutzung des Raytracers: Der Aufbau eines Bildes kann durch das Dr…cken einer beliebigen Taste abgebrochen werden ! 6.1 Beispiel 1a Eine Kugel mit einer metallischen Oberlƒche steht auf einem quadratischen Polygon auf dem eine Bitmap aufgetragen ist.  World.Define (* starte dieses Kommando *) World.Title "Example1.Bmp" (* Titel des Bildes *) World.LookAt <0.0 0.0 50.0> (* Blickrichtung des Betrachters *) World.Observer <0.0 -500.0 170.0> (* Augenposition des Betrachters *) World.ViewUp <0.0 0.0 1.0> (* Die Richtung die im Bild oben entspricht *) World.Eye 57.0 (* ffnungswinkel vom Auge des Betrachters *) World.View 150 150 (* Weite und H„he des Bildes in Pixel *) World.Background (0.0 0.0 0.3) (* Hintergrundfarbe *) World.Ambient (0.2 0.2 0.2) (* Das Umgebungslicht *)  World.Lamp (* 1. Lampe *) <200.0 -400.0 200.0> (* Position der Lampe *) (1.0 1.0 1.0) (* Farbe der Lampe *) 800.0 (* Entfernung in der die Leuchtkraft auf die Hƒlfte abnimmt *) World.Lamp (* 2. Lampe *) <0.0 0.0 200.0> (* Position der Lampe *) (1.0 1.0 1.0) (* Farbe der Lampe *) 800.0 (* Entfernung in der die Leuchtkraft auf die Hƒlfte abnimmt *)  World.Surface "Metall" (* Oberflƒche Metall, gilt ab nun. Definiert in Surface.Text *) World.Sphere (* Kugel *) <0.0 -50.0 120.0> (* Kugelmittelpunkt *) 120.0 (* Kugelradius *)  World.Surface "Oberon"  World.Polygon <220.0 220.0 0.0> (* 1. Polygonpunkt *) <-220.0 220.0 0.0> (* 2. Polygonpunkt *) <-220.0 -220.0 0.0> (* 3. Polygonpunkt *) <220.0 -220.0 0.0> (* 4. Polygonpunkt *)  ~ Ende der Szeneriedefinition   Beispiel 1b Wie 6.1 Beispiel 1a, aber die Berechnung erfolgt in zwei Schritten. Im 1. Schritt wird nur zur Bildschirmbereiche von 4x4 Pixel eine Strahlenverfolgung durchgef…hrt. Manerhƒlt schnell einen ‚berblick …ber die Anordnung der Objekte in der Szenerie. Im 2. Schritt werden die fehlenden Strahlenverfolgungen ergƒnzt.  World.Define (* starte dieses Kommando *) World.Title "Example1.Bmp" World.LookAt <0.0 0.0 50.0> World.Observer <0.0 -500.0 170.0> World.ViewUp <0.0 0.0 1.0> World.Eye 57.0 World.View 150 150 World.CalcMode fast (* schnellberechnung *) 4 (* 4x4 Pixel *) World.Background (0.0 0.0 0.3) World.Ambient (0.2 0.2 0.2); World.Lamp <200.0 -400.0 200.0> (1.0 1.0 1.0) 8000.0 World.Lamp <0.0 0.0 200.0> (1.0 1.0 1.0) 8000.0 World.Surface "Metall" World.Sphere <0.0 -50.0 120.0> 120.0 World.Surface "Oberon" World.Polygon <220.0 220.0 0.0> <-220.0 220.0 0.0> <-220.0 -220.0 0.0> <220.0 -220.0 0.0> ~   Beispiel 1c Wie 6.1 Beispiel 1a, aber die Berechnung erfolgt in einem Task.Wƒhrend der Bildberechnung kann weitergearbeitet werden. World.Define (* starte dieses Kommando *) World.Title "Example1.Bmp" World.LookAt <0.0 0.0 50.0> World.Observer <0.0 -500.0 170.0> World.ViewUp <0.0 0.0 1.0> World.Eye 57.0 World.View 150 150 World.CalcMode task (* Berechnung im Task *) World.Background (0.0 0.0 0.3) World.Ambient (0.2 0.2 0.2); World.Lamp <200.0 -400.0 200.0> (1.0 1.0 1.0) 8000.0 World.Lamp <0.0 0.0 200.0> (1.0 1.0 1.0) 8000.0 World.Surface "Metall" World.Sphere <0.0 -50.0 120.0> 120.0 World.Surface "Oberon" World.Polygon <220.0 220.0 0.0> <-220.0 220.0 0.0> <-220.0 -220.0 0.0> <220.0 -220.0 0.0> ~  6.2 Beispiel 2 Eine Kugel aus Glas steht auf einem quadratischen Polygon auf dem eine Bitmap aufgetragen ist. World.Define (* starte dieses Kommando *) World.Title "Example2.Bmp" World.LookAt <0.0 0.0 0.0> World.Observer <100.0 400.0 300.0> World.ViewUp <0.0 0.0 1.0> World.Eye 57.0 World.View 150 150 World.Background (0.0 0.0 0.0) World.Ambient (0.2 0.2 0.2); World.Lamp <150.0 150.0 200.0> (1.0 1.0 1.0) 200.0 World.Lamp <0.0 200.0 200.0> (1.0 1.0 1.0) 200.0 World.Surface "Glas" World.Sphere <50.0 80.0 100.0> 100.0 World.Surface "Karro rot/schwarz" World.Polygon <200.0 200.0 0.0> <-200.0 200.0 0.0> <-200.0 -200.0 0.0> <200.0 -200.0 0.0> ~  6.3 Beispiel 3 Auf einer Kugel steht eine umgekehrte Pyramide die durch vier Streben gehalten wird. Auf der Grundflƒche ist eine Bitmap aufgetragen. World.Define (* starte dieses Kommando *) World.Title "Example3.Bmp" World.LookAt <0.0 0.0 130.0> World.Observer <200.0 500.0 400.0> World.ViewUp <0.0 0.0 1.0> World.Eye 60.0 World.View 150 150 World.Background (0.0 0.0 0.0) World.Ambient (0.2 0.2 0.2); World.Lamp <300.0 0.0 200.0> (1.0 1.0 1.0) 1000.0 World.Lamp <0.0 0.0 400.0> (1.0 1.0 1.0) 1000.0 World.Surface "Kunststoff violett" World.Cylinder (* Strebe 1 *) <200.0 200.0 0.0><150.0 150.0 300.0> <210.0 200.0 0.0><160.0 150.0 300.0> <210.0 210.0 0.0><160.0 160.0 300.0> <200.0 210.0 0.0><150.0 160.0 300.0> World.Cylinder (* Strebe 2 *) <-200.0 200.0 0.0><-150.0 150.0 300.0> <-210.0 200.0 0.0><-160.0 150.0 300.0> <-210.0 210.0 0.0><-160.0 160.0 300.0> <-200.0 210.0 0.0><-150.0 160.0 300.0> World.Cylinder (* Strebe 3 *) <-200.0 -200.0 0.0><-150.0 -150.0 300.0> <-210.0 -200.0 0.0><-160.0 -150.0 300.0> <-210.0 -210.0 0.0><-160.0 -160.0 300.0> <-200.0 -210.0 0.0><-150.0 -160.0 300.0> World.Cylinder (* Strebe 4 *) <200.0 -200.0 0.0><150.0 -150.0 300.0> <210.0 -200.0 0.0><160.0 -150.0 300.0> <210.0 -210.0 0.0><160.0 -160.0 300.0> <200.0 -210.0 0.0><150.0 -160.0 300.0> World.Surface "Kunststoff rot" World.Cylinder (* Kegel *) <20.0 20.0 100.0><150.0 150.0 300.0> <-20.0 20.0 100.0><-150.0 150.0 300.0> <-20.0 -20.0 100.0><-150.0 -150.0 300.0> <20.0 -20.0 100.0><150.0 -150.0 300.0> World.Surface "Kunststoff gr…n" World.Sphere <0.0 0.0 50.0> 50.0 World.Surface "Fliesenboden" World.Polygon (* Boden *) <200.0 200.0 0.0> <-200.0 200.0 0.0> <-200.0 -200.0 0.0> <200.0 -200.0 0.0> ~  6.4 Beispiel 4  In einem Raum steht ein Tisch der von zwei Lampen beleuchtet wird. World.Define (* starte dieses Kommando *) World.Title "Example4.Bmp" World.LookAt <0.0 0.0 130.0> World.Observer <000.0 500.0 200.0> World.ViewUp <0.0 0.0 1.0> World.Eye 60.0 World.View 150 150 World.Background (0.0 0.0 0.0) World.Ambient (0.2 0.2 0.2); World.Lamp <200.0 0.0 400.0> (1.0 1.0 1.0) 100.0 World.Lamp <0.0 0.0 400.0> (1.0 1.0 1.0) 100.0 World.Surface "ZickZack" World.Polygon (* Boden *) <300.0 300.0 0.0> <-300.0 300.0 0.0> <-300.0 -300.0 0.0> <300.0 -300.0 0.0> World.Surface "Wand" World.Polygon (* Wand hinten *) <300.0 -300.0 0.0> <-300.0 -300.0 0.0> <-300.0 -300.0 300.0> <300.0 -300.0 300.0> World.Polygon (* Wand links *) <300.0 -300.0 0.0> <300.0 300.0 0.0> <300.0 300.0 300.0> <300.0 -300.0 300.0> World.Polygon (* Wand rechts *) <-300.0 -300.0 0.0> <-300.0 300.0 0.0> <-300.0 300.0 300.0> <-300.0 -300.0 300.0>  World.Surface "Kunststoff braun" World.Cylinder (* Tischbein 1 *) <100.0 100.0 0.0><100.0 100.0 100.0> <110.0 100.0 0.0><110.0 100.0 100.0> <110.0 110.0 0.0><110.0 110.0 100.0> <100.0 110.0 0.0><100.0 110.0 100.0> World.Cylinder (* Tischbein 2 *) <-100.0 100.0 0.0><-100.0 100.0 100.0> <-110.0 100.0 0.0><-110.0 100.0 100.0> <-110.0 110.0 0.0><-110.0 110.0 100.0> <-100.0 110.0 0.0><-100.0 110.0 100.0> World.Cylinder (* Tischbein 3 *) <100.0 -100.0 0.0><100.0 -100.0 100.0> <110.0 -100.0 0.0><110.0 -100.0 100.0> <110.0 -110.0 0.0><110.0 -110.0 100.0> <100.0 -110.0 0.0><100.0 -110.0 100.0> World.Cylinder (* Tischbein 4 *) <-100.0 -100.0 0.0><-100.0 -100.0 100.0> <-110.0 -100.0 0.0><-110.0 -100.0 100.0> <-110.0 -110.0 0.0><-110.0 -110.0 100.0> <-100.0 -110.0 0.0><-100.0 -110.0 100.0> World.Cylinder (* Tischplatte *) <120.0 120.0 100.0><120.0 120.0 115.0> <120.0 -120.0 100.0><120.0 -120.0 115.0> <-120.0 -120.0 100.0><-120.0 -120.0 115.0> <-120.0 120.0 100.0><-120.0 120.0 115.0> ~  6.5 Beispiele von Oberflƒchendefinitionen:  Edit.Open Surface.Text 6.6 ffnen gespeicherter Bilder: World.Open ^ Example1.Bmp Example2.Bmp Example3.Bmp Example4.Bmp  7 Fehler bei der Szenendefinition: Im Szenendefinitionstext wird an den Stellen wo Fehler erkannt werden ein "Fehlerelement" eingef…gt. Im System.Log werden die Fehler dokumentiert. Die Zuordnung der Fehlernummer zum Fehlertext ist im WorldErrors.Text abgelegt. ( Edit.Open WorldErrors.Text ) AsciiCoder.CodeFiles % RayTrace.Mod World.Mod WorldErrors.Text RayTrace.Text Surface.Text RayTrace.Tool Carro.Bmp Stripe.Bmp Comp.Bmp Oberon.Bmp ZickZack.Bmp Example1.Bmp Example2.Bmp Example3.Bmp Example4.Bmp ~