home *** CD-ROM | disk | FTP | other *** search
/ HOT Scene Stuff / hotscenestuffzyklop1996.iso / diskmags / deutsch / blckmail / bm06 / 3_demo.bmt < prev    next >
Text File  |  1994-02-06  |  6KB  |  199 lines

  1.  
  2.  
  3.        Abteilung Gute Figuren
  4.  
  5.  
  6.                          3D-Grafik unter Turbo-Pascal (1)
  7.  
  8.  
  9.        Tja, wer von  Euch in der  Klasse 12 oder  13 ist müßte eigentlich
  10.  
  11.        schonmal was mit Analytischer Geometrie  zu tun gehabt haben. Bäh,
  12.  
  13.        sagt Ihr?  Wartet's  ab! Euch  hat  das Thema  hier  Spaß gemacht?
  14.  
  15.        Fantastisch,  dann  dürfte  Euch  der  folgende  Artikel besonders
  16.  
  17.        zusagen (vorausgesetzt, Ihr  seid Pascalisten  oder Anhänger einer
  18.  
  19.        anderen Sprache,  die Formeln  lassen  sich problemlos  nach BASIC
  20.  
  21.        oder  C  oderwasauchimmer  umschreiben).  Ihr  wißt  nichtmal, was
  22.  
  23.        Analytische Geometrie ist?  Egal, das,  was man davon  für die nun
  24.  
  25.        folgenden Grafik-Routinen braucht,  ist nicht  besonders schwer zu
  26.  
  27.        verstehen.
  28.  
  29.  
  30.  
  31.        Zuerst stellt sich  natürlich die Frage,  wie man überhaupt Punkte
  32.  
  33.        im Raum  darstellen  soll  und  wie  man  sie  auf  den Bildschirm
  34.  
  35.        umrechnet, daß  die Sache  dann  auch 3-dimensional  aussieht. Die
  36.  
  37.        Lösung ist, zumindest für die Darstellung, extrem einfach:
  38.  
  39.        Wir definieren zunächst den Vektor-Typ:
  40.  
  41.  
  42.        Type
  43.          Vektor  =  Array[1..3] of Integer;
  44.  
  45.  
  46.        Damit können  wir Punkte  im Raum  angeben. Außerdem  brauchen wir
  47.  
  48.        natürlich einen Vektor, der einen Bildschirmpunkt beschreibt:
  49.  
  50.  
  51.          BVektor =  Array[1..2] of Integer;
  52.  
  53.  
  54.        Zunächst weisen wir einem Vektor  seine Koordinaten zu. Dafür habe
  55.  
  56.        ich dir Prozedur LET geschrieben,  man braucht dann nur eine Zeile
  57.  
  58.        dafür.
  59.  
  60.  
  61.        Procedure Let(Var vec: Vektor; x1, x2, x3: Integer);
  62.        Begin
  63.          vec[1]:=x1;
  64.          vec[2]:=x2;
  65.          vec[3]:=x3;
  66.        End;
  67.  
  68.  
  69.        Man kann  natürlich jederzeit  ein  einzelnes Element  des Vektors
  70.  
  71.        ändern, LET verwende  ich nur,  um den gesamten  Vektor zu ändern.
  72.  
  73.        So, für eine  Animation sollte  man mit den  Vektoren ja möglichst
  74.  
  75.        einfach rechnen, oder? Bitte sehr:  Hier für alle, die die Theorie
  76.  
  77.        der Vektoren  noch  nicht kennen,  die  Routinen zum  Addieren von
  78.  
  79.        Vektoren und zum Multiplizieren eines Vektors mit einer Zahl. Mehr
  80.  
  81.        braucht man normalerweise nicht.
  82.  
  83.  
  84.        Procedure AddVec(vec1, vec2: Vektor; Var Ergebnis: Vektor);
  85.        {Addition zweier Vektoren}
  86.        Begin
  87.          Ergebnis[1]:=vec1[1]+vec2[1];
  88.          Ergebnis[2]:=vec1[2]+vec2[2];
  89.          Ergebnis[3]:=vec1[3]+vec2[3];
  90.        End;
  91.  
  92.  
  93.        Procedure SM(vec: Vektor; k: Integer; Var Ergebnis: Vektor);
  94.        {Multiplikation eines Vektors mit einer Zahl}
  95.        Begin
  96.          Ergebnis[1]:=k*vec[1];
  97.          Ergebnis[2]:=k*vec[2];
  98.          Ergebnis[3]:=k*vec[3];
  99.        End;
  100.  
  101.  
  102.        Auf Schleifen wurde hier verzichtet, da es so, zumindest bei einer
  103.  
  104.        größeren Anzahl Vektoren schneller geht.
  105.  
  106.        Nun zur  Umrechnung auf  Bildschirmkoordinaten. Wie  zumindest die
  107.  
  108.        bereits angesprochenen  12er und  13er  wissen, verwendet  man zur
  109.  
  110.        Darstellung  von  räumlichen  Figuren  meistens  ein  kartesisches
  111.  
  112.        Koordinatensystem.  Die  x1-Achse   ist  dabei  normalerweise  die
  113.  
  114.        Diagonale. Bei mir ist die  Diagonale jetzt halt die x3-Achse bzw.
  115.  
  116.        z-Achse,  weil  sie  berechnet   werden  muß  und   x  und  y  als
  117.  
  118.        Bezeichnungen für  die Bildschirmkoordinaten  vereinbart sind. Ich
  119.  
  120.        benutze   den   allgemein   üblichen    Winkel   α=45°   und   den
  121.  
  122.        Verkürzungsfaktor  √2/2  (das  läßt   sich  nämlich  sehr  einfach
  123.  
  124.        berechnen und sieht trotzdem recht brauchbar aus):
  125.  
  126.  
  127.        Procedure V2B(vec: Vektor; Var bvec: BVektor);
  128.        Begin
  129.          bvec[1]:=vec[1]-(vec[3] div 2);
  130.          bvec[2]:=vec[2]-(vec[3] div 2);
  131.        End;
  132.  
  133.  
  134.        Das war's schon!  Gebt doch mal  die Raumkoordinaten eines Würfels
  135.  
  136.        in Form von  Vektoren ein und  rechnet sie mit  V2B um, Ihr werdet
  137.  
  138.        sehen, es  funktioniert. Mit  Hilfe von  LET und  V2B funktioniert
  139.  
  140.        eine Prozedur,  mit  der  ein Punkt,  den  man  in Raumkoordinaten
  141.  
  142.        angibt, direkt  auf  dem  Bildschirm  richtig  plaziert  wird (Als
  143.  
  144.        Ursprung O des gedachten  Koordinatensystems verwende ich hier die
  145.  
  146.        Bildschirmmitte).
  147.  
  148.  
  149.        Procedure Plot_Hi(vec: Vektor; Farbe: Word);
  150.        Var
  151.          b: BVektor;
  152.        Begin
  153.          V2B(vec, b);
  154.          PutPixel(b[1]+319, 240-b[2], Farbe);
  155.        End;
  156.  
  157.  
  158.        Die Prozedur nennt sich Plot_Hi,  weil sie für den Bildschirmmodus
  159.  
  160.        640*480 bei 16 Farben geschrieben  wurde. In der beiliegenden Unit
  161.  
  162.        sind alle Prozeduren und Funktionen  außerdem noch für 320*200 bei
  163.  
  164.        256 Farben implementiert. Wie man  aus der Prozedur erkennen kann,
  165.  
  166.        ist der Ursprung des  gedachten Koordinatensystems der Mittelpunkt
  167.  
  168.        des Bildschirms (läßt sich natürlich  beliebig  ändern).  Außerdem
  169.  
  170.        sind  in  der  Unit  noch  Routinen  für Linien im  Raum  und  für
  171.  
  172.        Vektorbälle.
  173.  
  174.  
  175.  
  176.        So, nun  wünsche  ich Euch  viel  Spaß mit  der  beiliegenden Unit
  177.  
  178.        (VGRAFIK.PAS). In der nächsten Ausgabe werden wir uns dann mit der
  179.  
  180.        Animation von Figuren beschäftigen. Danach kommt dann die Zentral-
  181.  
  182.        perspektive dran, die wir natürlich auch animieren werden.
  183.  
  184.        Bis dahin gute Ideen wünscht Euch
  185.  
  186.                                                                  Midnight
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.