Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 04:23

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Licht und die Normalen
BeitragVerfasst: Mo Mär 20, 2006 14:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Feb 02, 2005 14:22
Beiträge: 81
Hallo Forum,

erstmal möchte ich mich vorsorglich entschuldigen, dass ich dieses leidige Thema hier - mal wieder - anschneide.

Ich möchte meine Szene mit OpenGL-Licht ausstatten. mit gluSphere und gluCylinder funktioniert das auch fast wunderbar. "Fast" weil sich das Licht noch "mit mir zusammen" durch den Raum bewegt und nicht still steht. Aber für dieses Problem habe ich denke ich schon genug Informationen gefunden.

Was ich absolut nicht versteht ist, wie ich die Normalen für meine Quads berechnen kann. Ich habe nur Hinweise darauf gefunden, wie das mit Dreiecken geht (wenn ich das so richtig verstanden habe). Unten habe ich den Quelltext für zwei Quads beschrieben. Wie würde für diese zwei Quads die Normalen aussehen? Wie genau kann ich sie berechnen? Funktioniert das ganze wirklich nur, wenn ich meine gesamte Szene auf Dreiecke umstelle?

Ich weiß, sicher viele dumme Fragen aber zum Einen habe ich noch nie etwas mit Licht gemacht und zum Anderen habe ich ein recht übles mathematisches Verständnis. Ich denke aber mal, dass es vielen so wie mir geht und sicher nicht nur mir damit geholfen wäre, anhand der beiden Quads "da unten" mal eine Beispielrechnung durchzuführen. Ich hoffe das das nicht zu viel verlangt ist!

Code:
  1. glBegin(GL_QUADS);
  2.   glTexCoord2f(1, 1); glVertex3f(-1, -1,  1);
  3.   glTexCoord2f(1, 0); glVertex3f( 1, -1,  1);
  4.   glTexCoord2f(0, 0); glVertex3f( 1,  1,  1);
  5.   glTexCoord2f(0, 1); glVertex3f(-1,  1,  1);
  6.  
  7.   glTexCoord2f(1, 1); glVertex3f(-1, -1, -1);
  8.   glTexCoord2f(1, 0); glVertex3f(-1, -1,  1);
  9.   glTexCoord2f(0, 0); glVertex3f(-1,  1,  1);
  10.   glTexCoord2f(0, 1); glVertex3f(-1,  1, -1);
  11. glEnd;


Vielen Dank für jeden Versuch mir dieses Thema irgendwie näher zu bringen!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 20, 2006 14:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Also mit Vierecken funktionert das eigentlich genau so wie mit Dreiecken. Ein Viereck setzt sich ja aus zwei Dreiecken zusammen. Du musst also nur für die zwei Dreiecke die Normalen berechnen, wenn du weißt, dass die Dreiecke in einer Ebene liegen, reicht es auch aus, wenn du das einmal machst.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 20, 2006 21:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Feb 02, 2005 14:22
Beiträge: 81
Müsste das hier funktionieren, oder ist da irgendwo der Wurm drin?

Code:
  1. Var
  2.   Vektor : Array[0..3] Of TVektor;
  3.   Ax, Ay, Az : Single;
  4.   Bx, By, Bz : Single;
  5.   Cx, Cy, Cz : Single;
  6.   Dx, Dy, Dz : Single;
  7.  
  8. .
  9. .
  10. .
  11.  
  12. Ax := -3.5; Ay :=  3; Az := -0.5;
  13. Bx := -3.5; By := -1; Bz := -0.5;
  14. Cx := -4.5; Cy := -1; Bz := -0.5;
  15. Dx := -4.5; Dy :=  3; Dz := -0.5;
  16.  
  17. Vektor[0] := MakeVektor(Ax, Ay, Az);
  18. Vektor[1] := MakeVektor(Bx, By, Bz);
  19. Vektor[2] := MakeVektor(Cx, Cy, Cz);
  20. Vektor[3] := MakeVektor(Dx, Dy, Dz);
  21.  
  22. Normalize(Vektor[0]);
  23. Normalize(Vektor[1]);
  24. Normalize(Vektor[2]);
  25. Normalize(Vektor[3]);
  26.  
  27. glBegin(GL_QUADS);
  28.  
  29.   glNormal3d(Vektor[0].X, Vektor[0].Y, Vektor[0].Z);
  30.   glTexCoord2f(0, 0); glVertex3f(Ax, Ay, Az);  
  31.  
  32.   glNormal3d(Vektor[1].X, Vektor[1].Y, Vektor[1].Z);
  33.   glTexCoord2f(0, 4); glVertex3f(Bx, By, Bz);
  34.  
  35.   glNormal3d(Vektor[2].X, Vektor[2].Y, Vektor[3].Z);
  36.   glTexCoord2f(1, 4); glVertex3f(Cx, Cy, Cz);
  37.  
  38.   glNormal3d(Vektor[3].X, Vektor[3].Y, Vektor[3].Z);
  39.   glTexCoord2f(1, 0); glVertex3f(Dx, Dy, Dz);
  40.  
  41. glEnd;


