Die Dokumentation zum Algorithmus der 3D-Engine:


Die Koerper- und Raumklassen sollen die Darstellung mehrerer dreidimensionaler
Objekte, die unterschiedlich gedreht, bewegt und skaliert werden koennen, er-
moeglichen.


Die Koerperklasse:
------------------

Es wird eine Datenpipeline benutzt die sich wie folgt skizzieren laesst:

Fuer jeden Punkt in einem Koerper-Objekt:
Ursprungskoordinaten -> Koordinaten des umgeformten Objektes -> 2D-Koordinaten

Fuer jedes Dreieck:
Mittelpunktskoordinaten -> Mittelpunktskoordinaten des umgeformten Objektes

Es wird zwischen Ursprungskoordinaten und Koordinaten des umgeformten Objektes
unterschieden, damit sich der Koerper nicht durch Aufsummierung der Rechen-
fehler, die durch Ganzzahlenrechnung entstehen, langsam verformt.

Fuer jedes Dreieck ist eine 'Bauanleitung' vorhanden, welche aus den Indizes
der Eckpunkte besteht. Ferner ist dort auch die Farbe der Flaeche unterge-
bracht.

Bei Verschiebung, Drehung oder Skalierung eines Koerpers werden die Punkt-
koordinaten und Mittelpunktskoordinaten umgerechnet, je nach Angabe des Quell-
listentyps aus der Ursprungsliste oder der Umformliste stammend, und in die
Umformliste geschrieben (lediglich bei Skalierung ist auch ein Neuschreiben
der Ursrungsliste moeglich).

Wird das Objekt nun in einen Raum abgebildet, werden zunaechst die Punkte,
Flaeche fuer Flaeche, in 2D-Koordinaten umgerechnet.
Dabei wird anhand eines Zaehlers festgestellt, ob der entsprechende Punkt
schon fuer eine andere Flaeche nach 2D umgerechnet wurde, um Rechenzeit zu
sparen. Ist dies nicht der Fall wird fuer diesen die Helligkeit ermittelt
(eine Beschreibung dieses Vorgangs findet sich in der Datei LICHT.CPP) und in
einer Liste zusammen mit den 2D-Koordinaten, die unmittelbar dannach berechnet
werden, abgelegt.

Falls sich herausstellt, dass die Flaeche dem Betrachter abgewandt ist endet
der Vorgang hier und es wird mit der naechsten Flaeche fortgefahren.
Abschliessend werden fuer jedes Dreick ein Zeiger auf die 'Bauanleitung' und
auf die Liste mit den 2D-Punkten in eine Zeigerliste eines Raumobjekts einge-
tragen. Darueberhinaus werden die Z-Koordinaten der Flaechenmittelpunkte in
eine Sortierliste eingetragen und mit dem aktuellen Schreibindex des Raumob-
jektes numeriert.



Die Raumklasse:
---------------

Diese ist so konzipiert, dass sich mehrere Koerperobjekte in ein Raumobjekt
abbilden lassen, da der Index fuer die Eintragung als Member bereitsteht.

Um einen Raum abzubilden, muessen dessen Flaechen zunaechst sortiert werden.
Dazu wird hier ein Quicksort benutzt. Da sowohl Z-Koordinaten selbst, als auch
ihre Numerierungen sortiert werden, ergeben die letzteren die Indizes der
Zeigerliste, in der Zeiger auf die zum Zeichnen benoetigten Daten stehen, nach
Z-Koordinaten sortiert.
Demnach verlaeuft das Zeichnen recht einfach: Fuer jede Dreiecksflaeche werden
die 2D-Koordinaten der Eckpunkte aus der 2D-Liste geholt. Die Farbe wird mit
der Anzahl der Helligkeitsstufen (32) multipliziert (<< 5) und fuer jeden Eck-
punkt wird seine Helligkeit addiert, um ein brauchbares Farbpalettenindex zu
erhalten. Diese Werte werden der Dreiecksroutine uebergeben, die sich um alles
weitere kuemmert.
Vielen Dank an dieser Stelle an Terry Sznober der diese Funktion entwickelt
hat.



Die Mathematik fuer Rotation, Skalierung, Verschiebung und Abbildung:
---------------------------------------------------------------------

Der Vollstaendigkeit halber sollten auch die mathematischen Grundlagen hier
nicht fehlen...


Rotation:

Um die X-Achse:         Um die Y-Achse:         Um die Z-Achse:
z neu=cos(w)z+sin(w)y   x neu=cos(w)x+sin(w)z   y neu=cos(w)y+sin(w)x
y neu=cos(w)y-sin(w)z   z neu=cos(w)z-sin(w)x   x neu=cos(w)x-sin(w)y

w: Winkel


Skalierung:

x neu = x * sx   y neu = y * sy   z neu = z * sz

Skalierungsvektor: [sx,sy,sz]


Verschiebung:

Verschiebungsvektor: [dx,dy,dz]
x neu = x + dx   y neu = y + dy   z neu = z * + dz


Abbildung (Umrechnung in 2D Koordinaten):

x2d = ( x * 256 ) / (z-zk) + x_mittelpunkt
y2d = ( y * 256 ) / (z-zk) + z_mittelpunkt

zc: Z-Position der Kamera


Backface removal (das Entfernen von Betrachter-abgewandten Flaechen):

Es werden die 2D-Koordinaten eines Dreiecks betrachtet, um die Z-Komponente
der Normale einfacher berechnen zu koennen.
Dazu muessen die Bauanleitungen der Flaechen in gleichbleibendem Umlaufsinn
definiert sein (hier im Urzeigersinn).

nz= (y1-y3)*(x2-x1)-(x1-x3)*(y2-y1)

Am Vorzeichen von nz erkennt man die Ausrichtung einer Flaeche (sind die
Flaechen des Koerper (von aussen betrachtet) im Urzeigersinn definiert,
so zeigen Flaechen mit negativen nz in Richtung des Betrachters).
