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

Aktuelle Zeit: Do Jul 17, 2025 20:17

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



Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
BeitragVerfasst: Mi Okt 06, 2004 15:39 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Servus zusammen...

Ich hab ein Problem mit nem Octree, besser gesagt mit dem Test des selbigen.

Ich hab gerade das Tut von Shadow durchgearbeitet und erstmal(für später sind mir paar Verbesserungen eingefallen) seinen Octree implementiert.

So...das ganze sollte in ner kleinen Anwendung Laufen im Vergleich zu nem brutForce Hightmap Renderer.
Also hab ich eine Funktion geschrieben, die die Hightmap daten in ein Feld mit Dreiecken umbaut.
Das erstellen der Highmapdaten funktioniert fehlerlos. Das weiß ich, weil ich den Highmaprenderer schon getestet hab.
Beim umbau in ein Dreickfeld kommt es dann aber zu Problemen.

(Wem der Code abschreckend groß vorkommt, einfach überspringen...)

Typdefs:
Code:
  1.   TFullVertex = record
  2.       Pos, N : TGLArrayf3;
  3.       u,v    : GLFloat;
  4.   end;
  5.   PFullVertex = ^TFullVertex;
  6.  
  7.   TTriangle = array[0..2] of TFullVertex;
  8.   PTriangle = array[0..2] of PFullVertex;
  9.  
  10.   TTriangleData = array of PTriangle;


