Logo: Strunz Seitenlogo: Strunz-Design
Auswahl
 Begrüßung
\/Programmieren
 Galerie
 Sonstiges

Coding
 Übersicht
 Albengenerator
\/Demoeffekte
 ICPC
 Links

Demoeffekte
 Übersicht
 Zoomer
 Lasershow
 Vectorballs
->Delayvectors
 

Tutorial & Download "Delayvectors"

Beschreibung des Effektes

Ein Würfel aus 12*12*12=1728 Punkten

In welchen Demos zu sehen?

Hierbei handelt es sich um einen schon recht alten Effekt, der bereits in frühen Demos wie Panic von der Future Crew im Jahre 1993 zu sehen war. Der Effekt ist daher auch sehr genügsam in Sachen Rechenleitung, da nur ein paar Vektoren berechnet und als Pixel auf dem Bildschirm gesetzt werden müssen. Einzig die Realisierung der leuchtenden Spur erfordert einen etwas tieferen Griff in die Trickkiste. Das Mittel der Wahl ist hier das sogenannte Palettenrotieren. Dabei werden die Pixel immer mit der gerade intensivsten Farbe gezeichnet, und dann in den nachfolgenden Animationsschritten über die Palette der Grafikkarte langsam abgedunkelt. Die Pixel, die dabei gerade die Farbe schwarz erreicht haben, müssen dann natürlich noch entfernt werden. Sonst würden diese im nästen Schritt wieder sichtbar werden, da durch das Palettenrotieren die dunkelste Farbe immer wieder schlagartig auf die hellste Farbe gesetzt wird.

Programmablauf pro Frame

  1. Alle neuen zu zeichnenden Punkte der Figur berechnen
  2. Diese Vektoren mit der gerade intensivsten Farbe aus der Palette zeichnen
    (Farb-Nummer zwischen 1 und 32)
  3. Alle Punkte der Figur von vor 32 Schritten berechnen
  4. Diese Pixel auf dem Schirm auf Farbe 0 (=Hintergrund = schwarz) setzen, falls diese nich nicht schon von einem anderen, jüngeren Punk (hellerer Pixel) übermalt worden sind.
  5. Palettenrotieren der Farben 1-32, dabei die Farbe C ebenfalls um eine Position weiterschieben. Die Farben werden zyklisch durchrotiert. Wenn C die Farbe 32 erreicht, wird C im nächsten Schritt wieder auf Farbe 1 gesetzt. Dadurch bleibt C immer auf dem hellsten Farbeintrag der Palette stehen.
  6. weiter mit 1. Schritt bis Abbruch.

3D-Routinen, Vektorberechnungen und Matritzen

Diesen Themenkomplex habe ich aus dem Beispielprogramm komplett ausgelagert, da ich die 3D-Engine unabhängig von diesem Demoeffekt programmiert habe. Es handelt sich dabei um eine Turbo-Pascal-Unit, die die für die Vektorberechnung nötigen Datenstrukturen und Prozeduren zur Verfügung stellt. Ich musste mir zum Zeitpunkt der Programmierung dieses Effektes also keine Sorgen mehr um 3D-Vektoren machen, ich habe sie einfach eingebunden.

Die komplette Vektorunit mit Quellcode befindet sich ebenfalls mit in dem Paket. Wer Interesse hat, kann das Programm verwenden und einbinden, denn dafür habe ich es geschrieben.

Die Unit stellt die Funktionen der folgenden Tablelle zur Verfügung. Sie ist komplett in Assembler geschrieben und nutzt 32-Bit breite Register und -Maschinenbefehle. Sie ist daher sehr schnell. Die Vektoren werden in 32-Bit Longints gespeichert, weswegen ein mehr als ausreichend grosser Wertebereich mit entsprechender Genauigkeit gewährleistet ist. Nachkommastellen werden durch Fixpunktarithmetik berücksichtigt.

Folgende Aufgaben wurden in die Vektorunit ausgelagert:
  • Datenstrukturen für Matritzen und Vektoren in 2D und 3D
  • Rotationsmatritzengenerierung aus übergeben Winkeln
    Winkel als Wert zwischen 0 und 1023(=360 Grad)
  • Translationsmatritzengenerierung aus übergebem Vektor
  • schnelle Matritzenmultiplikation
  • schnelle Vektortransformation über Matrix
  • perspektivische 3D-2D-Projektion

Programminfo

Turbo Pascal (kompiliert mit TP 7.0)
Videomodus: Standard Mode 13h (MCGA), 320x200 Pixel bei 256 Farben
benötigt und enthält meine Vektorunit
großteil in Assembler, Effekt läuft in Echtzeit ab
249 LoC Hauptprogramm
529 LoC Vektorunit
Geschwindigkeit:
AMD K6-233 mit Synchronisation: 70 Frames pro Sekunde (fps)
AMD K6-233 ohne Synchronisation: 162 Frames pro Sekunde (Max-fps)

Download

Download als ZIP-File:
delayvec.zip (10635 Bytes)
enthält ausführbares .EXE-Files und die Quellcodes.
Eine genauere Beschreibung der mitgelieferten Vektorunit kann ich hier leider nicht mitliefern, da sie den Rahmen sprengen würde. Es sind allerdings nur sehr wenig Zeilen im Hauptprogramm nötig, um die Unit zu verwenden. Mit ein wenig Experimentieren sollte ein problemloses Einbinden in eigene Programme kein Problem darstellen.

Screenshots

Bild des Effektes
 
 
 


Seitenanfang

Inhalt und Design von Florian Evers, florian-evers@gmx.de