Seite 1 von 1

"Relief" bzw. Heighmap Metaballs

Verfasst: 05.10.2015, 19:02
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.

Re: "Relief" bzw. Heighmap Metaballs

Verfasst: 07.10.2015, 17:26
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).

Re: "Relief" bzw. Heighmap Metaballs

Verfasst: 07.10.2015, 18:06
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.

Re: "Relief" bzw. Heighmap Metaballs

Verfasst: 08.10.2015, 21:06
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.