die Funktion sieht so aus:
Code:
  1. function LoadHightMapDataForOctree(var TriArray : TTriangleData;
  2.                                          SFactor, HFactor : real;
  3.                                          Filename : String; Path : String = ''): byte;
  4. type
  5.     TVertex3f = record
  6.                   x,y,z : real;
  7.     end;
  8.  
  9. var BitMap              : TBitMap;
  10.     i,j                 : integer;
  11.     TriAnz              : integer;
  12.     FData               : array of array of TVertex3f;
  13.     P1,P2,P3,P4,P0,N    : TGLArrayf3;
  14.  
  15. begin
  16.      {***************Rückgabewerte***************
  17.       * 99 Unknown Error      0 Successfull End *
  18.       *  1 File not Found     2 Reading Error   *
  19.       *******************************************}
  20.       result := 99;
  21.       if not FileExists(path+filename) then
  22.          begin
  23.               result := 1;
  24.               exit;
  25.          end;
  26.  
  27.       BitMap := TBitmap.Create;
  28.       try
  29.          Bitmap.LoadFromFile(path+Filename);
  30.  
  31.          //Datenarray anlegen und Daten einlesen
  32.          SetLength(FData, Bitmap.Height);
  33.          for i := 0 to Bitmap.Height-1 do
  34.              begin
  35.                   SetLength(FData[i], Bitmap.Width);
  36.                   for j := 0 to Bitmap.Width-1 do
  37.                       begin
  38.                         FData[i,j].X := j;
  39.                         FData[i,j].Y := Bitmap.Canvas.Pixels[i,j]/clWhite;
  40.                         FData[i,j].Z := i;
  41.                       end;
  42.              end;
  43.           Bitmap.Free;
  44.       except
  45.          result := 2;
  46.          exit;
  47.       end;
  48.  
  49.       // Daten befinden sich nun in einer Matrix
  50.       // Jeder Eintrag muss jetzt in 4 Dreiecke aufgesplittet werden (wie Triangle_fan)
  51.       // Die Eckpunkte passen ihre Höhe den Nachbarn an
  52.       TriAnz := 0;
  53.  
  54.      for i := 0 to high(FData) do
  55.          for j := 0 to high(FData[i]) do
  56.              if (i=0)or(j=0)or(i=high(FData))or(j=high(FData[i])) then
  57.              begin
  58.                 {
  59.                  momentan noch leer.
  60.                  }
  61.              end else
  62.              begin
  63.  
  64.                 P0[0] := (FData[i,j].x*SFactor);
  65.                 P0[1] := FData[i,j].y*HFactor;
  66.                 P0[2] := (FData[i,j].z*SFactor);
  67.  
  68.                 P1[0] := (FData[i,j].x*SFactor)-(SFactor/2);
  69.                 P1[1] := (FData[i-1,j-1].y*HFactor)+(FData[i-1,j].y*HFactor)+(FData[i,j].y*HFactor)+(FData[i,j-1].y*HFactor);
  70.                 P1[1] := P1[1]/4;
  71.                 P1[2] := (FData[i,j].z*SFactor)-(SFactor/2);
  72.  
  73.                 P2[0] := (FData[i,j].x*SFactor)-(SFactor/2);
  74.                 P2[1] := (FData[i+1,j-1].y*HFactor)+(FData[i+1,j].y*HFactor)+(FData[i,j].y*HFactor)+(FData[i,j-1].y*HFactor);
  75.                 P2[1] := P2[1]/4;
  76.                 P2[2] := (FData[i,j].z*SFactor)+(SFactor/2);
  77.  
  78.                 P3[0] := (FData[i,j].x*SFactor)+(SFactor/2);
  79.                 P3[1] := (FData[i+1,j+1].y*HFactor)+(FData[i+1,j].y*HFactor)+(FData[i,j].y*HFactor)+(FData[i,j+1].y*HFactor);
  80.                 P3[1] := P3[1]/4;
  81.                 P3[2] := (FData[i,j].z*SFactor)+(SFactor/2);
  82.  
  83.                 P4[0] := (FData[i,j].x*SFactor)+(SFactor/2);
  84.                 P4[1] := (FData[i-1,j+1].y*HFactor)+(FData[i-1,j].y*HFactor)+(FData[i,j].y*HFactor)+(FData[i,j+1].y*HFactor);
  85.                 P4[1] := P4[1]/4;
  86.                 P4[2] := (FData[i,j].z*SFactor)-(SFactor/2);
  87.  
  88.                 Inc(TriAnz);
  89.                 setLength(TriArray,TriAnz);
  90.  
  91.                 New(TriArray[TriAnz-1][0]);
  92.                 New(TriArray[TriAnz-1][1]);
  93.                 New(TriArray[TriAnz-1][2]);
  94.  
  95.                 // 1. Dreieck
  96.                 N := CalcNormalVector(P0,P1,P2);
  97.  
  98.                 TriArray[TriAnz-1][0]^.Pos := P0;
  99.                 TriArray[TriAnz-1][0]^.N   := N;
  100.                 TriArray[TriAnz-1][1]^.Pos := P1;
  101.                 TriArray[TriAnz-1][1]^.N   := N;
  102.                 TriArray[TriAnz-1][2]^.Pos := P2;
  103.                 TriArray[TriAnz-1][2]^.N   := N;
  104.  
  105.                 Inc(TriAnz);
  106.                 setLength(TriArray,TriAnz);
  107.  
  108.                 New(TriArray[TriAnz-1][0]);
  109.                 New(TriArray[TriAnz-1][1]);
  110.                 New(TriArray[TriAnz-1][2]);
  111.  
  112.                 // 2. Dreieck
  113.                 N := CalcNormalVector(P0,P2,P3);
  114.  
  115.                 TriArray[TriAnz-1][0]^.Pos := P0;
  116.                 TriArray[TriAnz-1][0]^.N   := N;
  117.                 TriArray[TriAnz-1][1]^.Pos := P2;
  118.                 TriArray[TriAnz-1][1]^.N   := N;
  119.                 TriArray[TriAnz-1][2]^.Pos := P3;
  120.                 TriArray[TriAnz-1][2]^.N   := N;
  121.  
  122.                 Inc(TriAnz);
  123.                 setLength(TriArray,TriAnz);
  124.  
  125.                 New(TriArray[TriAnz-1][0]);
  126.                 New(TriArray[TriAnz-1][1]);
  127.                 New(TriArray[TriAnz-1][2]);
  128.  
  129.                 // 3. Dreieck
  130.                 N := CalcNormalVector(P0,P3,P4);
  131.  
  132.                 TriArray[TriAnz-1][0]^.Pos := P0;
  133.                 TriArray[TriAnz-1][0]^.N   := N;
  134.                 TriArray[TriAnz-1][1]^.Pos := P3;
  135.                 TriArray[TriAnz-1][1]^.N   := N;
  136.                 TriArray[TriAnz-1][2]^.Pos := P4;
  137.                 TriArray[TriAnz-1][2]^.N   := N;
  138.  
  139.                 Inc(TriAnz);
  140.                 setLength(TriArray,TriAnz);
  141.  
  142.                 New(TriArray[TriAnz-1][0]);
  143.                 New(TriArray[TriAnz-1][1]);
  144.                 New(TriArray[TriAnz-1][2]);
  145.  
  146.                 // 4. Dreieck
  147.                 N := CalcNormalVector(P0,P4,P1);
  148.  
  149.                 TriArray[TriAnz-1][0]^.Pos := P0;
  150.                 TriArray[TriAnz-1][0]^.N   := N;
  151.                 TriArray[TriAnz-1][1]^.Pos := P4;
  152.                 TriArray[TriAnz-1][1]^.N   := N;
  153.                 TriArray[TriAnz-1][2]^.Pos := P1;
  154.                 TriArray[TriAnz-1][2]^.N   := N;
  155.  
  156.              end;
  157. end;


