"Relief" bzw. Heighmap Metaballs

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
dronus
Establishment
Beiträge: 114
Registriert: 11.01.2010, 01:53

"Relief" bzw. Heighmap Metaballs

Beitrag von dronus »

Hallo,


ich versuche gerade (noch ganz am Anfang) effiziente Metaballs, die in einer Ebene liegen zu Rendern. Z.b. eine Oberfläche mit vielen Wassertropfen darauf.

Bisher sieht das wie folgt aus: Die Mittelpunkte aller Tropfen werden mit ihrem Durchmesser als Helligkeit codiert in eine Textur geschrieben. Diese Textur wird jetzt einfach weichgezeichnet, so dass ich eine Art Dichte der Tropfen erhalte.

Da Metaballs ja eine Oberfläche zu einem bestimmten Schwellwert einer Feldstärke sind, beinhaltet diese Textur jetzt praktisch den Querschnitt von dieser Feldstärke in der Oberflächenebene. Wenn ich diese Textur nur mit einem Schwellwert in schwarz / weiss trenne, habe ich schöne 2D-Metaballs.

Jetzt möchte ich aber einen feinen Mesh (erstmal nur flaches Gitter) entsprechend dem Feld zu echten 3D-Strukturen formen. Ein einzelnes, kreisrund auslaufendes Feld soll dabei möglichst wie ein Tropfen ein Kugelstück auf der Oberfläche bilden. Wo das Feld unter dem Schwellwert liegt, bleibt die Oberfläche eben.

Muss ich die Vertices jetzt nur in der Oberflächen-Normalen verschieben, und was für eine Formel braucht man da? Das Feld nimmt ja etwa mit 1/x^2 zum Mittelpunkt einer Kugel ab, die Höhe der Kugeloberfläche über der Grundlage ist aber gerade am Rand sehr steil... Oder macht es vielleicht Sinn, die Vertices auch in anderen Richtungen vom Kugelmittelpunkt weg zu verschieben? Dann könnten ja sogar Unterschneidungen enstehen, so wie Wasser das auf Fett abperlt... wenn man das nicht macht, kann man ja immerhin auch schon bis fast 90 Grad steile Flächen, also fast Halbkugeln erreichen.
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

Re: "Relief" bzw. Heighmap Metaballs

Beitrag von Sternmull »

Wenn ich dich richtig verstehe fehlt dir die Formel um die Oberflächenhöhe abhängig von der Entfernung zum Tropfenzentrum zu berechnen. Das wäre dann sqrt(​1-​x^​2).
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: "Relief" bzw. Heighmap Metaballs

Beitrag von Schrompf »

Hm. Da Du bei Metaballs aber sehr explizit von schlichten Kugeln weg willst, brauchst Du wahrscheinlich eine "lokalere" Formel. Ich würde dazu vorschlagen, den Gradienten der Textur zu berechnen, also die Richtung, in der der Wert am stärksten sinkt.

Ich mag das Problem. Man könnte das ja mit einem zellularen Automaten zu lösen probieren.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
dronus
Establishment
Beiträge: 114
Registriert: 11.01.2010, 01:53

Re: "Relief" bzw. Heighmap Metaballs

Beitrag von dronus »

Ja..

Der Feldwert fällt ja mit f=1/x^2 oder so ab, je nach dem wie korrekt das beim Weichzeichnen-Schritt passiert... dieser Wert hat ja etwas mit der Entfernung vom Zentrum zu tun, wenn man genau eine Kugel hat.

Im Gegensatz dazu steht die Formel von sternmuli, sqrt(​1-​x^​2) . Jetzt kann man aus der 1. Formel wieder x (das ist der Abstand) rausholen: x=sqrt(1/f) und das in sternmulis Formel einsetzen: sqrt(​1-​(sqrt(1/f))^​2) = sqrt(1-1/f). Das f kommt aus der Textur, wenn die korrekt auf 1/x^2 geblurt ist.

Diese Funktion ist erst ab 1 definiert, davor ist man "außerhalb" der Metaballs und zeigt die glatte Oberfläche an. Ab dem Schwellwert 1 steigt sie dann schnell an (das gibt die steile Wand der Kugel) und dann immer flacher (immer mehr Metaballs übereinander an einem Ort ergeben irgendwann kaum noch höhere Plateus).

Klingt irgendwie plausibel :-)

Ich werde das mal so programmieren, mal sehen was passiert...

Zellularer Automat ist auch garnicht falsch, das Weichzeichnen in vielen gleichen Schritten ist ja auch schon einer.
Antworten