Ich habe mich zwischenzeitlich nochmal ein wenig mit Bezierpatches (bzw. mit Möglichkeiten, deren Kontrollpunkte bei Aneinanderreihung zu bestimmen) befasst.
Da lt. Schrompf seine Normalen-Kontinuität ja noch nicht ganz gelöst ist, poste ich meine Ergebnisse auch nochmal hier.
Erst nochmal die Grundlage: ein Bezier-Patch benötigt 16 Kontrollpunkte. Ich unterscheide hier die Vertices K1 (grün, 4x), die Kantentangentenpunkte K2 (blau, 8x) sowie deren Tangentenpunkte K3 (rot, 4x). K2- und K3-Punkte "gehören" jeweils zu einem Vertex (K1).
Konstruktionsgedanke bei benachbarten Patches:
- die gemittelte Normale eines K1-Vertex bildet eine Ebene (im Folgenden "die Ebene" meint immer diese)
- die K3-Punkte aller Nachbarn zu diesem Vertex bilden ein N-Gon (bei N zusammenstoßenden Flächen am Vertex) auf dieser Ebene.
- die K2-Punkte aller Tangenten zu diesem Vertex liegen auf den Kanten dieses N-Gons.
Hier beispielhaft mit 3 zusammenstoßenden Patches (weiße Kanten); das K3-NGon ist ein Dreieck (rot):
Nun gibt es verschiedene Möglichkeiten, dieses N-Gon zu konstruieren.
Z.B. die angrenzenden Flächenmitten auf die Normalenebene projizieren.
Oder die ursprünglichen Flächennormalen, ausgehend vom Vertex, auf die Ebene projizieren.
Oder die Kantenenden auf die Ebene projizieren und den Mittelpunkt zweier benachbarter Punkte als N-Gon-Ecke benutzen.
Auch wie man die Tangenten bstimmt, bietet mehrere Möglichkeiten.
Seitenmitten des N-Gons. Oder man berechnet sie zuerst, berechnet aus ihnen ein N-Gon, und projiziert die Tangenten-Enden dann auf die N-Gon-Seiten.
Möglichkeiten für Tangenten zuerst:
über die Normale und die Kanten Tangent-Spaces berechnen.
Oder Kantenabschnitte auf die Ebene projizieren.
Hier mal ein Testbeispiel mit Kontrollpunkten die die N-Gon-Bedingungen erfüllen:
Je nachdem wie man die N-Gons skaliert, beeinflusst das das Krümmungsverhalten:
Ob die Normalen an den Kanten wirklich stetig sind, würde erst ein Pixelshader optisch zeigen können.
Wirklich "wasserdicht" in dem Sinne wäre es vermutlich erst, wenn man gegenüberliegende K2-Tangenten auf einer Linie anlegen könnte, ohne die anderen Bedingungen zu zerstören. Bei einer Ecke mit 3 zusammenstoßenden Patches geht das natürlich grundsätzlich nicht.
Mein letztes Statement gilt noch:
Also würde ich auch mal CC ins Auge fassen. Evtl. gewichtetes Average, um Kontrolle über den Grad der Rundung zu bekommen, müsste eigentlich gehen.
(CC == Catmull-Clark-Subdivision)
Also auf erhaltende Ur-Vertices ganz verzichten. Da man hier ebenso die ganzen Nachbarschaftsinformationen benötigt, ist das evtl. sogar weniger Aufwand.