Interpolation von Normalen bei Dreiecken



  • Hi,
    der Titel verdeutlicht im Grunde schon das Problem. Ich habe ein Dreieck mit 3 Ecken ( 😉 ) und den entsprechenden 3 Normalen. Jetzt möchte ich für jeden beliebigen Punkt p auf dem Dreieck die liniear interpolierte zugehörige Normale.
    Google spuckt mir nun 1000 Seiten aus, wo steht, dass beim Phong Shading die Normale linear interpoliert wird, und wie man dann pro Pixel weiter rechnet.
    Wohl weil das, wenn man nicht gerade einen Raytracer schreibt, automatisch die Grafikkarte gemacht hat wenn man im Fragment Shader lustige Sachen mit der Normale machen will.
    Achso, im Flipcodeforum stand dann doch was, jedoch funktioniert das nicht.
    Der Code ist folgendermaßen:

    vector3 Triangle::getNormal(const vector3& pos) {
    	vector3 ab = p2 - p1;
    	vector3 ac = p3 - p1;
       vector3 ap = pos - p1;
    	float area  = CrossProduct(ab, ac).length();
    	float gamma = CrossProduct(ab, ap).length() / area;
    	float beta  = CrossProduct(ap, ac).length() / area;
    	float alpha = 1.0f - beta - gamma;
    
    	vector3 normal = ( n1 * alpha ) + ( n2 * beta ) + ( n3 * gamma );
    	return normal.normalize();
    }
    

    Vielleicht war ich aber auch nur zu blöd ihn anzupassen, da das hier die angepasste Version ist, könntet ihr mich dann ja, falls es euch auffallen sollte, auch darauf hinweisen.
    Ich verstehe übrigens nichts davon. Falls jemand weiß wie es geht, dann bitte langsam erklären (oder Code her) 😃



  • Ein Dreieck hat an allen drei Ecken die gleiche Normale. Was gibts da zu interpolieren?

    Bye, TGGC Deine Unterstützung wird gebraucht!


  • Mod

    spl@t schrieb:

    vector3 Triangle::getNormal(const vector3& pos) {
          //für die beiden kanten die zum punkt p1 führen
          //die richtungsvectoren errechnen
    	vector3 ab = p2 - p1;
    	vector3 ac = p3 - p1;
          //richtungsvector zum punkt auf dem triangle errechnen
          vector3 ap = pos - p1;
          //fläche auf dem gesammten dreieck errechnen
    	float area  = CrossProduct(ab, ac).length();
          //den anteil der fläche errechnen die die punkte p1, p2, pos bilden
    	float gamma = CrossProduct(ab, ap).length() / area;
          //den anteil der fläche errechnen die die punkte p3, p1, pos bilden
    	float beta  = CrossProduct(ap, ac).length() / area;
          //den anteil der fläche errechnen die die punkte p3, p2, pos bilden,
          //was natürlich der rest vom dreieck ist, also 1-flächegamme-flächebeta
    	float alpha = 1.0f - beta - gamma;
    
          //gewichtete anteile der normalen errechnen und zusammenaddieren
    	vector3 normal = ( n1 * alpha ) + ( n2 * beta ) + ( n3 * gamma );
          //normalisieren, da bei der interpolation die länge nicht 1 bleibt
    	return normal.normalize();
    }
    

    schaut auf den ersten blick richtig aus.

    rapso->greets();



  • Ist es auch. Ich war einfach zu blöd 3 mal 3 floats richtig aufzuschreiben 😡

    Aber der Thread war trotzdem nicht sinnlos, immerhin weiß ich jetzt, was der Code macht. Danke dafür. (weiß bloß nicht was das Kreuzprodukt mit Flächen zu tun hat - ich kannte bis jetzt nur die Verwendung bei rechten Winkeln und senkrechten Vektoren dazu)



  • TGGC schrieb:

    Ein Dreieck hat an allen drei Ecken die gleiche Normale. Was gibts da zu interpolieren?

    Bye, TGGC Deine Unterstützung wird gebraucht!

    Das glaub ich nicht, Tim.
    Wär nicht gerade sinnvoll je nach Mesh..



  • spl@t schrieb:

    (weiß bloß nicht was das Kreuzprodukt mit Flächen zu tun hat - ich kannte bis jetzt nur die Verwendung bei rechten Winkeln und senkrechten Vektoren dazu)

    a) Du baust Deine "Fläche" (Dreieck) auf 2 Vektoren auf
    b) Du willst die Normale (=Senkrechte) zur Fläche haben

    Also passt doch alles!? 😕



  • durito schrieb:

    TGGC schrieb:

    Ein Dreieck hat an allen drei Ecken die gleiche Normale. Was gibts da zu interpolieren?

    Bye, TGGC Deine Unterstützung wird gebraucht!

    Das glaub ich nicht, Tim.
    Wär nicht gerade sinnvoll je nach Mesh..

    Ein Dreieck liegt per Definition in einer Ebene. Und die hat natürlich nur eine Normale. Glauben kannst du in der Kirche.

    BTW: Wer ist Tim?

    Bye, TGGC Deine Unterstützung wird gebraucht!



  • TGGC schrieb:

    durito schrieb:

    TGGC schrieb:

    Ein Dreieck hat an allen drei Ecken die gleiche Normale. Was gibts da zu interpolieren?

    Bye, TGGC Deine Unterstützung wird gebraucht!

    Das glaub ich nicht, Tim.
    Wär nicht gerade sinnvoll je nach Mesh..

    Ein Dreieck liegt per Definition in einer Ebene. Und die hat natürlich nur eine Normale. Glauben kannst du in der Kirche.

    BTW: Wer ist Tim?

    Bye, TGGC Deine Unterstützung wird gebraucht!

    soso.. 🙂
    Wer sagt denn, dass die Normale normal zur Ebene des Dreiecks stehen muss? Wenn sie normal zum Mesh steht (sinnvollerweise), dann macht auch das interpolieren der Normalen Sinn (phong)..



  • durito schrieb:

    soso.. 🙂
    Wer sagt denn, dass die Normale normal zur Ebene des Dreiecks stehen muss? Wenn sie normal zum Mesh steht (sinnvollerweise), dann macht auch das interpolieren der Normalen Sinn (phong)..

    pah, neumodisches zeug. flat shading ist dir wohl nicht fein genug, hm? hast wohl was gegen den discokugel look bei runden flächen?

    aber es ist ja auch ein wenig befremdlich, daß die normalen bei einem dreieck meistens in alle richtungen stehen, nur nicht senkrecht ,-)



  • Trienco schrieb:

    pah, neumodisches zeug.

    Ne, 1975 :p 🤡



  • Trienco schrieb:

    durito schrieb:

    soso.. 🙂
    Wer sagt denn, dass die Normale normal zur Ebene des Dreiecks stehen muss? Wenn sie normal zum Mesh steht (sinnvollerweise), dann macht auch das interpolieren der Normalen Sinn (phong)..

    pah, neumodisches zeug. flat shading ist dir wohl nicht fein genug, hm? hast wohl was gegen den discokugel look bei runden flächen?

    aber es ist ja auch ein wenig befremdlich, daß die normalen bei einem dreieck meistens in alle richtungen stehen, nur nicht senkrecht ,-)

    He ich kann auch nix dafür, dass die heute in der real world alles so rund bauen 😃
    Discokugeln liegen im Sterben, die Zukunft gehört Ford Ka &Co..



  • spl@t schrieb:

    [...] wo steht, dass beim Phong Shading die Normale linear interpoliert wird [...]

    Ich dachte eigentlich dass daraus hervor gehen würde, dass ich eine Art Phong Shading machen will. War vielleicht etwas undeutlich.

    Trienco schrieb:

    durito schrieb:

    soso.. 🙂
    Wer sagt denn, dass die Normale normal zur Ebene des Dreiecks stehen muss? Wenn sie normal zum Mesh steht (sinnvollerweise), dann macht auch das interpolieren der Normalen Sinn (phong)..

    pah, neumodisches zeug. flat shading ist dir wohl nicht fein genug, hm? hast wohl was gegen den discokugel look bei runden flächen?

    aber es ist ja auch ein wenig befremdlich, daß die normalen bei einem dreieck meistens in alle richtungen stehen, nur nicht senkrecht ,-)

    😃

    Sgt. Nukem schrieb:

    spl@t schrieb:

    (weiß bloß nicht was das Kreuzprodukt mit Flächen zu tun hat - ich kannte bis jetzt nur die Verwendung bei rechten Winkeln und senkrechten Vektoren dazu)

    a) Du baust Deine "Fläche" (Dreieck) auf 2 Vektoren auf
    b) Du willst die Normale (=Senkrechte) zur Fläche haben

    Also passt doch alles!?

    Äh, aber in diesem Fall ist doch kein senkrechter Vektor gesucht - bloß die Fläche eines Teildreiecks. Anscheinend kommt beim Kreuzprodukt ein längerer Vektor raus, wenn die beiden Ausgangsvektoren länger sind. Dann würde ich das auch verstehen, aber selbst drauf gekommen wäre ich nicht.
    Naja, das nächste mal dann 💡


  • Mod

    naja, wirst du irgendwann in der schule schon lernen dass die länge des normalenvectors eine fläche angibt. 😉

    rapso->greets();

    da nun alles geklärt ist und sonst nur alle auf TGGCs provokation anspringen... ->geschlossen


Anmelden zum Antworten