Abschnitte

Home Home
Installieren
Steuerung
Story

Datenstrukturen
current section besondere Tricks

Die Entwickler

Copyright by Franz Baumann & Roman Kurmanowytsch, 1998, Vienna, Austria. No animals were harmed in the creation of this page.

besondere Tricks


In diesem Abschnitt wird ein bißchen über die algorithmischen Details gesprochen. Viele dieser Ideen wurden in Zusammenarbeit mit dem M-Team entwickelt.

Graphik

Um die Graphikausgabe so schnell wie möglich zu machen, haben wir mehrere Stadien der Programmierung durchgemacht. Am Anfang haben wir einen simplen Painters-Algorithmus implementiert. Das war für die erste Programmabgabe (Flat-shaded) vielleicht noch ausreichend, sobald aber die ersten Texturen verwendet wurden, ist das System viel zu langsam geworden. Außerdem hatten wir keine Idee, wie wir bewegte Objekte realisieren sollten. Die Texturierung erfolgt perspektivisch richtig.

Als nächsten Schritt haben wir nun die Front-to-Back Methode implementiert. Dazu haben wir einen Z-Buffer verwendet, der auch für die bewegten Objekte weiterverwendet werden kann. Aber leider war unser C-Code immer noch zu langsam.

Aus diesem Grund haben wir uns daran gemacht, die Texturierungsroutine in Assemblercode zu schreiben und ausserdem von der Floating-point- auf die Fix-point-Arithmetik umzusteigen. Die Texturemapping-Routine, die John DiCamillo (Milo) in seiner Internet-Seite vorstellt, ist leider für uns nicht anwendbar gewesen. Also mußten wir uns selbst eine basteln.

Wir verwenden aber noch eine Möglichkeit, die Graphik zu beschleunigen. Wir verwenden Spans, die uns - für jede Zeile extra - zeigen, welche Bereiche noch nicht gezeichnet wurden. Dadurch können gleich mehrere Pixel ausgeschlossen werden, die jeder für sich alleine eine Überprüfung des Z-Buffers bedeutet hätte. Wenn eine ganze Zeile gefüllt wurde, wird dies ebenfalls angezeigt.

Kollisionskontrolle

Um die Kollisionskontrolle so effizient wie möglich zu machen, haben wir uns zwei Wege überlegt. Der erste wäre, einen Strahl vom Spieler-Augpunkt nach unten zu schießen und mit allen Polygonen, die einer Bodenfläche entsprechen (deren Normalvektor nicht weiter als einen gewissen Winkel von einer Senkrechten entfernt sind) zu schneiden. Diese Methode hat den Nachteil, daß on-the-fly alle Bodenpolygone geschnitten werden müssen. Deshalb haben wir uns für eine zweite Variante entschieden: wir verwenden nun eine Hilfsdatenstruktur, in der - gleich einer 2-dimensionalen Hashtable - alle Bodenplatten (und Deckflächen) gespeichert werden. Nun müssen nur mehr die in einem bestimmten Raster existierenden Bodenplatten überprüft werden.