Beleuchtung unter OpenGL



  • Hallo ihr,

    ich heisse Melanie und studiere in Berlin Informatik. Zur Zeit sollen wir für einen Semesternachweis mit OpenGL programmieren. Hierfür habe ich verschiedene Modelle erstellt und mit Beleuchtung versehen.

    Nun zu meiner Frage: Kann man in OpenGL die Beleuchtung so verwenden, ohne das man die einezelnen Polygone sieht, aus denen mein Objekt zusammen gesetzt ist?

    Ich habe im Prinzip für drei Punkte eine Normale berechnet. Die Strukturen lasssen sich dabei schon gut erkennen, jedoch halt leider auch die einzelnen Polygone.

    Ich habe auch schon probiert, verschiedene Funktionen für den weichen Farbübergang zu setzen (z.B. glEnable(GL_POLYGON_SMOOTH)), doch leider ohne sichbaren erfolg.

    Also, ich hoffe, ich habe den Punkt getroffen. Würde mich freuen, wenn mir jemand helfen könnte.

    Bis bald.
    Melanie





  • Du darfst für Vertices die übereinander liegen keine unterschiedliche Normalen haben. Sondern du musst bei allen Vertices die aufeinander liegen, die Normalem zusammenrechen, mitteln und dann auf jeden dieser Vertices legen.



  • Hier.



  • TGGC schrieb:

    Hier.

    TGGC, das ist einfach unfair, einen ernstgemeinten Beitrag mit deinem Zeug was nichts damit zu tun hat, zu befüllen.



  • Wie wärs mit einer diszplinarischen Maßnahme für TGGC? Keine Bewährung - wegen Uneinsichtigkeit.



  • illuminator schrieb:

    Wie wärs mit einer diszplinarischen Maßnahme für TGGC? Keine Bewährung - wegen Uneinsichtigkeit.

    Warum nicht direkt wie bei den Nazis??



  • Auf Anhieb würd ich mal folgende Dinge probieren:

    Zum einen wäre da der Befehl

    glShadeMode(GL_SMOOTH);
    

    der aber wohl leider die Beleuchtung etwas "verfälscht".

    Oder du kannst deine Objekte, insofern sie nicht zu komplex sind, mit "_STRIP's" erstellen. Allerdings weiß ich nicht genau ob man dann die einzelnen Polygonen nicht mehr sieht.

    Naja kannst ja mal ausprobieren 🙂



  • Das Objekt, welches ich darstellen möchte, soll ja im Solid Mode aufgezeigt werden, von daher kann ich ja nicht GL_LINE_STRIP verwenden.

    Könnte vieleicht mal jemand eine Funktion zum Berechnen der Normale für eine Fläche, welche durch vier Punkte definiert ist, posten?

    Melanie



  • Ich muss zugeben jetzt nicht ganz zu wissen was der Solid Modus ist, aber ich meinte eigentlich GL_QUAD_STRIP (oder hatl GL_TRIANGLE_STRIP) 😉



  • Sorry ... mit Solid Modus meine ich einfach die gefüllte Darstellung ...



  • Na also, dann prober mal GL_QUAD_STRIP oder GL_TRIANGLE_STRIP 😉

    Außer deine Objekte sind zu aufwendig um sie damit darzustellen.



  • Guten Morgen an alle,

    ist eigentlich meine Vorgehensweise zur Berechnung und anschließenden Zuordnung der Normalen korrekt?:

    1. Ich ermittle die Normalen für die Punkte
    P1 (0;0),
    P2 (2;0) und
    P3 (2;2).

    2. Diese Normale ordne ich dem Polygon mit den Koordinaten
    //ermittelte Normale aus den Punkten P1, P2 und P3
    glVertex(0,0,0);
    glVertex(2,0,0);
    glVertex(2,2,0);
    glVertex(0,2,0);

    zu. Kann es sein, das ich die Normale in die Mitte des Polygons verschieben muss, um eine korrekte Darstellung zu erhalten?

    Melanie



  • Nein, dass ist nicht notwendig.

    Was allerdings notwendig ist, ist dass du den Normalenvektor zum Einheitsvektor umformst. Allerdings kann das auch OGL für dich übernehmen wenn du glEnable(GL_NORMALIZE) anschaltest.

    Wenn noch bedarf besteht, schreib ich später mal schnell ne Funktion die den Normalenvektor berechnet und ihn auch gleich zum Einheitsvektor macht, werd ich auch bald benötigen 🙂

    So, jetzt muss ich aber in die Uni...



  • Ich glaube das Problem ist, dass OpenGL mit nur einem Normalenvektor pro Polygon nicht dazu zu bewegen ist, Gouraud-Shading anzuwenden. Dazu benötigt man, so viel ich weiß, pro Vertice einen Normalenvektor. (siehe auch: http://www.tecchannel.de/hardware/426/0.html) Wie man den allerdings bekommt (vielleicht über den Mittelwert der Norm. Vektoren der angrenzenden Polygone) hab ich noch nicht programmiert.

    @FireYourGuns: nicht nötig, hier eine Klasse für einen 3-dimensionalen Vektor mit Methoden, um ihn zum Normalenvektor zweier anderer Vektoren zu machen (ich weiss, ist ein bisschen schlampig geworden, aber den Zweck erfüllts):

    class MATHVECTOR
    {
        public:
            float x;
            float y;
            float z;
    
            MATHVECTOR();
            inline void Cross(MATHVECTOR &va, MATHVECTOR &vb);
            inline void CutLength();
            inline MATHVECTOR operator=(MATHVECTOR &v)
            {
                x = v.x;
                y = v.y;
                z = v.z;
                return *this;
            }
    };
    

    Implementiert dann so:

    void MATHVECTOR::Cross(MATHVECTOR &va, MATHVECTOR &vb)
    {
        x = ((va.y * vb.z)-(va.z * vb.y));
        y = ((va.z * vb.x)-(va.x * vb.z));
        z = ((va.x * vb.y)-(va.y * vb.x));
    };
    
    void MATHVECTOR::CutLength()
    {
        float len;
        len = (float)sqrt(x*x + y*y + z*z);
        x /= len;
        y /= len;
        z /= len;
    };
    

    Grüße,
    FellaR



  • Wäre echt nett, wenn du das machen würdest ...



  • LOL



  • Melanie Schmidt schrieb:

    Könnte vieleicht mal jemand eine Funktion zum Berechnen der Normale für eine Fläche, welche durch vier Punkte definiert ist, posten?

    Es gab doch schonmal jemanden, der sich "Anne" nannte, und ein ähnliches Problem hatte... möglicherweise dieselbe Person. Man denkt sich wohl, dass Frauen hier besser geholfen wird... 😃



  • TomasRiker schrieb:

    Man denkt sich wohl, dass Frauen hier besser geholfen wird... 😃

    Ich glaub, du hast ein "n" vergessen.



  • Cool ... wo kann ich den Beitrag von Anne finden ... vieleicht liegt ja da auch die Lösung zu meinem Problem!?!


Log in to reply