home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HOT Scene Stuff
/
hotscenestuffzyklop1996.iso
/
diskmags
/
deutsch
/
blckmail
/
bm06
/
3_demo.bmt
< prev
next >
Wrap
Text File
|
1994-02-06
|
6KB
|
199 lines
Abteilung Gute Figuren
3D-Grafik unter Turbo-Pascal (1)
Tja, wer von Euch in der Klasse 12 oder 13 ist müßte eigentlich
schonmal was mit Analytischer Geometrie zu tun gehabt haben. Bäh,
sagt Ihr? Wartet's ab! Euch hat das Thema hier Spaß gemacht?
Fantastisch, dann dürfte Euch der folgende Artikel besonders
zusagen (vorausgesetzt, Ihr seid Pascalisten oder Anhänger einer
anderen Sprache, die Formeln lassen sich problemlos nach BASIC
oder C oderwasauchimmer umschreiben). Ihr wißt nichtmal, was
Analytische Geometrie ist? Egal, das, was man davon für die nun
folgenden Grafik-Routinen braucht, ist nicht besonders schwer zu
verstehen.
Zuerst stellt sich natürlich die Frage, wie man überhaupt Punkte
im Raum darstellen soll und wie man sie auf den Bildschirm
umrechnet, daß die Sache dann auch 3-dimensional aussieht. Die
Lösung ist, zumindest für die Darstellung, extrem einfach:
Wir definieren zunächst den Vektor-Typ:
Type
Vektor = Array[1..3] of Integer;
Damit können wir Punkte im Raum angeben. Außerdem brauchen wir
natürlich einen Vektor, der einen Bildschirmpunkt beschreibt:
BVektor = Array[1..2] of Integer;
Zunächst weisen wir einem Vektor seine Koordinaten zu. Dafür habe
ich dir Prozedur LET geschrieben, man braucht dann nur eine Zeile
dafür.
Procedure Let(Var vec: Vektor; x1, x2, x3: Integer);
Begin
vec[1]:=x1;
vec[2]:=x2;
vec[3]:=x3;
End;
Man kann natürlich jederzeit ein einzelnes Element des Vektors
ändern, LET verwende ich nur, um den gesamten Vektor zu ändern.
So, für eine Animation sollte man mit den Vektoren ja möglichst
einfach rechnen, oder? Bitte sehr: Hier für alle, die die Theorie
der Vektoren noch nicht kennen, die Routinen zum Addieren von
Vektoren und zum Multiplizieren eines Vektors mit einer Zahl. Mehr
braucht man normalerweise nicht.
Procedure AddVec(vec1, vec2: Vektor; Var Ergebnis: Vektor);
{Addition zweier Vektoren}
Begin
Ergebnis[1]:=vec1[1]+vec2[1];
Ergebnis[2]:=vec1[2]+vec2[2];
Ergebnis[3]:=vec1[3]+vec2[3];
End;
Procedure SM(vec: Vektor; k: Integer; Var Ergebnis: Vektor);
{Multiplikation eines Vektors mit einer Zahl}
Begin
Ergebnis[1]:=k*vec[1];
Ergebnis[2]:=k*vec[2];
Ergebnis[3]:=k*vec[3];
End;
Auf Schleifen wurde hier verzichtet, da es so, zumindest bei einer
größeren Anzahl Vektoren schneller geht.
Nun zur Umrechnung auf Bildschirmkoordinaten. Wie zumindest die
bereits angesprochenen 12er und 13er wissen, verwendet man zur
Darstellung von räumlichen Figuren meistens ein kartesisches
Koordinatensystem. Die x1-Achse ist dabei normalerweise die
Diagonale. Bei mir ist die Diagonale jetzt halt die x3-Achse bzw.
z-Achse, weil sie berechnet werden muß und x und y als
Bezeichnungen für die Bildschirmkoordinaten vereinbart sind. Ich
benutze den allgemein üblichen Winkel α=45° und den
Verkürzungsfaktor √2/2 (das läßt sich nämlich sehr einfach
berechnen und sieht trotzdem recht brauchbar aus):
Procedure V2B(vec: Vektor; Var bvec: BVektor);
Begin
bvec[1]:=vec[1]-(vec[3] div 2);
bvec[2]:=vec[2]-(vec[3] div 2);
End;
Das war's schon! Gebt doch mal die Raumkoordinaten eines Würfels
in Form von Vektoren ein und rechnet sie mit V2B um, Ihr werdet
sehen, es funktioniert. Mit Hilfe von LET und V2B funktioniert
eine Prozedur, mit der ein Punkt, den man in Raumkoordinaten
angibt, direkt auf dem Bildschirm richtig plaziert wird (Als
Ursprung O des gedachten Koordinatensystems verwende ich hier die
Bildschirmmitte).
Procedure Plot_Hi(vec: Vektor; Farbe: Word);
Var
b: BVektor;
Begin
V2B(vec, b);
PutPixel(b[1]+319, 240-b[2], Farbe);
End;
Die Prozedur nennt sich Plot_Hi, weil sie für den Bildschirmmodus
640*480 bei 16 Farben geschrieben wurde. In der beiliegenden Unit
sind alle Prozeduren und Funktionen außerdem noch für 320*200 bei
256 Farben implementiert. Wie man aus der Prozedur erkennen kann,
ist der Ursprung des gedachten Koordinatensystems der Mittelpunkt
des Bildschirms (läßt sich natürlich beliebig ändern). Außerdem
sind in der Unit noch Routinen für Linien im Raum und für
Vektorbälle.
So, nun wünsche ich Euch viel Spaß mit der beiliegenden Unit
(VGRAFIK.PAS). In der nächsten Ausgabe werden wir uns dann mit der
Animation von Figuren beschäftigen. Danach kommt dann die Zentral-
perspektive dran, die wir natürlich auch animieren werden.
Bis dahin gute Ideen wünscht Euch
Midnight