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

Aktuelle Zeit: Mo Jul 07, 2025 16:41

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: POINTER .. Hilfe ^^
BeitragVerfasst: Mi Mär 14, 2007 18:39 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
Gude ,

ich arbeite momentan bissl mit Pointern und komm damit irgendwie nicht klar
polygons[].v is ein Pointer auf den typ TVertex
VertexArray is ein array aus TVertex ..
da dachte ich , dass ich ein @ schreiben muss .. aber da kommt die meldung

Inkompatiple Typen TVertex und Pointer. ????? häh ?

setLength(polygons,Length(polygons)+1);
polygons[High(polygons)].v[0]:=@VertexArray[i+0];


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 14, 2007 20:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich müsste nicht so im Dunklen tappen wenn Du mir verrätst, wie die Dinger definiert sind. :roll:

So vielleicht?

Code:
  1. Type
  2.    TVertex = Record X,Y,Z: Single; End;
  3.    PVertex = ^TVertex;
  4.    TVertexArray = Array Of TVertex;
  5.    TPolygon = Record V: PVertex; End;
  6. Var
  7.    VertexArray: TVertexArray;
  8.    Polygons: Array Of TPolygon;
  9.  


Nein, kann nicht sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 14, 2007 23:18 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
'Fast :)

Code:
  1.  
  2.   PVertex=^TVertex;
  3.   TVertex=packed record
  4.     s,t : GLfloat ;
  5.     x,y,z:Glfloat;
  6.   end;
  7.   TVertexarray = array of TVertex ;
  8.   PPolygon = ^TPolygon ;
  9.   TPolygon = record
  10.     v:array[0..2] of TVertex;
  11.   end;
  12.  
  13. var
  14. polygons : array of PPolygon ;
  15. Vertexarray : TVertexaray ;
  16.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 14, 2007 23:30 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Im Polygon ist das als TVertex und nicht als PVertex definiert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 14, 2007 23:52 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
ok

PPolygon = record
v : array[0..2] of ^TVertex ;

so siehts jetzt aus .. jetzt kommt aber irgendwie bei folgendem Quelltext ein fehler ..

Code:
  1.   with polygons[i].v[j]^ do
  2.   begin
  3.       if x > maxSize then maxSize:=x;
  4.     if y > maxSize then maxSize:=y;
  5.     if z > maxSize then maxSize:=z;
  6.  
  7.     if x < minSize then minSize:=x;
  8.     if y < minSize then minSize:=y;
  9.     if z < minSize then minSize:=z;
  10.   end;

Der fehler kommt aber erst wenn das programm läuft ,. also nicht vom compiler .. ka warum


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 15, 2007 00:02 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
vermutlich ist polygons[i].v[j] = nil oder zeigt auf irgendeinen anderen ort, auf den er nicht zeigen sollte ;)

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 15, 2007 00:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hm.
Jetzt hast Du geschrieben:
Code:
  1. PPolygon = record v : array[0..2] of ^TVertex ;
  2. Polygons : Array Of PPolygon ;


Vorher hast Du geschrieben:
Code:
  1. PPolygon = ^TPolygon ;
  2. TPolygon = record v:array[0..2] of TVertex; end;
  3. polygons : array of PPolygon ;
  4.  


Welches nimmst Du jetzt? Die Polygons von oben sind gar kein Zeiger, sondern ein Array von Records, die unteren sind schon Zeiger (ein Array von Zeigern).

In der unteren Version musst Du vorher ein GetMem machen.


Übrigens: Deine zweite Version (wo die Polygons gar keine zeiger sind) gefällt mir viel besser. Aber ich weiß natürlich nicht, ob Du die Zeiger für VBOs oder so etwas brauchst. Die VBO-kundigen mögen mir verzeihen. Ich kenn mich da nicht aus. :P


Zuletzt geändert von Traude am Do Mär 15, 2007 00:24, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 15, 2007 00:14 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
also ich würde es so definieren:

