Normale pro Punkt und pro Fläche



  • Hallo,

    ich habe zwei Programme geschrieben, wobei in dem einen die Normalen für eine Fläche berechnet werden und bei dem anderen für jeden Vertex.

    So, nun scheint aber bei der Berechnung der Normalen für jeden Vertex irgendetwas nicht zu stimmen, d.h., meine Lichtquelle ist zum einen da, obwohl ich keine Position von dieser angegeben habe und zum anderen bewegt diese sich mit dem Objekt mit.

    Normal aber müsse sie konstant auf einen Punkt scheinen, da ich alle Lichtparameter in einer Funktion habe und diese vor Translationen oder Rotationen im Paint Mode aufrufe.

    Anbei habe ich nochmal die Funktion zum Berechnen der Normalen angehangen. Vieleicht liegt ja auch dort mein Fehler.

    while(Normale_d < Read_Data_File_Points)
            {
    
            GLfloat Betrag;
    
            //Kreuzprodukt
            Cross_x = +(Data_vertex_y[Normale_d] * Data_vertex_z[Normale_d]);
    
            Cross_y = -(Data_vertex_z[Normale_d] * Data_vertex_x[Normale_d]);
    
            Cross_z = +(Data_vertex_x[Normale_d] * Data_vertex_y[Normale_d]);
    
            Betrag =  sqrt( pow(Cross_x,2.0)        +
                            pow(Cross_y,2.0)        +
                            pow(Cross_z,2.0)        );
    
            if(Betrag == 0)
                    Betrag = 1.0;
    
            Normale_x_End[Normale_d]= (Cross_x/Betrag);
            Normale_y_End[Normale_d]= (Cross_y/Betrag);
            Normale_z_End[Normale_d]= (Cross_z/Betrag);
    
            Normale_d++;
            }
    


  • Interessant! Aber was ist nun die Frage? Ausserdem finde ich deine Ausführungen ziemlich verwirrend. Erst ist einfach Licht da, obwohl du keine Position angibst (brauch ein directionales Licht auch nicht), dann sagst du plötzlich es müsste eigentlich konstant auf einen Punkt scheinen (ja welchen nur?).

    Bye, TGGC



  • Zum ersten wollte ich eigentlich nur mal wissen, ob die Berechnung der Normalen korrekt ist.

    Zum anderen interessiert mich, warum das Licht nur eine Hälfte des Objektes beleuchtet.

    Hier der Code:

    void Licht(void)
    {
            GLfloat light_ambient0 [] = { 0.8, 0.8, 0.8, 0.0 };
            GLfloat light_diffuse0 [] = { 0.8, 0.8, 0.8, 0.0 };
            GLfloat light_position0[] = { 20.0, 20.0, 20.0. 0.0 };
    
            glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient0);
            glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse0);
            glLightfv(GL_LIGHT0, GL_POSITION,light_position0);
    
    }
    
    void __fastcall TForm1::OpenGLPaint(TObject *Sender)
    {
            glClear (   GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);   
    
    	...
    
            Licht();
    
    	...
    
    	//Translationen
    
    	glCallList(Objekt);
    }
    

    ... und ein Bild:
    http://it-ru.de/forum/download.php?id=6438



  • Also die Formel an sich ist falsch, da es beim Kreuzprodukt 3 Summanden und keinen Subtrahenden gibt. In bestimmten Kontexten, kann dies trotzdem richtig sein.

    Der Mond wird auch nur auf einer Seite beleuchtet, und keiner wundert sich.

    Das Bild sagt mir auch nichts.

    Bye, TGGC



  • TGGC schrieb:

    Das Bild sagt mir auch nichts.

    😃


Anmelden zum Antworten