folgendes passiert:

1. Es dauert ewig bis eine 512x512 Highmap durchläuft!
2. Es läuft nicht durch, da ein RunOutOfMemory Fehler auftritt!!!


Also ich bin bisl verblüfft denn, die Funktion basiert direkt auf der Zeichenfunktion für die Highmap. Ich hab eigentlich nur den Triangle_Fan ersetzt:
Code:
  1. procedure CHightMap.Render;
  2. var i,j   : integer;
  3.     P1,P2,P3,P4,P0,N : TGLArrayf3;
  4. begin
  5.      for i := 0 to high(FData) do
  6.          for j := 0 to high(FData[i]) do
  7.              if (i=0)or(j=0)or(i=high(FData))or(j=high(FData[i])) then
  8.              begin
  9.                 glNormal3f(0,1,0);
  10.                 glBegin(GL_TRIANGLE_FAN);
  11.  
  12.                 ....
  13.                 ....
  14.  
  15.                 glEnd;
  16.              end else
  17.              begin
  18.  
  19.                 P0[0] := (FData[i,j].x*SizeFactor);
  20.                 P0[1] := FData[i,j].y*HightFactor;
  21.                 P0[2] := (FData[i,j].z*SizeFactor);
  22.  
  23.                 P1[0] := (FData[i,j].x*SizeFactor)-(SizeFactor/2);
  24.                 P1[1] := (FData[i-1,j-1].y*HightFactor)+(FData[i-1,j].y*HightFactor)+(FData[i,j].y*HightFactor)+(FData[i,j-1].y*HightFactor);
  25.                 P1[1] := P1[1]/4;
  26.                 P1[2] := (FData[i,j].z*SizeFactor)-(SizeFactor/2);
  27.  
  28.                 P2[0] := (FData[i,j].x*SizeFactor)-(SizeFactor/2);  
  29.                 P2[1] := (FData[i+1,j-1].y*HightFactor)+(FData[i+1,j].y*HightFactor)+(FData[i,j].y*HightFactor)+(FData[i,j-1].y*HightFactor);
  30.                 P2[1] := P2[1]/4;
  31.                 P2[2] := (FData[i,j].z*SizeFactor)+(SizeFactor/2);
  32.  
  33.                 P3[0] := (FData[i,j].x*SizeFactor)+(SizeFactor/2);
  34.                 P3[1] := (FData[i+1,j+1].y*HightFactor)+(FData[i+1,j].y*HightFactor)+(FData[i,j].y*HightFactor)+(FData[i,j+1].y*HightFactor);
  35.                 P3[1] := P3[1]/4;
  36.                 P3[2] := (FData[i,j].z*SizeFactor)+(SizeFactor/2);
  37.  
  38.                 P4[0] := (FData[i,j].x*SizeFactor)+(SizeFactor/2);
  39.                 P4[1] := (FData[i-1,j+1].y*HightFactor)+(FData[i-1,j].y*HightFactor)+(FData[i,j].y*HightFactor)+(FData[i,j+1].y*HightFactor);
  40.                 P4[1] := P4[1]/4;
  41.                 P4[2] := (FData[i,j].z*SizeFactor)-(SizeFactor/2);
  42.  
  43.                 glBegin(GL_TRIANGLE_FAN);
  44.                   glColor3f(FData[i,j].y,FData[i,j].y,FData[i,j].y);
  45.  
  46.                   N := CalcNormalVector(P0,P1,P2);
  47.                   glNormal3fv(@N[0]);
  48.                   glVertex3fv(@P0[0]);
  49.                   glVertex3fv(@P1[0]);
  50.                   glVertex3fv(@P2[0]);
  51.                   N := CalcNormalVector(P0,P2,P3);
  52.                   glNormal3fv(@N[0]);
  53.                   glVertex3fv(@P3[0]);
  54.                   N := CalcNormalVector(P0,P3,P4);
  55.                   glNormal3fv(@N[0]);
  56.                   glVertex3fv(@P4[0]);
  57.                   N := CalcNormalVector(P0,P4,P1);
  58.                   glNormal3fv(@N[0]);
  59.                   glVertex3fv(@P1[0]);
  60.                 glEnd;
  61.              end;
  62. end;


Hat einer von euch ne Idee wies zu dem OutOfMemory Fehler kommen kann. Wo ist das Loch?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 8 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.007s | 15 Queries | GZIP : On ]