Code:
  1.  
  2.   PPolygon = ^TPolygon;
  3.  
  4.   TPolygon = record
  5.     V: array [0..2] of TVertex;
  6.   end;
  7.  


dann kannst du immer schön mit den Pointern von den Polygonen schaffen. So wie ich mir den Quellcode ansehe, ist dies wahrscheinlich das Octreetutorial. Und eben solches habe ich so gelöst, was auch wirklich gut funktioniert.

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 15, 2007 00:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Tja, wenn das so ist....
dann muss Du
1) für jeden Vertex
2) und auch für jedes Polygon
mit GetMem Platz schaffen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 15, 2007 08:06 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Gaukler hat geschrieben:
also ich würde es so definieren:

Code:
  1.  
  2.   PPolygon = ^TPolygon;
  3.  
  4.   TPolygon = record
  5.     V: array [0..2] of TVertex;
  6.   end;
  7.  



Kurze Frage am Rande, weil ich das grad mehrfach gesehen hab. Macht diese Recorddefinition eigentlich sinn? Denn ich nutze ja nur eine Variable im Record, da kann ich doch direkt ein Array nehmen:
Code:
  1.  
  2.   PPolygon = ^TPolygon;
  3.  
  4.   TPolygon = array [0..2] of TVertex;
  5.  


Oder hat das irgendwelche Vorteile, ausser dass man MeinPolygon.V[0] statt MeinPolygon[0] schreiben muss?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 15, 2007 08:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich denke es hat was damit zu tun, wie der Code anschliessend aussieht.

Du hast natürlich recht, wenn Du sagst, dass Deine Definition kürzer ist.
Aber wenn Du dann einen Vertex ansprechen willst, dann sieht das bei der kürzeren Form so aus:

Code:
  1.  
  2. Type
  3.    TVertex = Record X,Y,Z: Single; End;
  4.    TPolygon = Array [0..2] Of TVertex;
  5. Var
  6.    MyPolygon: TPolygon;
  7. Begin
  8.    SetLength(MyPolygon,1);
  9.    MyPolygon[0].X:= 1;
  10.    MyPolygon[0].Y:= 2;
  11.    MyPolygon[0].Z:= 3;
  12.    ........
  13.  


Dabei sieht man den Vertex gar nicht, er fällt irgendwie "unter den Tisch". Das könnte man als Nachteil ansehen, wenn man deutlich programmieren möchte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 15, 2007 11:21 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
Der Unterschied ist vor allem, dass ein Polygon bei mir noch materialeigenschaften und evtl ebenengleichungen besitzt. Somit ist es durchaus gescheit einen Record zu machen.

Ich verwende für PPolygon dann halt immer new(), was dann auch ganz gut geht. Dann muss man nur daran denken, das ganze mit dispose wieder freizugeben.

mfg

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 15, 2007 13:00 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
Irgendwie werd ich aus den Pointern nid schlau^^ ..

Also jetzt hab ich ne variante gefunden , wo ich keine Fehlermeldung bekomm. Aber irgendwie bekomm ich vom Octree nichts zu sehen. Habe gedacht es läge vielleicht daran, dass ich außer sichweite bin . Aber das dürfte ja eigentlich nicht sein. oder ? .. Also meine Kamera liegt bei 0,0,0. Da dürfte ja die Map anfange. Naja .. aber vielleicht liegt es ja daran dass ich falsche Speicher oder so benutzt habe.

folgende Deklarationen :

Code:
  1.  
  2.  
  3.    TVertex=packed record
  4.     s,t : GLfloat ;
  5.     x,y,z:Glfloat;
  6.   end;
  7.  
  8.   PPolygon = record
  9.    v:array[0..2] of TVertex;
  10.   end;
  11.  



hier ist meine Terrainklasse :

