Zwei Oberflächen-Rundungen kombinieren
- Schrompf
- Moderator
- Beiträge: 5323
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Zwei Oberflächen-Rundungen kombinieren
Moin,
mal wieder ein Problem bei meinem Surface-Generator, an dem ich mir die Zähne ausbeiße. Ich kann Kanten runden, indem ich die Normale und eine Versatztiefe abhängig zur Nähe des Randes überblende:
Im Bild nur eine Half Edge, die an der Stelle halt bis 45° krümmt und erwartet, dass das andere Element sie dort deterministisch trifft. Ich berechne für jede Kante die Halbnormale plump als Mischung der beiden Quad-Normalen, und einen daraus resultierenden Versatz. Dadurch hebt sich die Oberfläche an, je näher man zur Kante kommt, und die Krümmung ergibt sich. Das klappt.
Das Problem sind jetzt die Ecken. Für jede Ecke berechne die Summennormale aller anliegenden Quads, und ebenso einen durchschnittlichen Versatz. Das Problem ist jetzt die Oberfläche nahe einer Ecke, wo sich die Einflüsse zweier Kanten überlagen. Ich versuche das auch mal zu zeichnen.
Der Corner Case:
Das soll ein Würfel sein. Von links nach rechts die orange Kante gibt eine (in diesem Beispiel 45°) Krümmung vor. Innerhalb des Krümmungsradius der Ecke wird die Krümmung noch zusätzlich zur Ecke abgeknickt. Das klappt, die Punkte genau auf der Kante verlaufen exakt wie gewollt.
Von schräg oben zur Ecke hin die blaue Kante hat ebenso 45° Krümmung und knickt kurz vor der Ecke zusätzlich in die Eck-Krümmung ab. Auch das klappt.
Das Problem sind die Punkte in der Nähe, zum Beispiel das kleine Kreuz. Da hat man so ein bissl Einfluss der Orange-Kante und ein bissl Einfluss der Blau-Kante. Eine Kante für sich allein hat da halt nur so einen halben Versatz. Die andere Kante hat da auch so einen halben Versatz. Mische ich beide Versätze, kommt da halt so ein halber Versatz zustande. Aber nach Pythagoras müsste dort halt ein bisschen mehr als halber Versatz wirken.
Das Ergebnis ist, dass es mir in diesen Übergangsbereichen nahe Ecken die Oberfläche anhebt (nicht genug senkt).
Der Edge Case:
Besser sichtbar wird es bei durchgehenden Kanten. Hier haben wir zwei Würfel aneinander, die orange Kante würde theoretisch glatt durchgehen. Aber da ist noch die blaue Kante. Ich habe deren Krümmung mal anzudeuten versucht: hinten gar keine Krümmung, vorne in der Nähe zur Ecke dann abknickend zu ner 45°-Krümmung. Mathematisch sauber, exakt auf der Kante passt das auch.
Aber wieder sind die Punkte in der Umgebung der Ecke das eigentliche Problem. Da zaubert die orange Kante ne saubere 45°-Krümmung hin. Aber dann wird der Einfluss der blauben Kante mit reingerechnet, und die hat halt Null Krümmung. Mit dem Ergebnis, dass es mir wieder den Versatz "verwässert", also zu wenig Versatz liefert. Da hebt sich dann wieder die Oberfläche an, und das sieht echt komisch aus:
Hat jemand ne Idee? Wie könnte ich die Wirkung zweier Kanten verrechnen, so dass sich überall nahe der Ecken der korrekte Versatz ergibt? Oder gibt's irgendne andere Art, wie ich Krümmung darstellen könnte, so dass ich sie sinnvoll interpolieren könnte?
Die KI meint, es gibt kein richtiges Maß für "Curvature". Man würde die Oberflächennormale interpolieren. Das habe ich auch schon gemacht, und für Kanten funktioniert das super. Bei Ecken aber versagt es schnell. Denn um den Versatz aus einer Normale zu berechnen, muss man die Normale gegen die unausgelenkte Flächennormale rechnen. Und das geht an einfachen Ecken gut, wo die Normale exakt in der Mitte zwischen allen Flächennormalen liegt. An ner komplexen Ecke wie im Screenshot rechts unten ergibt sich je nach Fläche ein anderer Versatz an der Ecke, und es reisst die Flächen auseinander.
mal wieder ein Problem bei meinem Surface-Generator, an dem ich mir die Zähne ausbeiße. Ich kann Kanten runden, indem ich die Normale und eine Versatztiefe abhängig zur Nähe des Randes überblende:
Im Bild nur eine Half Edge, die an der Stelle halt bis 45° krümmt und erwartet, dass das andere Element sie dort deterministisch trifft. Ich berechne für jede Kante die Halbnormale plump als Mischung der beiden Quad-Normalen, und einen daraus resultierenden Versatz. Dadurch hebt sich die Oberfläche an, je näher man zur Kante kommt, und die Krümmung ergibt sich. Das klappt.
Das Problem sind jetzt die Ecken. Für jede Ecke berechne die Summennormale aller anliegenden Quads, und ebenso einen durchschnittlichen Versatz. Das Problem ist jetzt die Oberfläche nahe einer Ecke, wo sich die Einflüsse zweier Kanten überlagen. Ich versuche das auch mal zu zeichnen.
Der Corner Case:
Das soll ein Würfel sein. Von links nach rechts die orange Kante gibt eine (in diesem Beispiel 45°) Krümmung vor. Innerhalb des Krümmungsradius der Ecke wird die Krümmung noch zusätzlich zur Ecke abgeknickt. Das klappt, die Punkte genau auf der Kante verlaufen exakt wie gewollt.
Von schräg oben zur Ecke hin die blaue Kante hat ebenso 45° Krümmung und knickt kurz vor der Ecke zusätzlich in die Eck-Krümmung ab. Auch das klappt.
Das Problem sind die Punkte in der Nähe, zum Beispiel das kleine Kreuz. Da hat man so ein bissl Einfluss der Orange-Kante und ein bissl Einfluss der Blau-Kante. Eine Kante für sich allein hat da halt nur so einen halben Versatz. Die andere Kante hat da auch so einen halben Versatz. Mische ich beide Versätze, kommt da halt so ein halber Versatz zustande. Aber nach Pythagoras müsste dort halt ein bisschen mehr als halber Versatz wirken.
Das Ergebnis ist, dass es mir in diesen Übergangsbereichen nahe Ecken die Oberfläche anhebt (nicht genug senkt).
Der Edge Case:
Besser sichtbar wird es bei durchgehenden Kanten. Hier haben wir zwei Würfel aneinander, die orange Kante würde theoretisch glatt durchgehen. Aber da ist noch die blaue Kante. Ich habe deren Krümmung mal anzudeuten versucht: hinten gar keine Krümmung, vorne in der Nähe zur Ecke dann abknickend zu ner 45°-Krümmung. Mathematisch sauber, exakt auf der Kante passt das auch.
Aber wieder sind die Punkte in der Umgebung der Ecke das eigentliche Problem. Da zaubert die orange Kante ne saubere 45°-Krümmung hin. Aber dann wird der Einfluss der blauben Kante mit reingerechnet, und die hat halt Null Krümmung. Mit dem Ergebnis, dass es mir wieder den Versatz "verwässert", also zu wenig Versatz liefert. Da hebt sich dann wieder die Oberfläche an, und das sieht echt komisch aus:
Hat jemand ne Idee? Wie könnte ich die Wirkung zweier Kanten verrechnen, so dass sich überall nahe der Ecken der korrekte Versatz ergibt? Oder gibt's irgendne andere Art, wie ich Krümmung darstellen könnte, so dass ich sie sinnvoll interpolieren könnte?
Die KI meint, es gibt kein richtiges Maß für "Curvature". Man würde die Oberflächennormale interpolieren. Das habe ich auch schon gemacht, und für Kanten funktioniert das super. Bei Ecken aber versagt es schnell. Denn um den Versatz aus einer Normale zu berechnen, muss man die Normale gegen die unausgelenkte Flächennormale rechnen. Und das geht an einfachen Ecken gut, wo die Normale exakt in der Mitte zwischen allen Flächennormalen liegt. An ner komplexen Ecke wie im Screenshot rechts unten ergibt sich je nach Fläche ein anderer Versatz an der Ecke, und es reisst die Flächen auseinander.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- TomasRiker
- Establishment
- Beiträge: 124
- Registriert: 18.07.2011, 11:45
- Echter Name: David Scherfgen
- Wohnort: Hildesheim
Re: Zwei Oberflächen-Rundungen kombinieren
Mein Rat wäre, für jeden gesampelten Punkt zu schauen, ob er am nächsten an einer Kante oder an einem Eckpunkt liegt, und dann die Fälle separat zu behandeln (sofern Mindestdistanz = Rundungsradius unterschritten, ansonsten nix tun). Das ist sauberer als irgendwie Normalen und Versätze zu mischen und wird dir vermutlich bessere Ergebnisse bringen.
Und natürlich musst du "fake" Ecken und Kanten ignorieren. Also innere Ecken und Kanten, die z. B. zwischen zwei direkt aneinander liegenden Würfeln vorkommen.
Und natürlich musst du "fake" Ecken und Kanten ignorieren. Also innere Ecken und Kanten, die z. B. zwischen zwei direkt aneinander liegenden Würfeln vorkommen.
- Schrompf
- Moderator
- Beiträge: 5323
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Zwei Oberflächen-Rundungen kombinieren
Hm. Die Nicht-Krümmungs-Kanten zu ignorieren würde zumindest die einfachen Kanten fixen. Die Ecken krieg ich damit aber nicht hin. Was ich machen könnte, wäre "dominante Kante".
[edit] Neee, leider nicht. Damit habe ich die geraden Kanten zwischen Würfeln gefixt, aber dafür an anderen Ecken Risse bekommen. Siehe hier:
Und wenn ich nur Null-Krümmungen ignoriere, aber die Endpunkte von Kanten behalte, dann krieg ich wieder die bekannten Muster.
[edit] Neee, leider nicht. Damit habe ich die geraden Kanten zwischen Würfeln gefixt, aber dafür an anderen Ecken Risse bekommen. Siehe hier:
Und wenn ich nur Null-Krümmungen ignoriere, aber die Endpunkte von Kanten behalte, dann krieg ich wieder die bekannten Muster.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- TomasRiker
- Establishment
- Beiträge: 124
- Registriert: 18.07.2011, 11:45
- Echter Name: David Scherfgen
- Wohnort: Hildesheim
Re: Zwei Oberflächen-Rundungen kombinieren
Was spricht denn dagegen, Ecken und Kanten getrennt zu behandeln?
- Schrompf
- Moderator
- Beiträge: 5323
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Zwei Oberflächen-Rundungen kombinieren
Das tue ich schon, denke ich. Ich meine, es ist eine Art Shader, der da über die Oberfläche läuft und anhand der vorher ermittelten Ecken und Kanten halt Krümmung einzieht. Da passiert bereits verschiedene Mathematik, je nachdem ob es null, eine oder zwei Kanten sind, die Einfluss nehmen. Und der 2-Kanten-Teil ist halt das Problem.
Oder Du meinst, den Eckteil zu erkennen und da irgendeine nicht-auf-Kanten-basierende Technik anzuwenden? Hm. Darüber muss ich nachdenken.
Oder Du meinst, den Eckteil zu erkennen und da irgendeine nicht-auf-Kanten-basierende Technik anzuwenden? Hm. Darüber muss ich nachdenken.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- TomasRiker
- Establishment
- Beiträge: 124
- Registriert: 18.07.2011, 11:45
- Echter Name: David Scherfgen
- Wohnort: Hildesheim
Re: Zwei Oberflächen-Rundungen kombinieren
Ich formuliere es nochmal anders und detaillierter, hoffentlich kommt meine Idee dann klarer rüber.
Bei jedem Punkt, für den du die Verschiebung bestimmen möchtest, schaust du, ob er am nächsten an einer Kante oder an einer Ecke liegt, und ob die Distanz kleiner ist als dein Radius.
Wenn der Punkt am nächsten an einer Kante liegt: Projiziere den Punkt auf einen Zylinder, der parallel zur Kante verläuft (entgegen der Kantennormale nach innen geschoben).
Wenn der Punkt am nächsten an einer Ecke liegt: Projiziere den Punkt auf eine Kugel (entgegen der Eckennormale nach innen geschoben).
Deine gewünschte gerundete Geometrie kannst du dir ja im Prinzip vorstellen wie Zylinder entlang der Kanten und Kugeln an den Ecken. Wie weit man diese genau nach innen schieben muss, darüber müsste man noch genauer nachdenken ...
Bei besonders spitzen Winkeln könnte es tricky werden. Hast du nur 90°-Winkel?
Bei jedem Punkt, für den du die Verschiebung bestimmen möchtest, schaust du, ob er am nächsten an einer Kante oder an einer Ecke liegt, und ob die Distanz kleiner ist als dein Radius.
Wenn der Punkt am nächsten an einer Kante liegt: Projiziere den Punkt auf einen Zylinder, der parallel zur Kante verläuft (entgegen der Kantennormale nach innen geschoben).
Wenn der Punkt am nächsten an einer Ecke liegt: Projiziere den Punkt auf eine Kugel (entgegen der Eckennormale nach innen geschoben).
Deine gewünschte gerundete Geometrie kannst du dir ja im Prinzip vorstellen wie Zylinder entlang der Kanten und Kugeln an den Ecken. Wie weit man diese genau nach innen schieben muss, darüber müsste man noch genauer nachdenken ...
Bei besonders spitzen Winkeln könnte es tricky werden. Hast du nur 90°-Winkel?
- Schrompf
- Moderator
- Beiträge: 5323
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Zwei Oberflächen-Rundungen kombinieren
Ne, auch paar diskrete andere. Aber so in der Richtung grübele ich auch gerade: "freie Fläche" und "nahe einer Kante" funktionieren bereits, nur der "nahe zwei Kanten"-Fall scheitert. Und wenn ich den erkenne und als Quad-Interpolation getrennt behandle, kriege ich wahrscheinlich eine geschlossene konsistente Oberfläche hin.
Ich projeziere aber nicht auf Kugeln oder Zylinder, sondern habe ich mir eine Formel ausgearbeitet, die allein die Differenz zwischen örtlicher Normale und Flächennormale nimmt.
Ich projeziere aber nicht auf Kugeln oder Zylinder, sondern habe ich mir eine Formel ausgearbeitet, die allein die Differenz zwischen örtlicher Normale und Flächennormale nimmt.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Schrompf
- Moderator
- Beiträge: 5323
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Zwei Oberflächen-Rundungen kombinieren
Hast Du / Habt ihr ne Idee, wie ich die Interpolation an Ecken hinkriegen könnte? Ich nehm nochmal fix mein Bild von oben und konstruiere darin das Interpolations-Gebiet.
Hier soweit klar: A ist die Ecke, die ist gegeben. Von da aus die beiden Kanten zurück um jeweils Krümmungsradius und ich habe B und C. D ist jetzt die Vervollständigung des Quadrats. Für den rechteckigen Fall supi, aber ich hab leider auch spitze Winkel hier und da:
Ich krieg die Interpolation sicher auch über ein Parallelogramm hin, hab ich irgendwann schonmal gemacht und die KI kriegt sowas sicher auch hin. Aber ich glaube, ich will das dort gar nicht. Das wird doch übelst langgezogen und gequetscht.
Gleichzeitig bin ich sicher, dass ich nicht einfach den geometrischen Abstand haben will. Das wär ein Kreis rund um die Ecke.
Habt ihr irgendne Idee, wie man das sonst noch angehen könnte?
In der Zwischenzeit versuch ich mal den plumpen Pythagoras. Am Ende sieht das gar nicht so übel aus. Und ich brauch je eh am Ende nur ne kontinuierliche geschlossene Oberfläche für weitere Shader und Offsets.
Hier soweit klar: A ist die Ecke, die ist gegeben. Von da aus die beiden Kanten zurück um jeweils Krümmungsradius und ich habe B und C. D ist jetzt die Vervollständigung des Quadrats. Für den rechteckigen Fall supi, aber ich hab leider auch spitze Winkel hier und da:
Ich krieg die Interpolation sicher auch über ein Parallelogramm hin, hab ich irgendwann schonmal gemacht und die KI kriegt sowas sicher auch hin. Aber ich glaube, ich will das dort gar nicht. Das wird doch übelst langgezogen und gequetscht.
Gleichzeitig bin ich sicher, dass ich nicht einfach den geometrischen Abstand haben will. Das wär ein Kreis rund um die Ecke.
Habt ihr irgendne Idee, wie man das sonst noch angehen könnte?
In der Zwischenzeit versuch ich mal den plumpen Pythagoras. Am Ende sieht das gar nicht so übel aus. Und ich brauch je eh am Ende nur ne kontinuierliche geschlossene Oberfläche für weitere Shader und Offsets.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Schrompf
- Moderator
- Beiträge: 5323
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Zwei Oberflächen-Rundungen kombinieren
Pythagoras war für'n Arsch:
Das hier ist jetzt ne Selektionsfunktion, die die höhere Auslenkung gewinnen lässt, sonst wär's noch übler. Der Verlauf der Gewichtung auf so eine Eck-Kugel hin ist halt auf die völlig falsche Art nichtlinear.
Parallelogramm könnte aber funktionieren, überlege ich mir so, weil es zumindest entlang der Kanten die etablierte Kontinuität hat und dazwischen hoffentlich irgendwas halbwegs Glaubwürdiges.
Das hier ist jetzt ne Selektionsfunktion, die die höhere Auslenkung gewinnen lässt, sonst wär's noch übler. Der Verlauf der Gewichtung auf so eine Eck-Kugel hin ist halt auf die völlig falsche Art nichtlinear.
Parallelogramm könnte aber funktionieren, überlege ich mir so, weil es zumindest entlang der Kanten die etablierte Kontinuität hat und dazwischen hoffentlich irgendwas halbwegs Glaubwürdiges.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.