Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Mai 18, 2024 02:05

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Terrain aus Heightmap vereinfachen
BeitragVerfasst: Do Jan 10, 2013 17:23 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Moin,

ich habe eine Heighmap geladen und in einem Mesh gespeichert.
Nun würde ich gern das Mesh vereinfachen, indem ich die Dreiecke zusammengelege.

Das entspechende Tutorial habe ich diesmal nicht so ganz verstanden. Mir geht es auch nicht um LoD, sondern um eine grundsätzliche Vereinfachung von Dreiecken, die nebeneinander liegen und sich in ihrer Höhe bzw. Ebene nicht unterscheiden. Ich würde das gern schon beim oder direkt nach dem Ladevorgang durchführen.

Welche Tricks, Algos, oder sonstwas gibt es dafür?

Grüße!

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 10, 2013 17:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hm, ich kann dir erstmal meinen Source als Referenz geben… Wir gehen dabei aber anders vor. Wir erzeugen das Mesh garnicht erst so detailliert. Statt dessen geben wir einen gewünschten maximalen Fehler (also Abweichung vom 100% korrekten Mesh) sowie die maximale Anzahl von Unterteilungen an (Source).

Dabei wird die Geometrie zunächst in einer Baumstruktur gehalten. Jede Node repräsentiert ein Quad oder vier Children, die weitere Nodes sind. Nodes, die ein Quad sind, werden Leafs genannt. Man startet mit einer Node, die so groß ist, wie das gesamte Terrain und am besten schon vier Children hat.

Dann iteriert man über den ganzen Baum. Für jede nicht-leaf node wird für jedes Child, welches ein Leaf ist, geprüft, wie groß der Fehler bei diesem ist. Wenn der Fehler die gewünschte Grenze überschreitet und noch nicht zu viele Rekursionen gemacht wurden, wird das child unterteilt. Die Höhen für die Vertices werden aus den Quelldaten genommen (ggf. Interpoliert).

Damit hat man sofort die visuelle Meshauflösung, die man braucht, ohne, dass man zwischendurch ein zu komplexes Modell anlegt. Der Nachteil ist, dass diese Methode relativ langsam ist, insbesondere für große Terrains, da man die Rekursion mehrfach durchführen muss, um zu einem guten Ergebnis zu gelangen (nämlich bis alle Nodes nicht mehr unterteilbar sind (der Bedingungen wegen) oder nicht mehr unterteilt werden müssen).

Was sehr tricky ist, ist das ermitteln der Nachbarn im Mesh. Das ist für mehrere Operationen nötig, z.B. um herauszufinden, wie man bei der Unterteilung vorgehen muss. Die Implementation der MeshTree-Klassen spiegelt das auch dementsprechend wieder. Auch recht kompliziert ist das ermitteln der Vertices um das ganze dann in ein VBO zu gießen, aber das geht schon.

Das Ergebnis (Non-Wireframe-Version) sieht ziemlich schick aus. Das Terrain kam aus einem Perlin Noise Generator.

Hoffe es hilft :)

Related:
PerlinNoiseSource.cpp – Erzeugt ein Pseudorandom-Terrain aus Perlin Noise
Source.cpp – Generische Basisklasse für Terrain-Sources, die das Berechnen von Tangenten abstrahiert implementiert.

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 10, 2013 17:55 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Falls du das Continuous LoD Tutorial meinst...das kannst du trotzdem verwenden.
Zur Berechnung des Details wird ja nur die Distanz Kamera<->Dreieck benutzt. Sobald du da für die Distanz eine Konstante einsetzt wird es überall gleichmäßig vereinfacht.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 10, 2013 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das Continous-LoD hatte ich sogar mal implementiert. Da habe ich allerdings massive Performanceprobleme bei größeren Terrains (1024² Felder) bekommen, da man bei jeder Kamerabewegung das Terrain praktisch neu berechnen muss. Auch bei asynchroner neuberechnung sah das ganze noch nicht gut aus, leider.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 11, 2013 18:57 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Zitat:
...wird es überall gleichmäßig vereinfacht.


