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

Aktuelle Zeit: Fr Jul 18, 2025 12:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Speicherung eines Octrees
BeitragVerfasst: So Aug 17, 2003 18:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
als erstes - ich hoffe das ich hier nicht den falschen forenberech (allgemein/opengl) erwischt habe. falls doch, dann bitte ich einen admin darum, den thread einfach mal in den richtigen bereich zu schubsen




also was meine eigentlich frage angeht:

ich hab seit einiger zeit einen octree implementiert, ist ja auch nicht sooooo schwer. nun hab ich das prog ma wieder in der hand gehabt und wollte diesen baum dann auch einfach noch exportieren, um den baum in einem anderen prog einfach nur zu laden, anstatt komplett neu zu laden.
ich hab auch ne lösung gefunden, doch ist die wirklich mehr als umständlich.

ich mach das so :

1) ich lade die polys und speichere die in nen dyn. array
2) ich berechne den baum
3) ich stelle den baum in einem treeview-control (standard von delphi) dar
4) ich speichere per TreeView1.SaveToFile(..) die struktur der nodes (der nodeIDs)
5) ich speichere in einer zweiten datei die aabbs und die parent_node_id für jede node
6) ich speichere alle polys mit entsprechenden nodeIDs
7) (im betrachter) bastel mir den baum aus allen angaben wieder zusammen

das ergibt mit den ersten polys und den gespeicherten dateien jedesmal 4 Files, die bei einigen Heightmaps derzeit auf 10-15 MB Größe anwachsen können (speichere derzeit per Textfile - besser für die kontrolle der ausgaben)

irgendwie muss es doch ne bessere möglichkeit geben, oder nicht??
3 ausgabedateien sind mir einfach etwas zu viel und zusammenschmeissen hilft auch nicht, da ich vorher ja nicht weiss, wieviele nodes ich habe (wäre aber nicht das problem das rauszufinden) und ausserdem reduziert das den speicheraufwand auch nicht. gepackt ist eine heightmap zwar dann auch wieder bloß 100KB aber ich brauchs ja nicht gepackt sondern entpackt. Hat jemand ne gute idee, wie ich das hinbekomme ???

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 17, 2003 18:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Ich hab zwar bei mir noch keine Octrees zum laufen gebracht :wink: aber ich denke mal das du es ohne den TreeView machen solltest. Du hast doch sicherlch eine feste Struktur mit der die Octrees speicherst. Diese Struktur einfach selber in ne Textdatei zu schreiben wäre denke ich viel einfacher und kleiner als das SaveToFile von nem TreeView zu nutzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 17, 2003 19:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich geb zu das ich noch nicht besonders viel mit Octrees gemacht hab, allerdings sehe ich in ner Speicherung eben dessen eigentlich kein so großes Problem, wenn man diesen intelligent aufbaut.

Ein 3D-Octree ist ja quasi nichts anderes als ein binärer Baum der aus diversen Boxen besteht, und jede Box verweist ja (so würde ich es machen) über einen Pointer auf die ihr übergeordnete Box.Beim Erstellen deiner Boxen solltest du deshalb ganz einfach jeder Box eine eindeutige ID geben (Integer) über die man sie ganz einfach identifizieren kann, und jede Box die eine übergeordnete Box hat speichert ebenfalls die ID des Vorgängers.Deine Polygonliste ist ja ein dynamisches Array, und ich würde jedem Polygon auch noch nen Pointer geben der auf die Box des Octrees zeigt zu der es gehört, und gleichzeitig auch noch die ID der Box zu der es gehört.

Auf Basis der oben genannten Struktur (Es geht halt nichts über Pointer) kannst du deine Octree-Levelstruktur nun recht einfach in eine Datei speichern.Du schreibst einfache alle Boxen deines Octrees nacheinander rein (inklusive der eindeutigen ID und der ID des Vorgängers), und am Ende der Datei dann auch noch die Polygone (auch plus der ID der Box zu der es gehört).

Das Laden geht nun auch recht einfach, da du ja für jede Box ne eindeutige ID hast : Du lädst alle Boxen (am besten dynamisches Array), und danach gehst du dieses dynamische Array durch, und jede Box hat ja ne Variable in der die ID des Vorgängers drinsteht, und anhand derer kannst du ja wieder nen Pointer auf den Vorgänger herausfinden.
Deine Polygone lädst du dann auch nacheinander aus der Datei, und jedes Polygon hat auch wieder die ID die eindeutig auf die Box zeigt zu der es gehört.

So hast du im Endeffekt nur eine Datei, und kannst dank der eindeutigen IDs auch deine Octreestruktur ganz einfach wieder rekonstruieren.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 17, 2003 19:37 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Das könnte man doch auch so rekursiv machen. Da kann man auf ID's oder so verzeichten.

Code:
  1. procedure TOctreeNode.SaveToStream(st:TStream);
  2. var
  3.  i:integer;
  4. begin
  5. // Polygon Anzahl speichern
  6. st.WriteBuffer(PolygonAnzahl,4);
  7. // Polygone Speichern
  8. for i:=0 to Polygon Anzahl-1 do
  9.  Polygon[i].SaveToStream(st);
  10. // Speichern ob Unterknoten vorhanden sind
  11. st.WriteBuffer(HatUnterknoten,sizeof(HatUnterknoten));
  12. // untergeordnete Knoten speichern
  13. if HatUnterknoten then
  14.  for i:=0 to 7 do
  15.   subnodes[i].SaveToStream(st);
  16. end;
  17.  
  18. function TOcttreeNode.LoadFromStream(st:TStream);
  19. var
  20.  i:integer;
  21. begin
  22. // Polygon Anzahl laden
  23. st.readbuffer(PolygonAnzahl,4);
  24. // Polygone laden
  25. for i:=0 to PolygonAnzahl-1 do
  26.  begin
  27.   Polygon[i]:=TPolygon.create;
  28.   Polygon[i].LoadStream(st);
  29.  end;
  30. // Laden ob Unterknoten vorhanden sind
  31. st.ReadBuffer(HatUnterknoten,sizeof(HatUnterknoten));
  32. // untergeordnete Knoten laden
  33. if HatUnterknoten then
  34.  for i:=0 to 7 do
  35.   begin
  36.   subnodes[i]:=TOcttreeNode.create;
  37.   subnodes[i].LoadFromStream(st);
  38.   end;
  39. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2003 18:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 28, 2002 19:27
Beiträge: 568
Wohnort: Chemnitz / Sachsen
also erstmal danke für die antworten, war leider in den letzten tagen durch nen komplettausfall des rechners mit internet anbindung bei mir zu hause nicht im internet.

nun zu euren ideen.

sos's lösung würde bedeuten, dass ich meine struktur etwas ändern müsste, da ich keine pointer auf parents habe sondern nur pointer auf children.


daher kommt lars idee eher in betrachtung. ich versuche es mal, und wenns nicht funktioniert, dann frag ich nochmal nach.

danke an euch bis dahin.

rswm


Ps: ist es eigentlich normal, dass man bei jeder frage im forum immerwieder die 2 namen lars und sos findet (gut bei vielen noch aya) ??
ich meine ich hab nichts gegen aber ist schon zu bemerken. super von euch, dass ihr euch um andere, die es nicht so draufhaben oder noch nicht so lange damit arbeiten, kümmert.

_________________
Aktuelles Projekt :
www.PicPlace.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 16 Queries | GZIP : On ]