Zylindrisches Billboard: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Anleitung: Pascal Tags eingesetzt)
K (Der Ausdruck ''<pascal>(.*?)</pascal>'' wurde ersetzt mit ''<source lang="pascal">$1</source>''.)
 
(2 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
{{Unvollständig}}
 
{{Unvollständig}}
 +
{{Bildwunsch|Eine schematische Skizze wie ein zylindrisches Billboard sich bezüglich der "Kamera" ausrichtet.}}
 
=Zylindrisches Billboard=
 
=Zylindrisches Billboard=
 
Wie schon der Name aussagt dient ein '''zylindrisches [[Billboard]]''' zur Darstellung eines Zylindrischen Körpers wie etwa einen Baumstamm. Neben solchen direkt zylindrischen Körpern, kann ein solches Billboard auch genutzt werden um Lichtstrahlen darzustellen.<br>
 
Wie schon der Name aussagt dient ein '''zylindrisches [[Billboard]]''' zur Darstellung eines Zylindrischen Körpers wie etwa einen Baumstamm. Neben solchen direkt zylindrischen Körpern, kann ein solches Billboard auch genutzt werden um Lichtstrahlen darzustellen.<br>
Zeile 14: Zeile 15:
  
 
Durch entsprechende Addition der Vektoren kann man nun das gewünschte Rechteck beschreiben:
 
Durch entsprechende Addition der Vektoren kann man nun das gewünschte Rechteck beschreiben:
<pascal>
+
<source lang="pascal">
 
  OC := OA + AC;
 
  OC := OA + AC;
 
  OD := OA + AD;
 
  OD := OA + AD;
 
  OE := OA + AB +AD;
 
  OE := OA + AB +AD;
 
  OF := OA + AB +AC;
 
  OF := OA + AB +AC;
</pascal>
+
</source>
 
Dazu folgende Sikzze:
 
Dazu folgende Sikzze:
  
Zeile 27: Zeile 28:
  
 
== Beispiel ==
 
== Beispiel ==
<font color="#000080">''// Variable zum speichern der Modelview-Matrix''</font>
+
 
'''var'''
+
<source lang="pascal">
  ModelViewMatrix:TMatrix4f;
+
// Variable zum speichern der Modelview-Matrix
<br />
+
var
<font color="#000080">''// Viereck beschreibende Daten''</font>
+
  ModelViewMatrix:TMatrix4f;
'''const'''
+
 
  LaengezuBreite=4.0; <font color="#000080">''// 4 mal so lang wie breit.''</font>
+
 
  PunktA:TVektor4f='''('''X:2;Y:1;Z:-2;W:1''')''';
+
// Viereck beschreibende Daten
  PunktB:TVektor4f='''('''X:-2;Y:-2;Z:-4;W:1''')'''; <br />
+
const
'''procedure''' ZeichenRoutine;
+
  LaengezuBreite=4.0; // 4 mal so lang wie breit.
'''var'''
+
  PunktA:TVektor4f=(X:2;Y:1;Z:-2;W:1);
  OA,OB:TVektor4f;
+
  PunktB:TVektor4f=(X:-2;Y:-2;Z:-4;W:1);  
  AB:TVektor4f;
+
 
  AC,AD:TVektor4f;
+
procedure ZeichenRoutine;
  P1,P2,P3,P4: TVektor4f;
+
var
'''begin'''
+
  OA,OB:TVektor4f;
  glClear'''('''GL_COLOR_BUFFER_BIT '''or''' GL_DEPTH_BUFFER_BIT''')''';
+
  AB:TVektor4f;
  glMatrixMode'''('''GL_MODELVIEW''')''';
+
  AC,AD:TVektor4f;
  glLoadIdentity;
+
  P1,P2,P3,P4: TVektor4f;
  glTranslatef'''('''0,0,-6''')'''; <br />
+
begin
  <font color="#000080">''// Modelview Matrix in einer Variablen ablegen''</font>
+
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glGetFloatv'''('''GL_MODELVIEW_MATRIX,@ModelViewMatrix''')'''; <br />
+
  glMatrixMode(GL_MODELVIEW);
  <font color="#000080">''// Position der Punkte nach Multiplikation mit der ModelViewMatrix;''</font>
+
  glLoadIdentity;
  OA := VektormalMatrix'''('''PunktA,ModelViewMatrix''')''';
+
  glTranslatef(0,0,-6);  
  OB := VektormalMatrix'''('''PunktB,ModelViewMatrix''')'''; <br />
+
 
  <font color="#000080">''// Vektor von A nach B''</font>
+
  // Modelview Matrix in einer Variablen ablegen
  AB := SubVektor'''('''OB,OA''')'''; <br />
+
  glGetFloatv(GL_MODELVIEW_MATRIX,@ModelViewMatrix);  
  <font color="#000080">''// Gekürzte Vektorprodukt Ergebnisse''</font>
+
 
  AC.X := AB.Y /LaengezuBreite;
+
  // Position der Punkte nach Multiplikation mit der ModelViewMatrix;
  AC.Y := -AB.X /LaengezuBreite;
+
  OA := VektormalMatrix(PunktA,ModelViewMatrix);
  AC.Z := 0;
+
  OB := VektormalMatrix(PunktB,ModelViewMatrix);  
  AC.W := 0;
+
 
  AD.X := -AC.X;
+
  // Vektor von A nach B
  AD.Y := -AC.Y;
+
  AB := SubVektor(OB,OA);  
  AD.Z := 0;
+
 
  AD.W := 0; <br />
+
  // Gekürzte Vektorprodukt Ergebnisse
  <font color="#000080">''//Punkte des Vierecks aus Vektoren zusammenbauen''</font>
+
  AC.X := AB.Y /LaengezuBreite;
  P1 := AddVektor'''('''OA,AC''')''';
+
  AC.Y := -AB.X /LaengezuBreite;
  P2 := AddVektor'''('''OA,AD''')'''; <br />
+
  AC.Z := 0;
  P3 := AddVektor'''('''P2,AB''')''';
+
  AC.W := 0;
  P4 := AddVektor'''('''P1,AB''')'''; <br />
+
  AD.X := -AC.X;
  <font color="#000080">''// Schon berücksichtigte Modelview-Matrix auf die Indentitäts-Matrix setzen''</font>
+
  AD.Y := -AC.Y;
  glLoadIdentity;
+
  AD.Z := 0;
  <font color="#000080">''// Viereck ausgeben''</font>
+
  AD.W := 0;  
  glBegin'''('''GL_LINE_LOOP''')''';
+
 
    glColor3f'''('''1,0,0''')'''; glVertex4fv'''('''@P1''')''';
+
  //Punkte des Vierecks aus Vektoren zusammenbauen
    glColor3f'''('''0,0,1''')'''; glVertex4fv'''('''@P2''')''';
+
  P1 := AddVektor(OA,AC);
    glColor3f'''('''1,0,1''')'''; glVertex4fv'''('''@P3''')''';
+
  P2 := AddVektor(OA,AD);  
    glColor3f'''('''1,1,1''')'''; glVertex4fv'''('''@P4''')''';
+
 
  glEnd;
+
  P3 := AddVektor(P2,AB);
'''end''';
+
  P4 := AddVektor(P1,AB);  
 +
 
 +
  // Schon berücksichtigte Modelview-Matrix auf die Indentitäts-Matrix setzen
 +
  glLoadIdentity;
 +
  // Viereck ausgeben
 +
  glBegin(GL_LINE_LOOP);
 +
    glColor3f(1,0,0); glVertex4fv(@P1);
 +
    glColor3f(0,0,1); glVertex4fv(@P2);
 +
    glColor3f(1,0,1); glVertex4fv(@P3);
 +
    glColor3f(1,1,1); glVertex4fv(@P4);
 +
  glEnd;
 +
end;
 +
</source>

Aktuelle Version vom 10. März 2009, 19:16 Uhr

Hinweis: Dieser Artikel ist noch unvollständig.
(Mehr Informationen/weitere Artikel)

{{{1}}}

Incomplete.jpg

Hinweis: Diesem Artikel sollten folgende Bilder beigefügt werden:

(Mehr Informationen/weitere Artikel)
Bildwunsch.jpg
Eine schematische Skizze wie ein zylindrisches Billboard sich bezüglich der "Kamera" ausrichtet.

Zylindrisches Billboard

Wie schon der Name aussagt dient ein zylindrisches Billboard zur Darstellung eines Zylindrischen Körpers wie etwa einen Baumstamm. Neben solchen direkt zylindrischen Körpern, kann ein solches Billboard auch genutzt werden um Lichtstrahlen darzustellen.
Beispiel Zylindrisches Billboard.jpg

Anleitung

Ein Rechteck kann, wenn eine Breite bekannt ist, an 2 Punkten aufgehängt werden. Ausgehend von dieser Basis werden als erstes die zwei Punkte mit der Modelview Matrix multipliziert, um ihrere spätere Position zu ermitteln.

Danach wird ein Vektor AB errechnet, der von Punkt A nach Punkt B zeigt.

Das Kreuzprodukt vom diesem und den Vektor (0,0,1) ergeben dann zwei neue Vektoren (z.B Vektor AC und Vektor AD).

Durch eine Längenänderung dieser Vektoren kann die Breite des Rechtecks bestimmt werden.

Durch entsprechende Addition der Vektoren kann man nun das gewünschte Rechteck beschreiben:

 OC := OA + AC;
 OD := OA + AD;
 OE := OA + AB +AD;
 OF := OA + AB +AC;

Dazu folgende Sikzze:

Zylindrisches Billboard Skizze.png

Da die Modelview Matrix schon berücksichtigt wurde setzt man diese nun auf die Identitäts Matrix und kann das Rechteck CDEF rendern.

Beispiel

// Variable zum speichern der Modelview-Matrix
var
  ModelViewMatrix:TMatrix4f;


// Viereck beschreibende Daten
const
  LaengezuBreite=4.0; // 4 mal so lang wie breit.
  PunktA:TVektor4f=(X:2;Y:1;Z:-2;W:1);
  PunktB:TVektor4f=(X:-2;Y:-2;Z:-4;W:1); 

procedure ZeichenRoutine;
var
  OA,OB:TVektor4f;
  AB:TVektor4f;
  AC,AD:TVektor4f;
  P1,P2,P3,P4: TVektor4f;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  glTranslatef(0,0,-6); 

  // Modelview Matrix in einer Variablen ablegen
  glGetFloatv(GL_MODELVIEW_MATRIX,@ModelViewMatrix); 

  // Position der Punkte nach Multiplikation mit der ModelViewMatrix;
  OA := VektormalMatrix(PunktA,ModelViewMatrix);
  OB := VektormalMatrix(PunktB,ModelViewMatrix); 

  // Vektor von A nach B
  AB := SubVektor(OB,OA); 

  // Gekürzte Vektorprodukt Ergebnisse
  AC.X := AB.Y /LaengezuBreite;
  AC.Y := -AB.X /LaengezuBreite;
  AC.Z := 0;
  AC.W := 0;
  AD.X := -AC.X;
  AD.Y := -AC.Y;
  AD.Z := 0;
  AD.W := 0; 

  //Punkte des Vierecks aus Vektoren zusammenbauen
  P1 := AddVektor(OA,AC);
  P2 := AddVektor(OA,AD); 

  P3 := AddVektor(P2,AB);
  P4 := AddVektor(P1,AB); 

  // Schon berücksichtigte Modelview-Matrix auf die Indentitäts-Matrix setzen
  glLoadIdentity;
  // Viereck ausgeben
  glBegin(GL_LINE_LOOP);
    glColor3f(1,0,0); glVertex4fv(@P1);
    glColor3f(0,0,1); glVertex4fv(@P2);
    glColor3f(1,0,1); glVertex4fv(@P3);
    glColor3f(1,1,1); glVertex4fv(@P4);
  glEnd;
end;