Basierend auf dem von Ihnen bereitgestellten Bild würde ich sagen, dass Sie auf dem richtigen Weg sind, und der nächste Schritt besteht darin, eine gleichmäßige Schattierung des Netzes zu ermöglichen. Derzeit sehen Sie harte Kanten in der Beleuchtung benachbarter Dreiecke, da jedes Dreieck flach schattiert ist. Die Normalen von nur einem der Scheitelpunkte werden für Beleuchtungsberechnungen verwendet, anstatt die Normalen aller drei Scheitelpunkte über die Fläche des Dreiecks zu interpolieren (oder die Beleuchtung an jedem Scheitelpunkt zu interpolieren, je nachdem, ob Sie pro verwenden Pixel- bzw. Scheitelpunktbeleuchtung).
In älteren OpenGL-Implementierungen wird das Aktivieren einer glatten ( Gourard- ) Schattierung mit der folgenden Zeile durchgeführt:
glShadeModel(GL_SMOOTH);
Beachten Sie jedoch, dass dies jetzt zugunsten der programmierbaren Pipeline veraltet ist. Fürchte dich jedoch nicht, da es immer noch funktioniert, wenn du mit einer älteren OpenGL-Bibliothek arbeitest (und es möglicherweise auch in der neuesten Version unterstützt wird; jemand kann mich korrigieren, wenn ich mich irre). Um eine kurze Tangente zu spielen, wird manchmal das Erlernen von OpenGL über den veralteten Sofortmodus bevorzugt, da es etwas einfacher ist als die programmierbare Pipeline.
Wie auch immer, die glatte Schattierung hängt auch davon ab, ob die Normalen Ihrer Scheitelpunkte bei der Untersuchung Ihres Bildes richtig eingestellt sind, was anscheinend bereits geschieht. Wenn sie aus irgendeinem Grund nicht ganz korrekt sind, würde ich diese Antwort gerne aktualisieren, um eine Anleitung zur Berechnung zu geben.
Hoffe das hilft :)
Update: Um die Normalen für die richtige Beleuchtung zu berechnen, können Sie die folgende Regel verwenden: die normal für einen Scheitelpunkt ist gleich dem Durchschnitt der Gesichtsnormalen der Dreiecke ist ein Teil. Die Flächennormale eines Dreiecks wird berechnet, indem das Kreuzprodukt zweier seiner Kanten genommen wird. Also, für eine der Ecken Ihres Netzes:
A-----B
| .`|
| .` |
C`----D
Sie können die Gesichtsnormalen von berechnen ABC
durch Nehmen BA x BC
und die Gesichtsnormalen von BCD
bis durch NehmenBC x BD
. Wenn Sie die beiden resultierenden Vektoren zusammen mitteln und das Ergebnis normalisieren, erhalten Sie die Normalität für B
. Für Eckpunkte in der Mitte des Netzes berechnen und mitteln Sie die Flächennormalen von acht Dreiecken. Beachten Sie, dass dies die Methode ist, die Bobobobo in seiner Antwort angegeben hat. Ich hoffe, dass diese Zusammenfassung eine gute Ergänzung dazu darstellt.
Für diese Art der Berechnung lohnt es sich wirklich, Ihr Netz in einer Half-Edge-Datenstruktur zu speichern . Dies erleichtert das Durchqueren der Dreiecke erheblich und ermöglicht es Ihnen, die Unterteilung und Dezimierung des Netzes zu implementieren, falls Sie es später benötigen.