AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Vertex Smoothing

Ein Thema von blackfin · begonnen am 12. Mai 2010 · letzter Beitrag vom 23. Jul 2010
Antwort Antwort
Seite 1 von 3  1 23      
blackfin
(Gast)

n/a Beiträge
 
#1

Vertex Smoothing

  Alt 12. Mai 2010, 00:21
Hallo Experten,

ja, ich weiss, das was jetzt kommt, ist nicht wirklich eine Delphi-Frage, sondern eine allgemein mathematische.
Da ich aber damals im Geometrieunterricht lieber darüber nachgedacht habe, wie ich an Sylvester aus einer RedBull-Dose einen Vulkan baue oder den Stadtbrunnen einfärbe, anstatt dem netten Herren vorne zuzhören,schaue ich nun mit meinem Problem so dumm aus der Wäsche wie ein Schwälblein wenn es blitzt.
Es geht nämlich um:

Vertex Smoothting in einem Terrain.
Das klingt nun erst einmal überkanditelt, ist es auch, aber das tut ja nichts zur Sache, dass ich es nicht hinbekomme, egal wie cool es klingt...

Das Problem ist eigentlich recht simpel:

Ich habe ein Grid mit lauter Vertices, alle haben eine bestimmte Höhe, alles zusammen bildet eine Landschaft.
Nun kann es sein, dass vieler Übergänge zwischen den Terrains zu "stufig" und zu hart sind.
Ich würde das ganze gerne weicher haben, also "smoothen" (sowas wie dieser unsägliche "TurboSmooth" im 3dsMax)
Nun habe ich allerdings keine grosse Ahnung, mit welchem Algorithmus man ein Terrain "weicher" machen kann.

Irgendwie muss ich die einzelnen Steigungen zwischen den Vertices wohl berechnen und anpassen...aber wie genau...?

P.S.:
Wenn die Fragestellung Mist ist, dann bratet mir gleich eins über! Ich versuche dann, das Ganze nochmal etwas besser zu beschreiben....


Edit:
Ich habe mal einen Screenshot angehängt, um das Problem zu verdeutlichen.
Der "Berg" auf dem Bild ist viel zu eckig. Nun möchte ich einen Algorithmus drüber laufen lassen, der die einzelnen Höhen etwas natürlicher und weicher macht.
Mir gehts jetzt auch nicht um "gebt mir den Code, ich bin zu faul dafür", sondern um allgemeine Ansätze, wie man so etwas bewerkstelligt.
Miniaturansicht angehängter Grafiken
ehx_moonshape_22_997.jpg  
  Mit Zitat antworten Zitat
Hubi89

Registriert seit: 1. Apr 2010
5 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Vertex Smoothing

  Alt 12. Mai 2010, 01:44
Heyho blackfin,

da gibt es mehrere Möglichkeiten. Ich weiß jetzt nicht, wie tief du in der Materie steckst und kann deinem Bild dazu auch wenig entnehmen, aber um die ganze Sache "weicher" zu machen könntest du folgendes probieren:

- Falls du es nicht schon tust, kannst du mal Lichtberechnungen mit interpolierten Normalen probieren (Stichwort phong). Dies ändert natürlich an der Geometrie selber nichts, aber lässt die ganze Sache schon viel "weicher" wirken(http://en.wikipedia.org/wiki/File:ra...ing-sample.jpg).
- Du könntest versuchen anstatt nur jeweils einen Wert pro Pixel aus der Heightmap zu lesen eine Art "sub-sampling" durchzuführen, indem du ein "enzelnes Pixel" weiter unterteilst und die Werte durch bilineare Filterung bestimmst.
- Es gibt auch Algorithmen, die Meshes nach bestimmten Vorschriften verfeinern, dazu könntest du als Startpunkt mal http://en.wikipedia.org/wiki/Catmull...vision_surface nehmen und dich informieren was es da alles gibt.
- Stichwort Geometry-Shader und Tesselation? Sollten das die neuen Dx11 Grakas nicht von Haus aus können? Kenn mich da aber leider gar nicht aus, vllt hat da jemand anders mehr Ahnung.

Hoffe, ich konnte dir weiterhelfen.

Gruß
Hubi
Katja Huber
Hey, meine Augen sind hier oben...
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Vertex Smoothing

  Alt 12. Mai 2010, 02:35
Und die Lösung, die dir vermutlich vorschwebte, nennt sich Filterung, und ist von einem Blur-Filter wie bei Bitmaps kaum zu unterscheiden . Zu Blur-Filtern finden sich wohl einige Quellen in der DP (Blur, Smooth(ing), Weichzeichnen/-er, Gauss (Filter) - alles passende Suchbegriffe), und diese wendest du dann statt auf Pixel eines Bitmaps, auf die Y-Koordinaten deiner Vertices an.

Edit: Aber aufpassen! Wenn dein Mesh von oben gesehen nicht ein regelmäßiges Gitter ist, musst du X und Z mit beachten für die Faktoren, wodurch ein paar schöne Optimierungen durch LUTs weg fallen.

Das wäre, besonders wenn man einen Gauss-Filter nimmt, der übliche Weg um ein Mesh zu "smoothen", ohne etwas am Shading zu machen, und wobei die Topologie völlig unangetastet bleibt (vorausgesetzt, man betrachtet die Länge der Verbindungen in einem Netz nicht der Topologie zugehörig )

Hubis Vorschläge sind nicht falsch, aber
1) Setzt hier an der falschen Stelle an, da über diesen Ansatz, wie er schrieb, die Geometrie unangetastet bleibt, und du hast definitiv ein Problem in der Geometrie. Weitet man die Idee aber aus, so lässt sich das o.g. Filtering dank Adjacency-Infos tatsächlich im Shader machen, allerdings nur im Geometry-Shader. (Und mit viel Trickserei sogar noch im Vertex-Shader, aber auch nur unter OGL, und auch nur wenn im VS Texture-Reads zugelassen sind - was nicht gerade so der Standard ist. Oooooder wenn man Unmengen an TexCoords dazu dichtet, die die Adjacency-Infos tragen - auch bitter )

2) Fällt unter Tesselation

3) Dito

4) Tesselation! Von "Haus aus" können sie das nicht wirklich, man muss den Shader schon noch selber bauen, wo man dann u.a. 2) und 3) implementieren könnte. (Zumindest ist mir nichts der Art bekannt, ich bin aber bei den aller neusten Chips auch nicht mehr ganz so up to date.) Aber den Geometry-Shader (und somit Adjacency-Infos frei Haus) gibt's erst seit DX10. Allerdings bringt glaube ich der eine oder andere Treiber so eine Option für generische Tesselation mit. Die kann einem dann aber auch gewaltig in die Suppe spucken kann ich mir vorstellen, da man ja so gar keine Kontrolle drüber hätte.


Lange Rede, kurzer Pin: Was du im Hinterkopf hast, ist fast sicher einfaches Filtering. Und das muss bei statischen Meshes zum Glück nur ein Mal gemacht werden, d.h. es tut sogar eine langsame (lesbare) implementierung =)

Oh, es gibt noch eine Variante die teilweise angewendet wird, eine iterative: Diffusion. Wenn ich nicht völlig irre, nähert Gauss-Filterung aber Diffusion an, und das iterative Verfahren ist nur nötig, wenn man Grenzen innerhalb des Feldes hat, über die nicht hinaus diffundiert werden darf, bzw. Materialen unterschiedlicher "Leitfähigkeit" dabei sind (bei dir z.B. Sand und Stein in einem Mesh, und du willst Erosion "faken"). (Ja, diese Erosion wäre nicht wirklich realistisch, aber zu einem gewissen Grad sehr ähnlich - nur falls da einer gleich mit kommt )
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Hubi89

Registriert seit: 1. Apr 2010
5 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Vertex Smoothing

  Alt 12. Mai 2010, 15:51
Filtering hab ich ja ganz vergessen^^
So einfach kanns sein...
Katja Huber
Hey, meine Augen sind hier oben...
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#5

Re: Vertex Smoothing

  Alt 12. Mai 2010, 15:59
Hui.....

erstmal Danke für die Antworten!

An sowas ähnliches wie nen Gauss-Filter hatte ich schon gedacht, dann werde ich die Idee wohl mal aufgreifen und rumbasteln

Geometrie-Shader will ich allerdings nicht einsetzen, da mir die Technik noch zu "neu" ist und die Leute, die das "Viech" dann benutzen sollen, teilweise eine solche Grafikkarte noch gar nicht besitzen. Es ist mir schon fast zuviel, SM3 einzusetzen, aber da komm ich nicht drumrum

Die Idee mit dem Phong-Shading und dem Normal mapping halte eigentlich für ziemlich gut, aber wie ja medium bereits gesagt hat, geht es mir erstmal nur um die Geometrie an sich. Verschönern und faken kann man das dann immer noch Ansätze sind dafür auch schon vorhanden.

