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?!


  • Mod

    bei der position ist w==1, ansonsten ist es ein richtungs- und kein orts-vector.


Anmelden zum Antworten