Code:
  1.  
  2. TTerrain = class
  3.    VertexArray   : TVertexarray;
  4.    Polygons      : array of PPolygon ;
  5.    HeightData    : array of array of Byte;
  6.    BaseTexture   : glUInt;
  7.    DetailTexture : glUInt;
  8.    Octree        : TOctree;
  9.    Width,Height  : Single;
  10.    SizeScale     : Single;
  11.    HeightScale   : Single;
  12.    procedure LoadFromData(Heightmap : TBitmap ;pBaseTexture, pDetailTexture : GluInt; pSizeScale : Single = 1; pHeightScale : Single = 1; pOffset : Integer = -50);
  13.    procedure Render(aCamera : TECamera);
  14.    //destructor Destroy; override;
  15.   end;
  16.  




Folgender Quelltext :
Code:
  1.  
  2. procedure TTerrain.LoadFromData(Heightmap : TBitmap ;pBaseTexture, pDetailTexture : GluInt; pSizeScale : Single = 1; pHeightScale : Single = 1; pOffset : Integer = -50);
  3. const
  4.  Points  : array[0..5] of array[0..1] of Integer = ((0,0),(1,0),(0,1), (1,0),(1,1),(0,1));
  5. var
  6.  x,y       : Integer;
  7.  i,j       : Integer;
  8. begin
  9. pSizeScale   := 1;//pSizeScale * 8;
  10. pHeightScale := 1;//pHeightScale / 75000;
  11. HeightScale  := 1;//pHeightScale;
  12. SizeScale    := 1;//pSizeScale;
  13. i := 0;
  14. for x := 0 to HeightMap.Width-2 do
  15.  for y := 0 to HeightMap.Height-2 do
  16.   begin
  17.   SetLength(VertexArray, Length(VertexArray)+6);
  18.   for j := 0 to High(Points) do
  19.    begin
  20.    VertexArray[i+j].x := x+Points[j,0];//-HeightMap.Width/2*pSizeScale+(x+Points[j,0])*pSizeScale ;
  21.    VertexArray[i+j].y := 0;//HeightMap.Canvas.Pixels[x+Points[j,0], y+Points[j,1]]*pHeightScale+pOffset ;
  22.    VertexArray[i+j].z := x+Points[j,1];//-HeightMap.Width/2*pSizeScale+(y+Points[j,1])*pSizeScale;
  23.    VertexArray[i+j].t := (x+Points[j,0])/HeightMap.Width;
  24.    VertexArray[i+j].s := 1-(y+Points[j,1])/HeightMap.Height;
  25.    end;
  26.    setLength(polygons,Length(polygons)+1);
  27.    polygons[High(polygons)].v[0]:=VertexArray[i+0];
  28.    polygons[High(polygons)].v[1]:=VertexArray[i+1];
  29.    polygons[High(polygons)].v[2]:=VertexArray[i+2];
  30.    setLength(polygons,Length(polygons)+1);
  31.    polygons[High(polygons)].v[0]:=VertexArray[i+3];
  32.    polygons[High(polygons)].v[1]:=VertexArray[i+4];
  33.    polygons[High(polygons)].v[2]:=VertexArray[i+5];
  34.   inc(i, 6);
  35.   end;
  36. Width  := HeightMap.Width*pSizeScale;
  37. Height := HeightMap.Height*pSizeScale;
  38.  
  39.  
  40. Octree := TOctree.Create(polygons);
  41. Camera.Pos.x := polygons[1].v[1].x ;
  42. Camera.Pos.y := polygons[1].v[1].y ;
  43. Camera.Pos.z := polygons[1].v[1].z ;
  44. end;
  45.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 15, 2007 13:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Also, ich fürchte, bei diesem Quellext muss ich passen. Mein Rat ist, schau Dir mit dem Debugger an, ob Du überhaupt Daten reinbekommst. Und dann sieh Dir die Renderprozedur an, da kann schliesslich auch eine ganze Menge passieren:
1) Stichwort Culling,
2) Deine Kamera ist auf 0/0/0, was ist, wenn sich das ganze Zeug im positiven Z-Bereich befindet, und Du hast Zentralperspektive eingeschaltet?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 16, 2007 11:15 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
ok .. habs ..
die welt war irgendwo im raum verschollen ^^ :) hab sie gefunden ^^


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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.010s | 14 Queries | GZIP : On ]