Subdivision Surfaces kann ich allerdings nicht anwenden, da ich damit das Terrain weiter unterteilen müsste und das will ich nicht
Generell ist das sicher eine gute Idee, aber wenn dann nur im Nahbereich oder für Non-Realtime-Rendering. (meine Meinung

Naja, lange rede kurzer Sinn..ich werd dann erstmal den alten Gauss bemühen und schauen, ob er nicht allzu "grantig" wird, wenn ich den Algorithmus verwurschtel
Über Erosions-Emulation will ich erstmal gar nicht nachdenken, das übersteigt meine Fähigkeiten dann doch etwas *hust*

Edit:

Ich schreibe definitiv zuviele Smilies....
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#6

Re: Vertex Smoothing

  Alt 3. Jun 2010, 21:33
Update:

Der Tipp mit dem (aktuell jetzt nicht wirklich Gaussian, weil zu langsam) Blur hat wunderbar funktioniert
Jetzt weiss ich glaub ich, wie Blizzard bei WoW seine Terrains erstellt hat

Den Erfolg will ich euch natürlich auch nicht vorenthalten: Aktuell ein (untexturiertes) Bild Vorher <-> Nachher.

Überseht mal einfach den Vertex-Fehler in der Mitte, da ist noch ein böses Z-Fighting im Gange, aber da hab ich ja auch schon was dagegen....
Miniaturansicht angehängter Grafiken
vorher_nachher_136.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#7

Re: Vertex Smoothing

  Alt 3. Jun 2010, 21:40
Cool...

Darf man fragen, wofür du das brauchst?
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Vertex Smoothing

  Alt 3. Jun 2010, 22:05
Das macht was her! Und es schaut, auch in der Texturierung, wirklich recht WoWig aus

Die meisten Terrain-Generatoren dürften es auch sehr ähnlich machen: Irgend eine Noise-Funktion (klassisch Perlin Noise) als Heightmap, weichzeichnen und Vertices draus züchten. Schaut immer wieder schmuck aus
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#9

Re: Vertex Smoothing

  Alt 3. Jun 2010, 22:33
Zitat:
Darf man fragen, wofür du das brauchst?
Naja..."brauchen" ist hier eigentlich niht der richtige Begriff.

Ich bastel mir gerade einen kleinen World-/Terrain-Editor mit OpenGL zusammen.
Es gilt für mich in erster Linie, dabei etwas zu lernen.
Wie macht man so etwas, wie ist die Art und Weise, an so etwas heranzugehen.
Ich habe dabei selbst keine so grossen Hoffnungen, dass das Ganze wirklich sowas wie eine Engine wird, weil die Arbeit an so etwas wirklich uferlos ist, aber wenn ich Zeit und Muße habe, bastel ich einfach gerne daran herum

Inspiriert hat mich dazu, muss ich zugeben wie viele, World of Warcraft.
Jetzt liegt es mir wirklich fern, so etwas in der Art "nachzuprogrammieren" (haha, dazu bräuchte es wohl 100 Leute und 10 Jahre Zeit...),
aber ich möchte einfach mal wissen, wie so etwas generell aufgebaut ist, und natürlich...ob so etwas mit Delphi überhaupt möglich ist.
Und das scheint es ja zu sein Zumindest, was die Grafik-Engine davon angeht.
Zitat:
Das macht was her
Danke *froi* Aber der Held des Moments bist ja eher du selbst, denn du hast mich auf die richtige Idee mit dem alten Gauss gebracht


Edit:

Anbei noch ein Screenshot von der zugehörigen "Spiel-Engine" (*hust* naja..also....der Begriff ist eigentlich mächtig überzogen, mehr als rumlaufen kann man da nicht..und bis es mehr wird, werden wohl noch Jahre vergehen..*g*)
Miniaturansicht angehängter Grafiken
elfenherz_meer_797.jpg  
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Vertex Smoothing

  Alt 3. Jun 2010, 23:18
Alter Lachs, das sieht wirklich 1a aus! Und von wegen Idee... die war ja nicht mal neu, und die Umsetzung hat sicherlich mehr Schmalz erfordert als einfach mal "Gauss" zu stammeln . Das sieht echt schon nach riiichtig viel Arbeit drin aus, mein Respekt ist dir sicher! (Bin bei Spaß-/Lernprojekten selten so ausdauernd. Wenn "proof of concept", dann fertig )
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz