Vertexnormals Facenormals Smoothing Megathread

  • Ok, ich dachte mir ich mach das Thema gleich mal selber auf.


    @cyso Hier mal ein Beispiel zu deiner Wand:




    Ganz links: flat shading, jede Vertex wird gesplittet und bekomme eine eigene Vertexnormale welche der Ausrichtung der Flächennormale entspricht.

    Mitte links: komplett gesmoothed ohne Winkelbegrenzung, harte Kanten oder ähnliches.

    Die Vertexnormalenrichtung wird interpoliert zwischen den beiden Flächennormalen der angrenzenden Flächen.

    Das Shading der Wand stimmt hier absolut nicht.

    Mitte rechts: hier wurde eine harte Kante definiert an der das shading unterbrochen wird.

    Es passiert im Prinzip das selbe wie ganz links, jedoch auf einzelne Vertics begrenzt.

    Das Shading der restlichen Punkte wird davon nicht beeinträchtigt.

    Ganz rechts: die Vertexnormalen wurden manuell ausgerichtet.

    Hierbei wurden unerwünschte Shadingverläufe, welche durch die Interpolation der benachbarten Flächennormalen entstehen behoben und erwünschte Verläufe sogar noch verstärkt, so das die Sockelleiste wie ein flaches Brett wirkt und eine schön abgerundete Kante erhällt.


    Nachfolgend noch ein paar weitere Beispiele für die Anwendung von Vertexmanipulation zum erzeugen runder Kanten:

      


     



    Weitere Anwendungsgebiete für Vertexmanipulation:



    Gerade bei Zylindrischen Formen mit wenig Unterteilung kommt es beim triangulieren zu einer veränderung des Shading.

    Das liegt daran, das die Flächennormale der Dreiecke zu einem anderen Interpolationsergebnis führt als bei Quads.


    Bei gerader Anzahl an Seiten kann man das Shading auch mittels manueller triangulierung im Zickzack wieder geraderücken:




    Ein weiteres Anwendungsgebiet hatte ich gerade in einem anderen Thread erleutert:



    Da für die Normalmap das Highpoly auf eine einfache Fläche gebacken wurde, im Lowpoly aber zusätzliche Geometrie verwendet wird um das Ganze auch aus steileren Betrachtungswinkeln plastisch wirken zu lassen, würden Shadingunterschiede in der Geometrie das Darstellungsergebnis nur verfälsche.

    Deshalb wurden hier sämtliche Vertexnormalen mit exakt der selben Ausrichtung verwendet, so das es keinerlei Shadingdifferenzen mehr gibt.


    Noch mehr Anwendungsgebiete sind da z.B. alpha planes für Gras und Card trees oder shading für Lowpoly trees.

  • Super beschrieben, vielen Dank das du dir diese Mühe gemacht hast. Die Ergebnisse die durch manipulieren der Vertexnormalen erreicht werden können sind super. Nun habe ich das Problem das Blender mir manchmal diese selbsteingestellten Vektoren überschreibt ohne das ich nachvollziehen kann warum, diese dann wieder nachzujustieren ist eine nervige Arbeit. Hast du dazu eine Idee?

  • Also ich editiere die Vertexnormalen quasi als letzten Schritt vor dem Export des Modells.

    Bis dahin nutze ich ganz normal die anderen Möglichkeiten welche mir das Programm bietet.


    Das ist natürlich je nach Programm verschieden benannt, aber im Grunde ist das Resultat das selbe egal ob ich jetzt in Max unterschiedliche Smoothing groups zuweise oder in anderen Programmen Kanten als hart markiere, den Phong Winkel einstelle oder wie man das auch sonst noch nennen kann.


    Es lassen sich schon ein paar ganz nette Dinge damit realisieren, mal mehr mal weniger sinnvoll:

    Das hier fällt eindeutig in letztere Kategorie, denn mit derartig vielen Unterteilungen lässt sich so ein Wellblech (z.B. für einen Schiffscontainer) auch sehr gut modellieren oder auch als normalmap backen.

    • Offizieller Beitrag

    Ohne Screenshot wird das schwer zu beurteilen sein was da los ist.


    Kenn mich mit Blender nicht aus aber es gibt normalerweise mehre Möglichkeiten wie man die Vertex Normals manipulieren kann.


    1.Man kann das gesamte Objekt auswählen und alles auf Harden stellen.

    Dann wird normalerweise jedes Vertex Normal entsprechend seiner Normal ausgerichtet.

    Dann hast du aber auch alle Vertex Normals auf harden. (Smoothe Smoothinggroups gibts dann nicht mehr.

    Du müsstest dann im Nachgang alles Edges auswählen die Smooth sein sollen und diese kannst du dann auf einen Schlag wieder auf Smooth stellen.

    Resultat= Alle Normals auf einen Nenner bringen, dann Smooth machen was Smooth sein soll.


    2.Du kannst du kannst sicherlich auch alles Vertecies auswählen und dort einen Normal Angle reinhämmern wenn du 90 Grad nimmst, hast du das selbe Resultat wie oben (1)


    Fürs Technische Verständnis möchte ich noch ein paar dinge hinzufügen Kaid hat das ja schon sehr schön erklärt


    1.Du kannst zb einen Cube erstellen (Dein Lowpoly Objekt) diesen Kopierst du einmal und fügst Support Edges hinzu. und stellst die Edge auf beim Highpoly auf Smooth.


    Das ist das selbe als wenn du auf dein Highpoly einen Bevel draufmachst und diesen Cube dann Baken tust. Die Normal sieht dann sehr ähnlich aus.




    Oben Links Lowpoly

    Oben Rechts Highpoly das mit Support Edges und Smoothing Groups erstellt wurde.


    Unten Links Lowpoly das Identisch mit dem Lowpoly oben ist.

    Unten rechts das Highpoly das mit einem Bevel erstellt wurde.


    Man kann den Vertex Bevel auch manipulieren in dem man die Support Edge verschiebt.

    Hier siehst du wie sich die Normals verhalten wenn die Normals so bleibt wie sie ist.



    Hier hab ich die Edge etwas nach unten geschoben und wie du siehst haben sich dadurch auch die Vertex Normals verändert. (Der Winkel ist anderst)


    Grob kann man also sagen das die Vertex Normal durch die Nachbar Edge manipuliert werden kann.

    Daraus ergibt sich auch die Tatsache das Border Edges nicht manipuliert werden können. bzw nur durch einen kleinen Trick.


    Nehmen wir mal du hast ein Raumschiff Modelliert einfacherhalber hast du nur ein halbes Raumschiff das du nun Kopierst und spiegelst.

    Vielleicht hast du die Spiegelung sorgar durch eine Instanz erstellt, das ist ja auch Praktisch denn wenn du auf der Rechten Seite etwas änderst, änderst du es auch auf der Linken Seite.



    Mit Mirror würde das so aussehen:



    Wie du auf dem Screenshot nun sehen kannst, ist die obere Edge nicht Smooth und die Läst sich auch nicht Smoothen weil sie eine Borderedge ist.




    Was du aber tun könntest:

    Du könntest die linke und rechte Seite zusammenfügen, dann oben die Edge Smooth machen und dann die Beiden Objekte wieder trennen. Solange du an der Smooting Groups nichts mehr änderst bleibt die Edge oben Smooth.

    • Offizieller Beitrag

    Für die, die hier nicht wissen worum es geht:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Solche Sachen können natürlich erst nur zum Schluss gemacht werden. Man weis in Grob wie es aussehen könnte, aber irgendwie ist das doch alles murks, wenn man wieder damit anfängt neue linien zu ziehen, damit man bei ein Low Poly Vertices spart.Im Grunde genommen macht man ein High poly und ein low Poly. Mit Data Transfare kann man tricksen, oder man baked eine Normal Texture daraus. Was effizienter ist, weis ich nicht. Dann gibt es ja noch die Chance auf sharp. Damit werden harte Kanten erstellt. Die Abrundung wird dann rund, wenn man vom kraid Bild ausgeht, die Rechte Wand, weil sie von der harte Kante berechnet wird. Ich empfehle mit sharp zu arbeiten, weil es schneller geht, und für runde Kanten zu Beveln. Ich empfehle das nur, weil ich nicht weis, wie Blender die Smoothing Groups, die in DataTransfare eingestellt worden sind, mit exportiert werden. Da kenne ich nur teure Plugins, die das schaffen. Da werden sogenannte Properties mit exportiert (Ich bin aber noch im recht alten Stand, weil Blender 2.79 schon den neuen fbx exporter hat). Ansonsten, wenn es um Harte kanten geht, dann muss der Modifier Edge Split aktiv sein, denn der schneidet entweder automatisch, oder/und nach sharps, die Edges, sodass alle Programme die richtigen Smoothing Groups nochmal selber generieren können. Für die spätere Nachbearbeitung ist das natürlich doof, denn es existieren sogenannte Double Vertices. Wenn dieses Modell in UE4 importiert wird, dann ist es auch wichtig, wie die Normals behandelt werden sollen. Ansonsten schenidet UE4 sogar selber, wie Edge Splitt das Modell, oder es nimmt die Properties die zu Smoothing Groups gehören.

  • Ich habe die Erfahrung gemacht das in Blender ein nachträgliches ändern von Normalvektoren eher schwierig ist und bei komplizierten Meshes die Ergebnisse des Data Transfer Modifier einfach nicht zufriedenstellend sind. In der Regel klappt das manuelle einstellen während dem modellieren für mich zu 95% wunderbar, nur manchmal werden diese Vektoren resetet. Warum und wieso Blender das tut versuche ich noch zu reproduzieren. Wer manuell in Blender seine Vektoren ändern möchte kann dies tun indem er für ein Objekt Autosmooth aktiviert und dann über Mesh/Normals Zugriff auf verschiedene Manipulationswerkzeuge erhält. Am einfachsten ist für mich die Normalvektoren andere Vertices zu kopieren und an gewünschter Stelle zu überschreiben copy/paste. Ich füge z.B. ein zweites Face ein das ich entsprechend ausrichte und kopiere die veränderten Normalvektoren per Hand auf das eigentl. Mesh.



    Da ich aber ein blutiger Anfänger bin gibt es sicher bessere Wege das zu lösen, aber die Ergebnisse und Kontrolle sind super und soviel mehr Arbeit ist das in meinen Augen auch nicht wenn man sich an diese Prozedur einmal gewöhnt hat (sind bei mir 2 Hotkeys ...).

  • Probier doch einfach mal den Edge split modifier aus.

    Manche Funktionen sind einfach Blender intern. Die Exportoptionen musst du nachprüfen. Ich selber wende sie nicht an.

    Entweder bake ich die Normals, "und oder" ich wende einen Edge split an. Das ist durch den ganzen Workflow hindurch, bis in die Engine hinein sicher und es gibt keine Überraschungen.

    Du kannst den edgesplit modifier zur Voransicht in Blender verwenden oder ihn im Export anwenden. (Edit mode STRG E- mark sharp) Häkchen hier rein bei autosmooth.

    Hierbei werden die markierten Edges als hard edges, also doppelt exportiert. Es eignet sich also nicht als Highpoly Option. Im Lowpoly aber sind die so exportierten Edges ein tolles Tool.

  • Vorweg, all eure Tipps sind super!


    Ich möchte an meiner Arbeitsweise nichts verändern, keine Technik bringt mir grafisch bessere Ergebnisse als diese. Der gesamte Workflow passt wunderbar von Blender bis in die Ue4, alles ist so wie es sein sollte. Das Problem ist allein Blender und warum vereinzelte NormalVektoren im Prozess ohne kausalen Hintergrund manchmal überschrieben werden, sonst klappt es in der Regel wunderbar. Hätte ja sein können das jemand die selben Erfahrungen in Blender gemacht hat und mir einen Hinweis geben kann warum es zu diesen Überschreibungen kommt.


    StarCitizen nutzt exakt dieselbe Technik (viell. etwas automatisierter), es gibt keinen Grund für mich anders zu arbeiten weil die Ergebnisse wirklich überzeugen:



    Hier ein Link zu Reddit wo auf die von StarCitizen genutze Techniken eingegangen wird:

    https://www.reddit.com/r/starc…_industry_and_id_love_to/

    • Offizieller Beitrag

    Sleepy Blender macht die Probleme :) und ich finde es sogar logisch, wenn am Modell gefummelt wird und Blender dazu gezwungen ist neue normals zu setzen, da ansonsten die alleinige Darstellung nicht funktionieren könnte. So wie cyso es macht hör ich zum ersten mal. Es könnte eine gute Lösung sein, aber nicht in Blender vorgesehen für die weitere Verarbeitung.

  • So, konnte mein Problem lösen.

    Ich muss die xyz Werte des letzten kopierten Normalvektor im Zwischenspeicher wieder auf Null setzen wenn ich das Mesh weiterbearbeite, das verursacht die Probleme (gibt die Anzeige rechts oben über der Kollektion Namens 'Normals' wo der momentane Speicherinhalt angezeigt wird) - seitdem kommt es zu keinen Überschreibungen mehr bei irgendwelchen anderen Operationen. : )

    Tut mir Leid das ich euch dafür bemüht habe, dabei war es doch so 'logisch'. ;)

    • Offizieller Beitrag

    Mich interessiert dein Workflow. kannst du ein HowTo ins Youtube setzen, oder hier in Wiki als Textform?

    PS: Du kannst dir ein Script schreiben in Python, der dir das vereinfacht. Aber nur wenn du dich damit auskennst. Wenn ich dein Workflow kenne, dann kann ich mich daran versuchen.

  • Werde die Tage ein HowTo für Youtube aufnehmen, melde mich dann hier im Thread wenn es oben ist. An ein Pythonscript habe ich auch schon gedacht, leider bin ich darin nicht fit. Ein Script das mir folgendes erlaubt wäre interessant:


    mit Hotkey

    - Zuerst überprüfen ob AutoSmooth aktiv ist, falls nicht, aktiv setzen

    - Sobald zwei oder mehr Vertices ausgewählt wurden die Vektordaten des zuerst ausgewählten Vertex auf alle weitere Vertices übertragen

    - Anschließend Zwischenspeicher auf 0 setzen


    Toll wäre es auch ein Face auszuwählen, anschließend die Vertices/Edge die man manipulieren möchte und die Daten des FaceNormalVektor auf die Vertices zu übertragen.


    Oder einfach nur die Faces der Fase auszuwählen und die FaceNormalVektoren der benachbarten Faces zu nutzen um die gemeinsam geteilten VertexVektoren zu überschreiben usw.


    Da geht aber jetzt die Fantasie etwas mit mir durch, cool wäre es definitiv.

  • Ich bin aktuell gerade mit ner kleinen Modelling & baking Übung beschäftigt.

    Bild ist WIP und das letzte Stück ganz rechts noch Mid/Highpoly.


    Der Grund warum ich das hier poste?

    Ich war auf der Suche nach einer Möglichkeit Normalmaps für verschiedene LoD Stufen mit der selben Normalmap zu baken.


    Hier jetzt mein Lösungsansatz welcher manipulierte Vertexnormals verwendet:

    links LoD_0 in der mitte LoD_1 und rechts das Midpoly von dem gebaked wurde.

    Die Vertexnormalen des linken Objekts wurden so ausgerichtet, das sie mit denen des rechten übereinstimmen.

    Das sorgt für ein Shading welches trotz unterschiedlicher Geometrie die gleichen Eigenschaften besitzt und somit von der selben Normalmap auf gleiche Weise beeiflusst werden kann.


    Die UVs müssen natürlich auch sorgfältig aufeinander angepasst werden.

    In dem Beispiel hier werden passend zum shading die UVs in 3 inseln gesplittet.

    Gebaked wird mit dem LoD_0 Mesh damit die Projektion besser kontrolliert werden kann.


    Mögliche Einsatzgebiete für derartige Techniken sehe ich vor allem in LoD Modellen, aber auch wenn man versuchen möchte zu starke Aufsplittung der UV Inseln und Vertexsplitting zu verhindern.

    Links die typische Vorgehensweise mit harten Kanten, gesplitteten vertics und abgetrennten UV-Inseln und rechts die von mir genutzte Methode, welche nicht nur etwas Platz auf der UV canvas spart, sondern auch mit weniger Vertexpunkten auskommt, da das Splitten der Vertexpunkte nur an harten Kanten und bei geteilten UVs nötig ist.

    • Offizieller Beitrag

    Ich war auf der Suche nach einer Möglichkeit Normalmaps für verschiedene LoD Stufen mit der selben Normalmap zu baken.

    Versteh ich nicht du tust doch nicht mit der Normalmap baken sondern du bakst doch mit verschiedenen Highpoly Modellen ?


    Warum verwendest du nicht einfach die selbe Normalmap für alle LODs nur aber mit verschiedenen Auflösungen.

  • Sleepy Nein, ich bake einmal das Mid-poly (also lowpoly mit chamfered Edges) auf das LoD_0.

    Ich will aber die selbe Textur auch für das LoD_1 verwenden.


    Normalerweise würde das LoD_0 aber so aussehen wie im letzten Bild auf der linken Seite.

    Ein UV split an allen harten Kanten wäre nötig um die Normals korrekt abzubilden.

    Wenn ich da einfach das LoD_1 mit den selben maps verwende, wären die Zwischenräume zwischen den UV-Inseln plötzlich mit auf der textur zu sehen.


    Hab das mal schnell so gebaked.

    Wie man sieht ist die Darstellung links korrekt, rechts aber durch die veränderte Geometrie komplett unbrauchbar.


    Wenn du das jetzt mal mit der Variante aus meinem letzten Post vergleichst (LoD_test01.jpg), dann wirst du feststellen, das alle beiden LoDs eine brauchbares visuelles Ergebnis erziehlen, obwohl sie unterschiedliche Geometrie besitzen und die selbe Normalmap-Textur benutzen.


    Was Texturauflösung angeht, erledigt das ja die Mipmap automatisch und unabhängig von der LoD stufe.

    Es gibt ja auch die Möglichkeit einem LoD auch andere Texturen/Materialien zuzuweisen, aber das ist im Prinzip das komplette Gegenteil von dem was ich hiermit erreichen möchte.