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

Aktuelle Zeit: Do Jul 10, 2025 17:39

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: Position von Lichtquelle angeben?
BeitragVerfasst: So Mai 10, 2009 18:34 
Offline
DGL Member

Registriert: Mi Mai 06, 2009 15:57
Beiträge: 13
Grüsse,
ich beschäftige mich gerade mit der Beleuchtung, und soweit ist mir auch alles klar.
Nun wollte ich anstelle einer directional light (also parallele Lichtstrahlen) einmal eine positionierte Lichtquelle benutzen.

Ich habe also eine ganz einfache Szene modelliert (ähnlich dem Sonnensystem aus dem Tutorial) und wollte die Lichtquelle über der zentrale Kugel positionieren.

Kugelpositionen:
...
glTranslatef(0.0 , 0.0 , -30.0);
glutSolidSphere(3,20,20);
etc.
...

Ich dachte mir also, dass ich als Position für das Licht ganz einfach beispielsweise folgendes eingeben könnte (in der init, sprich vor dem translate in display-Fkt):
GLfloat light_position[] = { 0.0 , 5.0 ,-30.0 , 1.0};
glLightfv(GL_LIGHT0 , GL_POSITION , light_position);
...

So, ich erhalte wie erwartet auch eine positionierte Lichtquelle, doch scheint sich diese nicht wie erwartet an der Position 0,5,-30 sondern ungefähr an 0,5,-35.
Verschiebe ich sie lediglich um -30 auf der z-Achse, stimmt alles. Die Frage, die sich mir stellt ist, warum durch eine Angabe eines y-Wertes der z-Wert ebenfalls beeinflusst wird.

Dann habe ich die Positionierung der Lichtquelle mal aus der init entfernt und mit in die display-Fkt verschoben und die Position der Lichtquelle mit { 0.0 , 5.0 ,0 , 1.0} angegeben, nachdem ich die modelview-Matrix translatiert habe (also um 30 auf y-Achse verschoben habe). Bringt aber genau den selben Effekt, den ich oben beschrieben habe.

Weiss jemand, warum das so ist, bzw. wie man die Lichtquelle richtig positionieren solte?

Vielen Dank im Vorraus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 20:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Ich habe also eine ganz einfache Szene modelliert (ähnlich dem Sonnensystem aus dem Tutorial) und wollte die Lichtquelle über der zentrale Kugel positionieren.

Kugelpositionen:
...
glTranslatef(0.0 , 0.0 , -30.0);
glutSolidSphere(3,20,20);

Wenn Du eine Lichtquelle über dem Objekt positionieren möchtest, ist der einfachste Weg, es über dem Objekt zu positionieren. :wink: :

GLfloat light_position[] = { 3.0 ,25.0 ,20.0 ,1.0 };
...
glTranslatef(0.0 , 0.0 , -30.0);
glLightfv(GL_LIGHT0 , GL_POSITION , light_position);
glutSolidSphere(3,20,20);

Im Lichttutorial (Tutorial Nr.>8<) steht über die Positionierung des Lichts eine ganze Menge, siehe unter: "Das Positionsproblem". Das, was Du möchtest, steht dort unter "Stationäre Lichtquellen". Wenn Du nur ein Objekt hast, kannst Du Dir das "PushMatrix/PopMatrix" das dort angegeben ist ersparen.
Viele Grüße
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 23:30 
Offline
DGL Member

Registriert: Mi Mai 06, 2009 15:57
Beiträge: 13
Ich danke dir für die Antwort.

Mein Fehler war, dass ich die Lichtquelle nicht VOR der Platzierung der Objekte getätigt habe, sondern dazwischen. Damit wurde jede Manipulation der Matrix natürlich auch auf das Licht angewand, wodurch es letztendlich an der falschen Position war. Das hab ich nun korrigert.

Nun stellt sich mir allerdings noch eine andere Frage zu stationären Spotlight. Im Tutorial sind diese kurz angerissen und es gibt auch ein schönes Bildchen, wo 3 farbige Spotlights abgebildet sind, die nach aussen hin ausfaden (soll ja durch GL_SPOT_EXPONENT erreicht werden.).

