Tinyray
ist eine kontextfreie Sprache zur Beschreibung einfacher 3D-Szenen
und soll dem interessierten Leser eine Hilfestellung zur Entwicklung und Interpretation eigener Programmiersprachen bieten.
Sie werden sehen, wie
- wichtige Entwurfsmuster
(sogenannte Design-Patterns)
bei der Entwicklung des Interpreters sinnvoll zum Einsatz kommen,
- nebst Interpreter ein einfach gelagerter
Raytrayer
realisiert wird.
Voraussetzungen, die Sie mitbringen sollten, sind:
- Gute Kenntnisse in Java
(Generic Java).
Der gesamte
Tinyray-Interpreter
(Version 2)
kommt mit den
Standardklassen
von
Java 1.6
aus.
Es werden
keine zusätzlichen Packages
benötigt!
- Ein gewisses Maß an Grundkenntnissen in Compilerbau.
Als Voraussetzung dürfte
Setty
vollkommen ausreichen.
Sie sollten zumindest mit den Begriffen
Token,
Scanner,
Parser
und
Syntaxbaum
etwas anfangen können.
- Ein gutes Verständnis bezüglich Vektorrechnung.
Der
Raytracer-Part
ist nichts anderes als angewandte Vektormathematik.
Mit der Tinyray-Sprache werden dreidimensionale Szenen beschrieben.
Um einen besseren Einstieg in eine neue Programmiersprache zu bekommen,
beginnt man traditionellerweise mit einem
„Hallo Welt”-Programm.
Das erste
Code-Beispiel
der
Tinyray-Sprache
implementiert eine zentral positionierte Kugel
(Sphere)
in einer
3D-Szene.
Die einzige Lichtquelle dieser Szene ist eine weiße Sonne
(Sun).
// Hallo Welt!
Tinyray {
Sphere {
[0, 0, 0]; // Wo liegt die Kugel?
2.0 // Welchen Radius besitzt die Kugel?
}
Sun {
[1, 1, 1]; // In welcher Richtung befindet sich die Sonne?
[1, 1, 1] // Welche Farbe hat die Sonne?
}
}
Der
Raytracer-Part
des Interpreters produziert aus dem
„Hallo Welt”-Programm.
ein Bild mit einer beleuchteten, grauen Kugel.
Die Kugel ist grau, weil für geometrische Objekte die graue Farbe voreingestellt ist.
Der
Tinyray-Interpreter
besitzt neben der Bilderzeugung auch noch weitere Features,
wie beispielsweise die Portierung eines
Tinyray-Programmes
in
POV-Ray-Code
oder auch in
Glut/OpenGL-C-Code.
Mit ein bisschen Übung können Sie eventuell auch folgende oder gar hochwertigere Bilder mit Tinyray erzeugen.
Mit Tinyray entwickelt!
Ebenfalls mit Tinyray entwickelt!
Ebenfalls mit Tinyray entwickelt!
Im Prinzip können auch Sie beliebige Bilder mit Tinyray entwickeln.
Wie jede andere Sprache basiert auch Tinyray auf einer Grammatik
— der Tinyray-Grammatik
TG.
Lassen Sie sich nicht von dem Umfang der
Tinyray-Grammatik
abschrecken!
Es werden noch viele
Tinyray-Programmbeispiele
folgen.
Tinyray-Grammatik TG = (N, T, P, S) mit
N = {
Tinyray, Global, Defaults, Geo, Sun, Camera,
Background, Ambience, Fog, Bounding, Triangle,
Sphere, Plane, Parameters, Vector
},
T = {
TINYRAY := 'Tinyray', CAMERA := 'Camera',
BOUNDING := 'Bounding', SPHERE := 'Sphere',
TRIANGLE := 'Triangle', PLANE := 'Plane',
AMBIENCE := 'Ambience', SUN := 'Sun',
BACKGROUND := 'Background', FOG := 'Fog',
DEFAULTS := 'Defaults',
LBRACE := '{', RBRACE := '}',
LBRACKET := '[', RBRACKET := ']',
SEP := ','|';',
REAL := ['+'|'-'] ((('0'-'9')+) | (('0'-'9')*'.'('0'-'9')+))
[('E'|'e') ['+'|'-'] ('0'-'9')+]
},
P = {
Tinyray ::= TINYRAY LBRACE (Global | Defaults | Geo | Sun)* RBRACE,
Global ::= Camera | Background | Ambience | Fog,
Defaults ::= DEFAULTS LBRACE Parameters RBRACE,
Geo ::= Bounding | Triangle | Sphere | Plane,
Sun ::= SUN LBRACE Vector SEP Vector RBRACE,
Camera ::= CAMERA LBRACE Vector SEP Vector [ SEP Vector ] RBRACE,
Background ::= BACKGROUND LBRACE Vector RBRACE,
Ambience ::= AMBIENCE LBRACE Vector RBRACE,
Fog ::= FOG LBRACE Vector SEP REAL RBRACE,
Bounding ::= BOUNDING LBRACE (Bounding | Triangle |
Sphere | Defaults)* RBRACE,
Triangle ::= TRIANGLE LBRACE Vector SEP Vector
SEP Vector [ SEP Parameters ] RBRACE,
Sphere ::= SPHERE LBRACE Vector SEP REAL [ SEP Parameters ] RBRACE,
Plane ::= PLANE LBRACE Vector SEP Vector
SEP Vector [ SEP Parameters ] RBRACE,
Parameters ::= Vector [ SEP Vector [ SEP REAL [ SEP REAL [
SEP REAL ] ] ] ],
Vector ::= LBRACKET REAL SEP REAL SEP REAL RBRACKET
} und
S = Tinyray.
Die Grammatik
TG
beschreibt die Menge aller potentiell möglichen
Tinyray-Programme.
Ein Programm, welches nicht die Regeln der Grammatik
TG
verletzt, ist
— syntaktisch gesehen —
ein korrektes
Tinyray-Programm.
An dieser Stelle, können Sie sich mal überlegen,
wie viele paarweise unterschiedliche, korrekte
Tinyray-Programme
existieren.