Berechnen der Normalen von triangle-meshes



  • Hallo zusammen,

    habe schon auf google gesucht aber leider nix passendes gefunden.
    Ich suche einen guten Artikel, der die Problematik beschreibt.
    Kennt jemand von Euch was?

    Grüße



  • Die Normale eines Triangles berechnest Du ueber das Kreuzprodukt zweier Kanten.
    Um runde Oberflaechen darzustellen berechnet man fuer jeden Vertex die durchschnittliche Normale, also den Mittelwert der Normalen aller anliegenden Flaechen.
    Da Objekte aber nicht ausschliesslich rund sind, moechte man "scharfe" Kanten erhalten.
    Man mittelt also nur die Normalen von Flaechen die in einem geeignet kleinen Winkel an der gerade betrachteten Flaeche liegen.

    Je nach Aufbau Deiner Datenstrukturen muessen Vertices ggf dupliziert werden wenn von zwei Triangles eine Vertexposition referenziert wird fuer die aber unterschiedliche Vertexnormalen vorliegen.

    Das Erzeugen der Normalen liegt in der Aufgabe des Artists, darum macht das Erzeugen dieser Daten nur bedingt Sinn.
    Exportiere Dein Mesh doch einfach *mit* Normalen aus der 3D-Software.



  • hellihjb schrieb:

    Die Normale eines Triangles berechnest Du ueber das Kreuzprodukt zweier Kanten.
    Um runde Oberflaechen darzustellen berechnet man fuer jeden Vertex die durchschnittliche Normale, also den Mittelwert der Normalen aller anliegenden Flaechen.
    Da Objekte aber nicht ausschliesslich rund sind, moechte man "scharfe" Kanten erhalten.
    Man mittelt also nur die Normalen von Flaechen die in einem geeignet kleinen Winkel an der gerade betrachteten Flaeche liegen.

    Das sind praktisch alle Informationen, die ich gesucht habe.
    Ist das immer die gleich Vorgehensweise zur Berechnung der Normalen?

    hellihjb schrieb:

    Exportiere Dein Mesh doch einfach *mit* Normalen aus der 3D-Software.

    Das lässt der Prof. nicht gelten 🤡



  • Ist das immer die gleich Vorgehensweise zur Berechnung der Normalen?

    Das ist eine moegliche Form der Automatisierung die auch in praktisch jeder 3D-Software angeboten wird.

    Eine andere Vorgehensweise ist, zusammenhaengende Triangles die eine runde Oberflaeche bilden sollen zu sogenannten "Smoothing Groups" zusammenzufassen.
    Das ist ein manueller Vorgang und wird angewendet wenn ein einzelner Winkel-Schwellwert nicht zum gewuenschten Ergebnis fuehrt.
    Diese zusaetzliche Information kann nahezu kostenlos gespeichert werden weil die Triangles nur in mehreren Gruppen abgelegt werden muessen. Ein klassischer Vertreter dieser Kodierung ist zB das .3ds-Format.
    Die Vertexnormale ergibt sich dann indem man beim Mitteln nur die Flaechen der jeweiligen Gruppe betrachtet.

    Darueber hinaus hat man in diversen 3D-Paketen die Moeglichkeit, Vertexnormalen quasi beliebig zu veraendern. Diese Information geht natuerlich verloren wenn die Normalen nicht explizit gespeichert werden.



  • Beim Erzeugen der Vertexnormalen muss man ggf noch diverse Sonderfälle, wie z.B. die Tesselierung eines Faces (L-Shape Problem), beachten.



  • Weise einfach ueberall die Normale (1,0,0) zu. Die koennte eventuell auch richtig sein.

    Die Normale ist ja im Prinzip die "Ableitung" eines Punktes auf einer Oberflaeche. Am Rand eines Dreieckes ist die Flaeche aber nicht stetig und es gibt ueberhaupt keine Ableitung. D.h. die Normale ist dort ueberhaupt nicht definiert. Diese Verfahren sind alles nur Rundungsrechnungen fuer die Oberflaeche, welches durch das Trianglemesh aproxximiert wurden. Es gibt aber unendlich viele Oberflaechen, welche durch das gleiche Mesh angenaehert werden koennten. Wer kann also behaupten, das ein Verfahren "richtiger" waere als ein anderes? f'`8k

    Autocogito

    Gruß, TGGC (Was Gamestar sagt...)



  • Danke für Eure Hilfe!

    Eine Frage zu diesem Grenzwinkel habe ich noch.

    hellihjb schrieb:

    Man mittelt also nur die Normalen von Flaechen die in einem geeignet kleinen Winkel an der gerade betrachteten Flaeche liegen.

    Wie ist das, wenn zum Beispiel ein Vertex 4 anliegende Dreiecke enthält?

    Ich verstehe das so:

    Haben die Normalenvektoren aller paarweisen Dreiecke eines Vertices einen geeignet kleinen Winkel, so bildet man den Mittelwertsvektor und weist diesen dem Vertex zu.

    Haben z. B. die Normalen zweier dieser vier Dreiecke eines Vertices einen größeren als den Grenzwinkel, wird dieser gemittelte Normalenvektor von der Berechnung des Mittelwertsvektor ausgenommen.

    Habe ich das so richtig verstanden 😕



  • Liege ich etwa total daneben?



  • Du betrachtest zunaechst jedes einzelne Triangle, ermittelst zu jedem der drei Eckpunkte die anliegenden Triangles und bildest den Mittelwert aller Triangles deren Winkel zum aktuell betrachtetem Triangle kleiner einem Schwellwert ist.
    So erhaelst Du drei Vertex-Normalen pro Triangle und musst ggf Vertices duplizieren wenn fuer deren Position unterschiedliche Normalen vorliegen.



  • Keine weiteren Fragen! Danke!


Anmelden zum Antworten