Genau das möchte ich eben nicht.
Ich möchte, dass das Mesh nur an den stellen vereinfacht wird, wo durch die Vereinfachung kein "Fehler" produziert wird.
Ansonsten soll das Mesh in voller Ausprägung zum Rendern genutzt werden.

Danke für den Source, da muss ich erst mal genau reinschauen.

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 12, 2013 08:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Hast du dir Shader#Beispiel:Heightmap-Terrain (bzw. shader_Terrain_GPU4) angeschaut? Dort wird zwar nicht die Geometrie vereinfacht, aber der Speicherbedarf massiv reduziert. Das erhöht die Performance ebenso und funktioniert unabhängig davon ob sich das Terrain überhaupt vereinfachen lässt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 12, 2013 13:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Wenn man ein wenig Englisch kann, hilft es auch, wenn mit dem Stichwort "mesh simplification" ein bissel googelt.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 12, 2013 13:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Was ich noch dazu sagen sollte, ein schöner Vorteil an dem Algorithmus ist, dass man ihn auch für einen Teilbereich nochmal aufrufen kann, z.B. wenn sich die Heightmap durch ein Ereignis verändert. Dann sollte man aber noch den „Rückweg“ zum einfacheren Mesh mit einbauen, damit das Mesh nicht immer komplexer wird.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 14, 2013 10:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Sorry fuer den kleinen Einwurf.

Danke fuer den Source, war grad selbst auf der Suche wegen Terrain :D

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 14, 2013 15:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Möchte an die GPL/MPL duallizenzierung erinnern ;)

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 20, 2013 17:53 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Also ich habe mich mal an einer Halb-Kanten-Struktur versucht weil ich gerade das Navigieren durch eben jene sehr intuitiv finde.
Ich habe allerdings bis eben einige Schwierigkeiten gehabt. Das überführen in eine Halbkantenstruktur hat im Schnitt 15+ Minuten gedauert bei einer HeightMap mit gerade mal 344x344 Pixeln.
Ich hab dann die Stopwatch genutzt um rauszufinden, wo die Zeit weggeworfen wird.
Man kann sich manchmal aber auch doof anstellen:
Code:
  1.  
  2. public int addFace(Face face) {
  3.     faces.Add(face);
  4.     return faces.IndexOf(face);
  5. }
  6.  
Das statement nach dem return sorgt natürlich jedes mal für eine Iteration über die gesamte liste und da das Element ja immer das letzte der liste ist natürlich auch immer mit worst-case -.-

Code:
  1.  
  2. public int addFace(Face face) {
  3.     faces.Add(face);
  4.     return faces.Count - 1;
  5. }
  6.  

-> von 15 Minuten auf 3 Sekunden.

Wollte ich nur mal zum Besten geben.

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 29, 2013 11:15 
Offline
DGL Member

Registriert: Mi Jan 23, 2013 15:31
Beiträge: 8
Programmiersprache: HTML
Dine Liste wurde also nochmal durchgeackert? Na okay, von 15 Minuten auf 3 Sekunden ist auf jeden Fall eine Leistung... :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 29, 2013 17:12 
Offline
DGL Member

Registriert: Sa Mär 14, 2009 17:48
Beiträge: 99
Programmiersprache: D, Java, C++
@nevermind10844

Was hälst du davon:

Code:
  1. public int addFace(Face face) {
  2.     return faces.Add(face);
  3. }
  4.  


Wieder ein par ms gespart ;-).


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 29, 2013 20:26 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Schlaumeier :P :D (kleiner Scherz)

die Methode Add() der Klasse List hat in C# keinen Rückgabewert :)

Zumindest ist das hier gerade der Fall... korrigier mich wenn falsch ^^

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 29, 2013 20:34 
Offline
DGL Member

Registriert: Sa Mär 14, 2009 17:48
Beiträge: 99
Programmiersprache: D, Java, C++
Ich mache nicht viel mit C#, sofern du aber eine ArrayList nutzt dann schon:
http://msdn.microsoft.com/de-de/library ... t.add.aspx


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.015s | 14 Queries | GZIP : On ]