Hey,
noch eine Terrainfrage von mir. Wenn ich eine Heighmap hab. Kann ich dann Werte zwischen den einzelnen Punkten interpolieren? Habe ja pro Punkt Tangente und Normale. Irgendwie müsste man das doch durch eine Kurvenfunktion annähren können.
Wenn ja, ist sowas kostengünstig möglich? :)
Terrain "interpolieren"
- dot
- Establishment
- Beiträge: 1734
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: Terrain "interpolieren"
Weiß ich nicht, ob du das kannst. Rein prinzipiell kann man das natürlich ;)Halan hat geschrieben:Wenn ich eine Heighmap hab. Kann ich dann Werte zwischen den einzelnen Punkten interpolieren?
Am einfachsten wär das wohl mit bilinearer Interpolation. Aber man kann's natürlich beliebig kompliziert haben...Halan hat geschrieben:Wenn ja, ist sowas kostengünstig möglich? :)
Re: Terrain "interpolieren"
wie wäre es sonst noch mit Simplex noise oder mit perlin noise? Als 1D-Variante müsste das passen...
- Top-OR
- Establishment
- Beiträge: 330
- Registriert: 02.03.2011, 16:32
- Echter Name: Jens H.
- Wohnort: Esslingen/Dessau
- Kontaktdaten:
Re: Terrain "interpolieren"
Wie dot sagt: Warum macht ihr/du es so kompliziert?
Ich machs einfach (bi)linear anhand der Höhe (Nix Normale und Tangente - die hab ich auch, aber dafür nutz ich sie nicht):
Einfach die 4 Pixel auf der Heightmap finden, "zwischen" welchen wir uns befinden.
Da Interpoliere ich jeweils zwischen den oberen und den unteren Pixeln jeweils linear und dann zwischen diesen beiden neuen Pixeln.
Da das Terrain "zwischen" diesen Pixekl sowieso nur duch ein Quad bzw. 2 Dreiecke dargestellt wird, ist das schon okay.
Anhand dieser Höheninfo setzte ich dann die entsprechenden Nodes/Objekte auf die entsprechende Höhe und das sieht meist okay aus.
Ich machs einfach (bi)linear anhand der Höhe (Nix Normale und Tangente - die hab ich auch, aber dafür nutz ich sie nicht):
Einfach die 4 Pixel auf der Heightmap finden, "zwischen" welchen wir uns befinden.
Da Interpoliere ich jeweils zwischen den oberen und den unteren Pixeln jeweils linear und dann zwischen diesen beiden neuen Pixeln.
Da das Terrain "zwischen" diesen Pixekl sowieso nur duch ein Quad bzw. 2 Dreiecke dargestellt wird, ist das schon okay.
Anhand dieser Höheninfo setzte ich dann die entsprechenden Nodes/Objekte auf die entsprechende Höhe und das sieht meist okay aus.
--
Verallgemeinerungen sind IMMER falsch.
Verallgemeinerungen sind IMMER falsch.
Re: Terrain "interpolieren"
Naja es gibt doch Fälle in denen eine Interpolation Sinn macht. Ich hab mal mit an einem Strategiespiel gearbeitet in dem Einheiten an den Normalen des Geländes ausgerichtet wurden. Ohne Interpolation hatte das zur Folge, dass die Einheiten wenn sie sich bewegten an den Kanten der Faces immer etwas wackelten was nicht schön aussieht.
So jetzt dazu wie wir das gelöst haben. Mittels Quadratischer C1 Splines. Einfach die Position und die Normalen am Rand des Faces linear interpolieren und mit diesen Daten einen Qadratischen C1 Spline berechnen. Somit kann man an jeder Stelle des Faces eine Normale berechnen und hat einigermaßen glatte Übergänge. Kubische C2 Splines wären natürlich schöner brauchen aber länger und benötigen weitere Daten um das Gleichungssystem zu lösen
So jetzt dazu wie wir das gelöst haben. Mittels Quadratischer C1 Splines. Einfach die Position und die Normalen am Rand des Faces linear interpolieren und mit diesen Daten einen Qadratischen C1 Spline berechnen. Somit kann man an jeder Stelle des Faces eine Normale berechnen und hat einigermaßen glatte Übergänge. Kubische C2 Splines wären natürlich schöner brauchen aber länger und benötigen weitere Daten um das Gleichungssystem zu lösen
-
- Beiträge: 73
- Registriert: 22.01.2005, 21:47
- Benutzertext: programmiersüchtig
- Echter Name: Kai Mast
- Wohnort: Freak City
- Kontaktdaten:
Re: Terrain "interpolieren"
Ja mir schon klar dass ich linear interpolieren kann :P Die frage war natürlich ob ich da irgendwie Kurven rein bekomme.Top-OR hat geschrieben:Wie dot sagt: Warum macht ihr/du es so kompliziert?
Einfach die 4 Pixel auf der Heightmap finden, "zwischen" welchen wir uns befinden.
Da Interpoliere ich jeweils zwischen den oberen und den unteren Pixeln jeweils linear und dann zwischen diesen beiden neuen Pixeln.
Da das Terrain "zwischen" diesen Pixekl sowieso nur duch ein Quad bzw. 2 Dreiecke dargestellt wird, ist das schon okay.
Anhand dieser Höheninfo setzte ich dann die entsprechenden Nodes/Objekte auf die entsprechende Höhe und das sieht meist okay aus.
Die Bicubic interpolation is ja genau für meinen Fall. Werde mir das mal anschauen. Danke :)
Zuletzt geändert von Halan am 30.08.2011, 18:25, insgesamt 1-mal geändert.
Blog: http://mohoho.de
-
- Beiträge: 73
- Registriert: 22.01.2005, 21:47
- Benutzertext: programmiersüchtig
- Echter Name: Kai Mast
- Wohnort: Freak City
- Kontaktdaten:
Re: Terrain "interpolieren"
Hey All,
kleines Update von mir.
Benutze jetzt folgende Funktion zum interpolieren:
Ich übergebe bicubicInterpolate ein Array aus den 16 umliegenden punkten. Das funktioniert ganz gut...nur scheint der Algorithmus es etwas zu "übertreiben"
Nehmen wir mal an ich habe folgende Daten (immer im Querschnitt; zum besseren verständnis)
http://bayimg.com/CajAPAAdO
Dann erwarte ich ja etwa sowas..
http://bayimg.com/CAJAoaaDO
Erhalte aber immer eine Komplette sinusartige Kurve (Achtung: Handzeichnet und auch zum besseren Verständnis etwas übertrieben..)
http://bayimg.com/cAJAkAaDO
Hab mir jetzt überlegt dass ich ja davor min und max werte berechnen könnte und alles andere einfach "abschneide". Das ist aber sicher nicht so schön... frag mich ob ich generell was falsch mache oder ob das eben einfach das Resultat des Algorithmus ist..
UPDATE: Schranken zu berechnen sieht unerwarteterweise echt gut aus. Glaube ich bin zufrieden. Werde demnächst noch ein paar Bilder posten :)
kleines Update von mir.
Benutze jetzt folgende Funktion zum interpolieren:
Code: Alles auswählen
f64 cubicInterpolate (f64 p[4], f64 x)
{
return p[1] + 0.5 * x*(p[2] - p[0] + x*(2.0*p[0] - ]5.0*p[1] + 4.0*p[2] - p[3] + x*(3.0*(p[1] - p[2]) + p[3] - p[0])));
}
f64 bicubicInterpolate(f64 p[4][4], f64 x, f64 y)
{
f64 arr[4];
arr[0] = cubicInterpolate(p[0], y);
arr[1] = cubicInterpolate(p[1], y);
arr[2] = cubicInterpolate(p[2], y);
arr[3] = cubicInterpolate(p[3], y);
return cubicInterpolate(arr, x);
}
Nehmen wir mal an ich habe folgende Daten (immer im Querschnitt; zum besseren verständnis)
http://bayimg.com/CajAPAAdO
Dann erwarte ich ja etwa sowas..
http://bayimg.com/CAJAoaaDO
Erhalte aber immer eine Komplette sinusartige Kurve (Achtung: Handzeichnet und auch zum besseren Verständnis etwas übertrieben..)
http://bayimg.com/cAJAkAaDO
Hab mir jetzt überlegt dass ich ja davor min und max werte berechnen könnte und alles andere einfach "abschneide". Das ist aber sicher nicht so schön... frag mich ob ich generell was falsch mache oder ob das eben einfach das Resultat des Algorithmus ist..
UPDATE: Schranken zu berechnen sieht unerwarteterweise echt gut aus. Glaube ich bin zufrieden. Werde demnächst noch ein paar Bilder posten :)
Blog: http://mohoho.de