MakeVektors und Normalize sind aus dem Mathe Tutorial


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 20, 2006 22:47 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Öhm... Ich kenn die Funktionen zwar nicht, aber so wie das aussieht berechnest du nirgendwo die Normalen. Normalize bringt die Vectoren nur auf länge 1, und make Vector pressed die Zahlen in ein Array. Du musst das Kreuzprodukt zweier in der Ebene deines Polygons liegenden Vectoren bilden. Das ist die Normale. Guck für die Formel mal in ein Tafelwerk unter Kreuzprodukt.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 21, 2006 15:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Feb 02, 2005 14:22
Beiträge: 81
Ja natürlich, oh man, gestern war wirklich nicht mein Tag :evil:
Das kann nur besser werden.

Code:
  1. glBegin(GL_QUADS);
  2.   Ax := -15; Ay := -1; Az :=  15;
  3.   Bx := -15; By := -1; Bz := -15;
  4.   Vektor[0] := MakeVektor(Ax, Ay, Az);
  5.   Vektor[1] := MakeVektor(Bx, By, Bz);
  6.   NVektor := CrossProduct(Vektor[0], Vektor[1]);
  7.   Normalize(NVektor);
  8.  
  9.   glNormal3d(NVektor.X, NVektor.Y, NVektor.Z);
  10.   glTexCoord2f(15,  15); glVertex3f(-15,   -1, -15);   // Boden
  11.   glTexCoord2f(15,   0); glVertex3f(-15,   -1,  15);
  12.   glTexCoord2f( 0,   0); glVertex3f( 15,   -1,  15);
  13.   glTexCoord2f( 0,  15); glVertex3f( 15,   -1, -15);
  14. glEnd;


So sieht der Codeschnipsel aus und das ganze funktioniert auch so.

Der Winkelpunkt der weiß eingezeichneten Linien ist die Position des Lichtes. Sollte es jedenfalls sein, denn der Zylinder wird dann ja irgendwie nicht so richtig angeleuchtet. (Liegt wohl eher an den weißen Linien, das die nicht die richtige Position haben).

Jetzt bleibt die Frabe, wie ich einen Schatten auf die Wand hinter den beiden Säulen bekomme. Die Rückwand wird zwar auch von unten nach oben hin heller, aber der Schatten fehlt. Leider auch auf dem Boden...

Zudem hat der Boden überall den gleichen "Schattenwert". Die Berechnung erfolgt wie bei den Wänden auch aber der "Schattenwert" ist überall gleich. Es handelt sich dabei um ein Quad, welches mit glScale auf die entsprechende Größe vergrößert wurde. Bleibt mir da nichts anderes übrig, als den Boden aus mehreren Quads zu erstellen? Und wenn warum? Die rückwand in dem Beispiel besteht auch nur aus einem Quad, trotzdem sieht man einen Hell-Dunkelverlauf von unten nach oben...

Fragen über Fragen... :roll:


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 21, 2006 16:03 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also die Lichtberechnung geht folgendermaßen:

1. Berechne Lichtintensität in den Eckpunkten
2. Interpoliere intensitäten über die Fläche


Wenn deine Eckpunkte alle sowei weg sind, dass sie rein Lichttechnisch eh nur noch per Ambienten licht beleuchtet werden, dann wird die Interpolation auch nix anderes mehr liefern.

Nur mal um das Problem zu verdeutlichen:

Nimm ein großes Quad und häng in der Mitte ein Licht drüber. Wenn die Eckpunkte des Quads soweit vom Licht wegliegen, dass die Abschwächung dafür sorgt, dass die Eckpunkte im Dunkeln liegen, dann wird auch das Stück direkt unter dem Licht nicht beleuchtet.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]