OpenGL Spotlight
-
Ich wollte mit folgendem Code einen runden Lichtkegel erzeugen.
#include <stdlib.h> #include <GL/glut.h> //Variablen für die Darstellung bzw. Entfernung int size=10; int n_distance=10; int a_distance=30; //y zeigt nach oben int x_eye=0; int y_eye=0; float z_eye=20; //Zählvariablen int i; int x,y=0; void myinit(void) { glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); //Lichtquelle 0 **************************************************************** //Glanzlichtanteil GLfloat l_specular[] = { 1, 1, 1, 1.0 }; glLightfv(GL_LIGHT0, GL_SPECULAR, l_specular); //Position der Lichtquelle GLfloat l_position[] = { 0.0, 0.0, 5.0 , 0.0}; glLightfv(GL_LIGHT0, GL_POSITION, l_position); //Spotlight-Richtung GLfloat spot_direction[] = { 0, 0, -1 , 0.0}; glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction); //Spotlight-Winkel glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 10.0); //Spotlight-Exponent glLightf(GL_LIGHT0, GL_SPOT_EXPONENT , 50.0); //Wenn das gesetz, dann wird das Licht für die Berechnung der Farben //der Objekte genutzt glEnable(GL_LIGHTING); //Licht 0 wird eingeschaltet glEnable(GL_LIGHT0); //Lichtquelle 0 end ******************************************************* //Die Szene***************************************************************** //die ambiente Lichtstärke der gesamten Szene //Default-Werte sind was bei {0.2, 0.2, 0.2, 1.0} GLfloat lmodel_ambient[] = { 0.0, 0.0, 0.0, 1.0 }; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); //Reflexionswinkel für das Glanzlicht GLfloat local_view[] = { 0.0 }; glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view); //dunkles Grau für den Hintergrund glClearColor(0.0, 0.1, 0.1, 0.0); //Die Szene end ************************************************************ } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //wenn sich der up_Vektor ändert, bitte Kommentar am Anfang ändern gluLookAt(x_eye, y_eye, z_eye, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //Materialeigenschaften setzen ******************************************** //Für Mehrkörpersystem****************************************************** glPushMatrix(); //Normale setzten glNormal3f(0,0,1); //welchen Glanzlichtanteil reflektiert das Material-Objekt0 GLfloat m_specular[] = { 1.0, 1.0, 1.0, 1.0 }; glMaterialfv(GL_FRONT, GL_SPECULAR, m_specular); //Mehrkörpersystem //eine Fläche aus 100 Quadraten 1x1; //verschieben in das Centrum glTranslatef(-5.0,-5.0,0.0); // for(x=0;x<=9;x++) { for(y=0;y<=9;y++) { glBegin(GL_QUADS); glVertex3f(x,y,0); glVertex3f(x+1,y,0); glVertex3f(x+1,y+1,0); glVertex3f(x,y+1,0); glEnd(); } } glPopMatrix(); glFlush(); } void myReshape(int w, int h) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(0-size/2, 0+size/2, 0-size/2, 0+size/2, n_distance, a_distance); glMatrixMode(GL_MODELVIEW); } /* Main Loop * Open window with initial window size, title bar, * RGBA display mode, and handle input events. */ int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize (600, 600); glutCreateWindow(argv[0]); myinit(); glutReshapeFunc(myReshape); glutDisplayFunc(display); glutMainLoop(); return 0; }
Geht aber nicht.
weiss nicht, warum. Kann mir da jemand helfen ?
-
Was genau geht denn nicht? Hast Du gar kein Licht oder ein Omni oder erwartest du so eine Art Lichtkegel/Nebeleffekt?
-
Der Körper, den ich erzeuge, besteht aus 100 kleinen Quads.
Die Normalen sind auf (0,0,1) gesetzt.
Die z-Achse zeigt nach vorne und die Lichtquelle sitzt auf der z-Achse.
Ich erwarte einen relativ runden Lichtkreis auf dem Körper.
Im jetzigen Fall ist der Körper komplett beleuchtet, egal, wie klein ich den Spotlight-Winkel der Lichtquelle auch einstelle.
-
eventuell kann jemand auch ein Beispiel posten, in dem das Spotlight funktioniert. Die Beispiele, die ich bisher im Internet gefunden habe, waren alle recht umfangreich und deshalb für mich schwer nachzuvollziehen.
-
Ich hab meine ersten Spotlights aus den NeHe-Tuts, da gibts einige Beispiele.
Leider fällts mir schwer bei Dir einen Fehler zu finden sieht eigentlich ganz gut aus. Aber etwas ist mir doch aufgefallen: Muß man glNormal nicht für jedes QUAD aufrufen?!
-
bei der position ist w==1, ansonsten ist es ein richtungs- und kein orts-vector.