|

Grundlagen der Grafikprogrammierung - Teil 18 - by Delax
Gruk'Tuk!
Das Thema lautet "PrimitiveObjects". Und da gedenke dieses Thema etwas ausführlicher zu gestalten "PrimitiveObjects, die Erste".
Was ein PrimitiveObject ist? PrimitiveObjects sind genau das, was der Name vermuten lässt: primitive Objekte, bestehend nur aus Punkten die miteinander verbunden sind (oder auch nicht). Diese Punkte werden in einer Struktur festgehalten und das Verbinden erfolgt per Aufruf mit verschiedenen Methoden: Point List, Line List, Line Strip, Triangle List, Triangle Strip, Triangle Fan, Quad List und Quad Strip. Diese Methoden werden euch jetzt noch nichts sagen, doch genau diese sind es, die Primitives so interessant machen.
Normalerweise trifft man Primitives nur in der 3D Welt, aber erstens kann man auch im 2D Bereich viel mit ihnen machen und zweitens will ich sie als letzten Schritt vor der 3D Einführung durchnehmen, um an mit den Primitives gleich im 3D Raum herumzuspielen.
Aber zur Sache, denn bis dahin liegt noch ein langer Weg vor uns! Zuerst zur Theorie: stellen wir uns einmal ein simples Objekt auf dem Bildschirm vor - ein Viereck. Normalerweise würden wir hingehen und 4 Punkte bestimmen, die wir mit der Line Prozedur (siehe Teil 8) verbinden. Stellen wir uns jetzt etwas anderes vor: eine Liste, in der wir alle Punkte speichern und eine Prozedur, mit der wir sagen "verbinde alle Punkt in dieser Liste nach einander".
Was bräuchten wir für so eine Struktur? Nun, erst einmal eine Liste mit den X/ Y Positionen der Punkte, sowie deren Farben. Dann noch eine Variable, in der die Anzahl der in der Liste eingetragenen Punkte festhält und fertig.
TYPE PrimitiveObjectSystem = Record
PositionX, PositionY : ARRAY[1..MaxPoints] OF Longint;
color1, color2 : ARRAY[1..MaxPoints] OF Longint;
Anzahl : LongInt;
END;
Tataa! Da wir nicht wissen bzw. uns an der Stelle noch nicht festlegen wollen wieviele Punkte unser System maximal fassen soll lassen wir es Variabel.
Als nächstes legen wir uns eine Variable mit der Struktur an mit Namen "PrimitiveOne".
Was fangen wir nun mit diesem System an? Nun, als erstes stellen wir uns vor, wir wollen einen Punkt in die Struktur einfügen. Wir übergeben X/Y Koordinaten und die Farbe. Die Anzahl der Punkte in der Struktur steigt um eins und wir füllen die Liste:
PROCEDURE AddPrimitivePoint(x,y, color1,color2 : Longint);
BEGIN
PrimitiveOne.Anzahl += 1;
PrimitiveOne.PositionX[PrimitiveOne.Anzahl] := x;
PrimitiveOne.PositionY[PrimitiveOne.Anzahl] := y;
PrimitiveOne.color1[PrimitiveOne.Anzahl] := color1;
PrimitiveOne.color2[PrimitiveOne.Anzahl] := color2;
END;
Da sollte jeder durchsteigen - ist nicht wirklich schwer. Je mehr wir aber die Liste füllen, um so mehr brauchen wir eine Prozedur, die eine Liste wieder frei machen kann:
PROCEDURE ClearPrimitiveObject;
BEGIN
PrimitiveOne.Anzahl := 1;
FOR counter1 := 1 TO 100 DO BEGIN
PrimitiveOne.PositionX[PrimitiveOne.Anzahl] := 0;
PrimitiveOne.PositionY[PrimitiveOne.Anzahl] := 0;
PrimitiveOne.color1[PrimitiveOne.Anzahl] := 0;
PrimitiveOne.color2[PrimitiveOne.Anzahl] := 0;
END;
PrimitiveOne.Anzahl := 0;
END;
Alles auf null setzen und Ende. Und jetzt kommt das wirklich interessante. DrawPrimitiveObject! Hier wird es dargestellt. Erst die Prozedur, dann die Erklärung.
PROCEDURE DrawPrimitveObject;
BEGIN
if PrimitiveOne.Anzahl <= 1 THEN exit;
FOR counter1 := 1 TO PrimitiveOne.Anzahl-1 DO BEGIN
Line(vidvscr,
PrimitiveOne.PositionX[counter1],
PrimitiveOne.PositionY[counter1],
PrimitiveOne.PositionX[counter1+1],
PrimitiveOne.PositionY[counter1+1],
PrimitiveOne.color1[counter1],
PrimitiveOne.color2[counter1]);
END;
END;
Was tun wir? Wir verbinden alle Punkte mit Linien. Ale Punkt 1 und Punkt 2 sind eine Linie. Punkt 2 und Punkt 3 sind eine Linie. 3,4. 4,5. und so weiter bis wir am Ende der Punkte sind. Jene Art die Liste abzuarbeiten nennt man Line Strip.
Jetzt kommt auch der Durchblick: Diese Namen von vorhin sind nichts anderes, als Methoden die Liste abzuarbeiten und aus den Punkten schließlich Linien, Drei- oder Vierecke zu machen.
Die Regel ist dabei relativ einfach: eine Bla List ist immer eine Liste, in der kein Punkt mehr als einmal benutzt wird. Im Falle von Linien also: 1-2; 3-4; 5-6; ... Bei Dreiecken: 1-2-3; 4-5-6; 7-8-9; ... Bei Vierecken: 1-2-3-4; 5-6-7-8; 9-10-11-12; Strips sind hingegen ein bischen komplizierter. Hier wird ein Punkt mehrmals verwandt: 1-2; 2-3; 3-4; ... 1-2-3; 2-3-4; 3-4-5; ... 1-2-3-4; 3-4-5-6; 5-6-7-8; ...Schwer vorzustellen, malen wir uns das einmal auf:

Alles klar? Beachtet das in unserem Strip System die geraden und ungeraden Zahlen immer entweder oben oder unten sind - je nach Startpunkt. Als letztes in unserem System gibt es noch Triangle Fan. Das ist einfach zu erklären: jedes Dreieck hat den ersten Punkt in der Liste als Startpunkt: 1-2-3; 1-3-4; 1-4-5; ...
In Wirklichkeit lassen sich alle Arten mit einfachen Line Lists simulieren, aber der Rest ist Bequemlichkeit ;) Wo wir schon bei Wirklichkeit sind: im nächsten Teil werden wir in das System die restlichen Methoden einfügen und dafür sorgen das man sie auch aufrufen kann. Dann wird auch ein bischen OOP Programmierung hinzukommen. Spätestens wenn wir ein komplettes PrimitveObject "on the fly" mit "AddPrimitveObject(Name, MaxAnzahl) erstellen wollen. Aber das ist erst recht noch weit weg. Spielt erst einmal mit diesen Beispiel. Hier gibt es übrigens das
Beispielprogramm.
Delax/ Sundancer Inc.
[delax@sundancerinc.de]
Back to previous page
|