Terrain "interpolieren"

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Terrain "interpolieren"

Beitrag von Halan »

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? :)
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Terrain "interpolieren"

Beitrag von dot »

Halan hat geschrieben:Wenn ich eine Heighmap hab. Kann ich dann Werte zwischen den einzelnen Punkten interpolieren?
Weiß ich nicht, ob du das kannst. Rein prinzipiell kann man das natürlich ;)
Halan hat geschrieben:Wenn ja, ist sowas kostengünstig möglich? :)
Am einfachsten wär das wohl mit bilinearer Interpolation. Aber man kann's natürlich beliebig kompliziert haben...
Tejio
Establishment
Beiträge: 107
Registriert: 11.11.2010, 11:33

Re: Terrain "interpolieren"

Beitrag von Tejio »

wie wäre es sonst noch mit Simplex noise oder mit perlin noise? Als 1D-Variante müsste das passen...
Benutzeravatar
Top-OR
Establishment
Beiträge: 330
Registriert: 02.03.2011, 16:32
Echter Name: Jens H.
Wohnort: Esslingen/Dessau
Kontaktdaten:

Re: Terrain "interpolieren"

Beitrag von Top-OR »

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.
--
Verallgemeinerungen sind IMMER falsch.
waigie
Beiträge: 82
Registriert: 20.05.2009, 19:37

Re: Terrain "interpolieren"

Beitrag von waigie »

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
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Terrain "interpolieren"

Beitrag von dot »

Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: Terrain "interpolieren"

Beitrag von Halan »

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.
Ja mir schon klar dass ich linear interpolieren kann :P Die frage war natürlich ob ich da irgendwie Kurven rein bekomme.

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.
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: Terrain "interpolieren"

Beitrag von Halan »

Hey All,

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);
}
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 :)
Antworten