LichtProbleme bei OpenGL



  • Hallo,

    ich erstelle eine 3D Landschaft mit OpenGL, doch wenn ich jetzt Licht einschalte, bekommen die Ränder der Vierecke (gezeichnet mit GL_QUADS)
    ganz komische helle Farbveränderungen.

    Das Licht wird richtig angezeigt, nur die Ververbunden der Ränder sind sehr stören.
    Dieses Problem verstärkt sich, je weiter die Flächen entfernt sind und wie schräg man draufblickt.

    Ich benutze dies:

    GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0};        //Werte für spekuläres Licht
    GLfloat ambientLight[] = { 1.0, 1.0, 1.0, 1.0 };	       //Werte für ambientes Licht
    GLfloat diffuseLight[] = { 0.1,0.1,0.1,1.0};			   //Werte für diffuses Licht
    GLfloat light_position[] = { 10.0, 0.0, 0.0, 0.0 };	   //Werte für Lichtposition
    
    glClearColor(0.0f,0.0f,0.0f,0.0f);					// Black Background
    glClearDepth(1.0f);
    glEnable(GL_NORMALIZE);
    glEnable(GL_DEPTH_TEST);								// Depth Buffer Setup
    glEnable(GL_TEXTURE_2D);							// Enable Texture Mapping
    glEnable(GL_LIGHT0);									   //Lichtquelle einschalten
    glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);
    glLightfv(GL_LIGHT0, GL_AMBIENT,ambientLight);		   //Initsialisierung der Lichter 
    glLightfv(GL_LIGHT0, GL_DIFFUSE,diffuseLight);
    glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
    glLightf(GL_BACK,GL_SHININESS,1.0);
    
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);  	
    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    

    Und dies zum zeichnen

    glBegin(GL_QUADS);
    
    					glNormal3f(normale.x,normale.y,normale.z);
    
    					glTexCoord2f(1.0f, 1.0f); glVertex3d(x-1,    y,     float_array[help1][y]);
    					glTexCoord2f(0.0f, 1.0f); glVertex3d(x,      y,     float_array[x][y]);
    					glTexCoord2f(0.0f, 0.0f); glVertex3d(x,    y-1,     float_array[x][help2]);
    					glTexCoord2f(1.0f, 0.0f); glVertex3d(x-1,    y-1,   float_array[help1][help2]);
    
    					glEnd(
    

    Die Normalen berechne ich so:

    struct Vector3d
    {
    	double x,y,z;
    };
    
    Vector3d normal(Vector3d a,Vector3d  b, Vector3d c){
    	b.x=b.x-a.x;	//abziehen
    	b.y=b.y-a.y;
    	b.z=b.z-a.z;
    
    	c.x=c.x-a.x;	//abziehen
    	c.y=c.y-a.y;
    	c.z=c.z-a.z;
    
    	Vector3d normale;
    
    	normale.x=a.y*c.z   -  a.z*c.y;				//Kreuzprodukt (hoffentlich)
    	normale.y=-(a.x*c.z -  a.x*c.x);
    	normale.z=a.x*c.y   -  a.y*c.x;
    
    	double laenge=sqrt(normale.x*normale.x+normale.y*normale.y+normale.z*normale.z);	//Laenge berechnen
    
    	normale.x=normale.x/laenge;				//jede Komponente durch Laenge teilen
    	normale.y=normale.y/laenge;
    	normale.z=normale.z/laenge;
    
    	return normale;
    }
    

    Wo liegt der Fehler?



  • Ich schätze es liegt am Specular-Anteil der Lichtquelle.
    Die schiesst ja aus allen Rohren 😃
    Schraub das mal runter auf 0.1, 0.1, 0.1, 0.1 oder so und guck ob es dann weg ist.



  • hmm.. mir fällt da zusätzlich das "krampfhaft jede zeile kommentieren"-syndrom auf. aber mal ehrlich:
    a-b //abziehen -ach nee?
    laenge=... //laenge berechnen -echt?
    bla/laenge //durch länge teilen -und ich dachte / ist logarithmus

    heißt: derart redundante kommentare sind nutzlos und machen oft den code schwerer zu lesen.

    sachen wie
    //an a anliegende vektoren berechnen
    //normale durch kp ermitteln
    //vektor normieren

    sind da minimal hilfreicher (wenn auch an der stelle fast schon zuviel.. wer am funktionsnamen und den paar zeilen nicht sofort sieht, daß eine normale berechnet wird, der wird so oder so nicht viel davon haben den code anzusehen ,-) ).

    kurz: kommentare sind nicht dazu da, den inhalt der codezeile nochmal "klartext" zu schreiben, damit auch der letzte kapiert, was ein - oder / macht, sondern auf etwas höhere ebene erklären, wozu der code abschnitt dient.

    meistens reicht ein kommentar am beginn der funktion (rückgabe und parameter erklären) und aussagefähige namen (wie eben "Vektor normale" und nicht "my_anonymous_struct xy"). den rest kann man dann für wirklich komplizierte sachen aufheben.

    z.b.

    float s=NV; //skalarprodukt
    if (!s) return 0; //verlassen falls s=0
    float d=N
    (P-Pos); // abziehen und skalarprodukt
    if (d<0) r=-r; // falls d kleiner 0 vorzeichen von r umdrehen
    float t=(d-r)/s; // abziehen und teilen

    solche kommentare sind schlicht für die tonne, denn das sollte sogar jede zweite primat noch aus dem code rauslesen können.

    /*
    float SpherePlaneCollision(viele params)
    Params:
    Vec3D N: Normalenvektor der Ebene
    Vec3D P: Ortsvektor eines Punkts auf der Ebene
    Vec3D V: Bewegungsvektor der Kugel
    Vec3D Pos: Ortsvektor der Kugel
    float r: Radius der Kugel
    Returns:
    Percentage of remaining movement after collision
    */

    /*Relativer Zeitpunkt t der Kollision berechnen*/
    float s=NV;
    //bei bewegung parallel zur ebene keine kollision zurückgeben
    if (!s) return 0;
    float d=N
    (P-Pos);
    //r statt d und s anpassen, vorzeichen heben sich beim teilen auf
    float t= d + ((d<0)?+r:-r) /s;

    ist zwar viel mehr zu tippen, erklärt aber wenigstens was da eigentlich gerechnet wird (bedeutung, nicht einzelne operationen).

    das andere sind typische "der tutor will aber kommentare im code"-ergebnisse, wo man sinnfreie kommentare hinknallt, nur damit der tutor zufrieden ist. traurig eigentlich, daß es in einem info-studium keiner für nötig hält, auf richtiges kommentieren einzugehen sondern es nur heißt "macht gefälligst kommentare". keine sau kratzt sich dann, ob da hilfreiche sachen stehen oder "ihhh, mir kam grade ein gelber popel aus der nase" und "das wetter ist super".



  • Trienco schrieb:

    keine sau kratzt sich dann, ob da hilfreiche sachen stehen oder "ihhh, mir kam grade ein gelber popel aus der nase" und "das wetter ist super".

    LOL 😃



  • Sgt. Nukem schrieb:

    LOL 😃

    tjaha, du lachst. aber ich mußte mir diese art von sinnlos-kommentaren mühsam abgewöhnen, nur weil die beim code meinten, es müßte am besten nach jeder zeile ein // kommen. und grade der billige 08/15 kram im grundstudium verdient eigentlich keine kommentare, außer brauchbar gewählten namen.

    könnte es "game architecture and design" gewesen sein, wo die lustige anekdote von dem entwickler erzählt wird, der die kommentare wirklich als tagebuch mißbraucht hat und dann wertvolle dinge festgehalten hat wie "12:30, habe hunger, mache mittagspause".



  • Trienco schrieb:

    könnte es "game architecture and design" gewesen sein, wo die lustige anekdote von dem entwickler erzählt wird, der die kommentare wirklich als tagebuch mißbraucht hat und dann wertvolle dinge festgehalten hat wie "12:30, habe hunger, mache mittagspause".

    Echt geil! 😃

    // 13:50 Uhr: Muß Omi anrufen...  :clown:
    

Anmelden zum Antworten