Folgendes Problemchen habe ich:

Ich lasse ein grosses Quadrat (Kantenlänge 20units) zeichnen, gebe die Normale dazu an. Darüber zeichne ich ein Spotlight, das nach unten auf dieses Viereck scheint. Problem ist natürlich hierbei, dass OGL die Lichtreflexion bzw. was beleuchtet sein soll ja nur an den Vertices berechnet. Da davon aber bei einem Quadrat nur 4 vorhanden sind, erscheint das komplette Quadrat gleich hell.

Also dachte ich mir, ich erstelle das Quadrat aus vielen kleinen Untereinheiten (bei mir momentan 100*100 kleine Quadrate. Dadurch erhalte ich tatsächlich einen Kreisrunden Spot, der nach aussen hin gefadet ist. Das Problem dabei ist natürlich, dass darunter die Perfomance enorm leidet, da 40000 Vertices berücksichtigt werden müssen von OGL.

Wie realisiert ihr solch ein Problem effizient?

display-code:
Code:
  1. void display (void) {
  2.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  3.     glLoadIdentity();
  4.  
  5.     // Spot-Light positionieren
  6.     glTranslatef(0,0,-50);
  7.     glRotatef(winkelAll,1,0,0);             // um best. Winkel drehen, der von Benutzereingabe manipuliert wird
  8.     glPushMatrix();
  9.     glTranslatef(0,10,0);
  10.     GLfloat light_position[] = { 0,0,0, 1 };
  11.     GLfloat spot_direction[] = { 0, -1, 0 };
  12.     glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 20);
  13.     glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 30.0);
  14.     glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
  15.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  16.  
  17.     // Modellieren
  18.     glPopMatrix();
  19.     //Quadrat unter Kugel zeichnen, bestehend aus anzahl*anzahl Teilquadraten
  20.     glPushMatrix();
  21.     glTranslatef(0,-5,0);
  22.     int anzahl = 100;
  23.     for (int i=0; i<anzahl; i++) {
  24.         for (int j=0; j<anzahl; j++) {
  25.             glBegin(GL_QUADS);
  26.                 glNormal3f(0,1,0);
  27.                 glVertex3f(-10+i*((float)20/anzahl),0,10-j*((float)20/anzahl));
  28.                 glVertex3f(-10+(i+1)*((float)20/anzahl),0,10-j*((float)20/anzahl));
  29.                 glVertex3f(-10+(i+1)*((float)20/anzahl),0,10-(j+1)*((float)20/anzahl));
  30.                 glVertex3f(-10+i*((float)20/anzahl),0,10-(j+1)*((float)20/anzahl));
  31.             glEnd();
  32.         }
  33.     }
  34.    
  35.     glPopMatrix();
  36.     //Kugel platzieren
  37.     glutSolidSphere(3,50,50);
  38.     glutSwapBuffers();
  39. };
[/code]


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 10, 2009 23:49 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Es klingt komisch, aber am Einfachsten geht das wohl mit Shadern. Einen PerPixelShading Shader haben wir im Wiki in der Shadersammlung.

Eventuell kannst du auch Erfolg mit projezierten Texturen haben. Diese Technik ist ähnlich einer Schattentechnik. Link kann ich dir keinen Anbieten, aber vielleicht wissen die anderen was.
Mit dieser Technik kann man z.B. die Farbigen Lichtfelder die Bleiglasfenster in Kirchen auf Objekte werfen nachbilden.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 11, 2009 06:48 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
stimmt, mit projected textures könntest du Erfolg haben :) Versuch dich mal an denen

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 11, 2009 12:47 
Offline
DGL Member

Registriert: Mi Mai 06, 2009 15:57
Beiträge: 13
Ich danke euch für die Hinweise und werde dies mal ausprobieren, sobald ich mich bis zu den shadern vorgearbeitet habe.


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 7 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]