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

Aktuelle Zeit: Fr Jul 18, 2025 17:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Heightmap Problem
BeitragVerfasst: Fr Okt 20, 2006 12:32 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
hi, ich hab gerade das heightmap tutorial durchgearbeitet und irgendwie läuft es net so wie es soll ;) ich sehe nämlich nix.
ich habe ein bmp mit einer größe von 256*256px

eine variable
Code:
  1.  
  2. const
  3.   gridsize = 64;
  4.  


ich verstehe nicht, was in dem tutorial mit mapsize gemeint ist, außerdem sehen meine vektoren ein wenig anders aus, was mich ohnehin noch mehr verwirrt.

im oncreate erzeuge ich meine displayliste:
Code:
  1.  
  2.   hmap := glGenLists(1);
  3.  


ich denke das ist sinnvoller als die heightmap bei jeden renderdurchgang zu berechnen.

und zu berechne ich die heightmap:
Code:
  1.  
  2. procedure TMainForm.GenerateHeightMap(var abmp: TBitmap);
  3. const
  4.   Position: Array[0..3] of Array[0..1] of Byte = ((0,0),(0,1),(1,1),(1,0));
  5. var
  6.   X, Y, Z: LongInt;
  7.   Vertices: Array[0..3] of TVector3D;
  8.  
  9.   procedure DrawTriangle(V1, V2, V3: Integer);
  10.   var
  11.     Normal : TVector3D;
  12.   begin
  13.     Normal := v3d_CrossProduct(v3d_sub(Vertices[V1], Vertices[V2]), v3d_sub(Vertices[V2], Vertices[V3]));
  14.     v3d_Normalize(Normal);
  15.     glNormal3fv(@Normal.x);
  16.     glBegin(GL_TRIANGLES);
  17.       glVertex3fv(@Vertices[V1].x);
  18.       glVertex3fv(@Vertices[V2].x);
  19.       glVertex3fv(@Vertices[V3].x);
  20.     glEnd;
  21.   end;
  22.  
  23. var
  24.   i, j: integer;
  25.   heightmap: array [0..gridsize, 0..gridsize] of Byte;
  26. begin
  27.   for i := 0 to gridsize do
  28.     for j := 0 to gridsize do
  29.       heightmap[i, j] := Trunc(aBmp.Canvas.Pixels[Trunc(i / gridsize * aBmp.Width), Trunc(j /gridsize * aBmp.Height)] / clWhite * 255);
  30.  
  31.   glNewList(hmap, GL_COMPILE);
  32.   for X := 0 to gridsize - 1 do
  33.     for Y := 0 to gridsize - 1 do
  34.     begin
  35.       //Alle Vertieces erzeugen
  36.       for Z := 0 to 3 do
  37.       begin
  38.         Vertices[I].x := (X + Position[I][0]) / gridsize * 1;
  39.         Vertices[I].z := (Y + Position[I][1]) / gridsize * 1;
  40.         Vertices[I].y := HeightMap[X + Position[I][0], Y +Position[I][0]]
  41.       end;
  42.       DrawTriangle(0, 1, 3);
  43.       DrawTriangle(1, 2, 3)
  44.     end;
  45.   glEndList;
  46. end;
  47.  

mnerkwürdig finde ich ebenso, dass der durchlauf einmal bis gridsize und einmal bis gridsize - 1 geht, deshalb habe ich die beiden schleifen noch nicht zusammengefasst, ich könnte mir dann auch das zwischenspeichern in der variable heightmap sparen.

meine vektoren sind records (x, y, z);

naja wie gesagt, zu sehen ist nichts, auch wenn ich die 1 durch 1000 ersetze.

ich hoffe ihr könnt mir helfen und mich ein wenig aufklären, ich habe den grundgedanken verstanden, hätte es aber anders gemacht, ich steige da noch nicht ganz durch. die erste änderung zb die ich schon umgesetzt habe ist die displaylist. des weiteren würde ich die height map in einer größe von 1*1*x wobei 0<x<1 generieren, damit ich sie leicht in meine gewünschte größe skalieren kann.

vielen dank schonmal,

€: ich hab das ganze jetzt nochmal auf meine weise gemacht, erstmal ohne höheninformationen, aber ich sehe immernoch nichts, irgendwas ist da faul:


mfg
Code:
  1.  
  2. procedure TMainForm.GenerateHeightMap(var abmp: TBitmap);
  3. var
  4.   i, j: integer;
  5. begin
  6.   glNewList(hmap, GL_COMPILE);
  7.   for i := 0 to gridsize - 1 do
  8.     for j := 0 to gridsize - 1 do
  9.     begin
  10.       glBegin(GL_TRIANGLE_STRIP);
  11.         glVertex3f(i / gridsize, j / gridsize, 0);
  12.         glVertex3f(i / gridsize, (j + 1) / gridsize, 0);
  13.         glVertex3f((i + 1)  / gridsize, j / gridsize, 0);
  14.         glVertex3f((i + 1) / gridsize, (j + 1) / gridsize, 0);
  15.       glEnd;
  16.     end;
  17.   glEndList;
  18. end;
  19.  


ahja ups hatte net generiert ;)

jetzt probier ich die höheninformationen zu machen ;)

außerdem sind y und z vertauscht ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 20, 2006 15:42 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
so, nun endlich klappt das ganze, jedoch sieht das von der anderen seite ein wenig merkwürdig aus, sprich ich hab löcher drin, warum Oo
Code:
  1.  
  2. const
  3.   gridsize = 64;
  4.  
  5. procedure TMainForm.GenerateHeightMap(abmp: TBitmap);
  6.   function CalcHeight(const i, j: integer): single;
  7.   begin
  8.     result := abmp.canvas.Pixels[abs(round(i * abmp.width / gridsize) - 1),
  9.                                  abs(round(j * abmp.width / gridsize) - 1)] / clwhite;
  10.   end;
  11. var
  12.   i, j: integer;
  13. begin
  14.   glNewList(hmap, GL_COMPILE);
  15.   for i := 0 to gridsize - 1 do
  16.     for j := 0 to gridsize - 1 do
  17.     begin
  18.       glBegin(GL_TRIANGLE_STRIP);
  19.         glColor3F(1, 0, 0); glVertex3f(i / gridsize      , CalcHeight(i    , j)    ,  j      / gridsize);
  20.         glColor3F(0, 1, 0); glVertex3f(i / gridsize      , CalcHeight(i    , j + 1), (j + 1) / gridsize);
  21.         glColor3F(1, 0, 1); glVertex3f((i + 1) / gridsize, CalcHeight(i + 1, j)    ,  j      / gridsize);
  22.         glColor3F(1, 1, 0); glVertex3f((i + 1) / gridsize, CalcHeight(i + 1, j + 1), (j + 1) / gridsize);
  23.       glEnd;
  24.     end;
  25.   glEndList;
  26. end;
  27.  


vielen dank schonmal ;)

mfg


Zuletzt geändert von Seth am Sa Okt 21, 2006 10:31, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 20, 2006 15:44 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
ohne nochmal ins tutorial gesehen zu haben, wird sicherlich einmal die rede von der größe des bitmaps sein und das andere die anzahl der punkte nach denen am ende die karte angezeigt wird - der rest der informationen des bitmaps geht dann verloren.. kann man so machen, ist aber nicht zwingen notwendig.

dann sind die schleifen unterschiedlich, weil im einen werden in heightmap[] in jede reichtung gridsize + 1 informationen aus dem bitmap abgelegt.
die andere schleife ist dann absichtlich anders, weil immer auch auf die nachbarn zugegriffen wird. das ist dann interessant, was an den rändern passiert, weil du keine überhängenden dreiecke erzeugen darfst: sonst greifst du ja aus deinem array heightmap heraus.

was jetzt allerdings deine wesentliche frage sein soll hab ich nicht verstanden, oder war sie das jetzt....?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 20, 2006 16:11 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
naja ich habs ja jetzt selbst gemacht und es funzt soweit, aber wenn man das ganze von einer anderen seite betrachtet sind da löcher drin, warum weiß ich auch net, auf jedenfall sieht das lückenhaft aus :?
Code:
  1.  
  2. procedure TMainForm.GenerateHeightMap(abmp: TBitmap);
  3.   function CalcHeight(const i, j: integer): single;
  4.   begin
  5.     result := abmp.canvas.Pixels[abs(round(i * abmp.width / gridsize) - 1),
  6.                                  abs(round(j * abmp.width / gridsize) - 1)] / $FFFFFF;
  7.   end;
  8.   procedure DrawVertex(const i, j: integer);
  9.   var
  10.     aheight: single;
  11.   begin
  12.     aheight := CalcHeight(i, j);
  13.     glColor3F(aheight, aheight, aheight); glVertex3f(i / gridsize, aheight, j / gridsize);
  14.   end;
  15. var
  16.   i, j: integer;
  17. begin
  18.   glNewList(hmap, GL_COMPILE);
  19.   for i := 0 to gridsize - 1 do
  20.     for j := 0 to gridsize - 1 do
  21.     begin
  22.       glBegin(GL_TRIANGLE_STRIP);
  23.         DrawVertex(i, j);
  24.         DrawVertex(i, j + 1);
  25.         DrawVertex(i + 1, j);
  26.         DrawVertex(i + 1, j + 1);
  27.       glEnd;
  28.     end;
  29.   glEndList;
  30. end;
  31.  


Bild

mfg


Zuletzt geändert von Seth am Sa Okt 21, 2006 10:31, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 20, 2006 21:07 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
es sieht so aus, als wäre der tiefentest nur von vorne, am backface culling liegts nicht, das habe ich schon ausgeschaltet gehabt, ich verstehe nicht woran es liegt, von vorne, oder von oben alles schön, aber von "unten" sieht man durch die vertices durch :shock:

am anhang mal ein screenshot von dem fehler, von der anderen seite sieht es nicht so aus.

mfg


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 22, 2006 08:43 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ich kann mir nicht erklären wo diese löcher herkommen, bitte helft mir :cry:

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 22, 2006 09:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Dieses Bild sieht komisch aus und ich denke gerade bei solchen Fehlern sollten mehere verschiedene Perspektiven als Screenshots gezeigt werden, damit das Problem wirklich zu sehen ist. Ich kann beispielsweise aus dem letzten Bild nicht erkennen, was falsch ist, weil ich da nichtmal eine Heightmap erkenne.

Also wären zwei Bilder mit nur leicht nach links oder rechts verschobener Perspektive praktisch. Die kann ich dann zu einem 3D-Bild wieder zusammenfügen :wink:

Gruß Lord Horazont

_________________
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  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 22, 2006 10:54 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ok ich häng hier mal das projekt an, da kann man das denke ich gut sehen. mit datei->Heightmap laden kannst du eine heightmap aus dem programmverzeichniss öffnen und dann gucken.

download:

http://www.exec-dev.de/demo.rar

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 24, 2006 12:20 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ich weiß nicht ob die löcher von meinem code kommen oder ob das durch äußere einflüsse verursacht wird, auf jedenfall mache ich was falsch ;) wäre toll wenn sich das jemand mal ansieht :D

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 28, 2006 12:32 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
keine macht den dreckspushern :idea: :roll:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 30, 2006 19:13 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Öhm... Löcher...Hmmm...

Einerseits hab ich mal im Ramen von LOD hier bei DGL was von Löchern gelesen. Weiß nicht ob es dich betrifft. Falls das Bild da oben dein Problem ist, dann seh ich maximal z-Fighting. Und das bekommst du über den Tiefenpuffer weg. Siehe Wiki zu Z-Fighting.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 30, 2006 19:53 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Z-Fighting sieht dem schon sehr ähnlich, ich bekomms aber net gefixt :(

hier mal bissl mehr code:
Code:
  1.  
  2. unit UMain;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, dglOpengl, glBitmap, UVector3D;
  9.  
  10. const
  11.   NearClipping = 1;
  12.   FarClipping  = 1000;
  13.  
  14. const
  15.   gridsize = 64;
  16.  
  17. type
  18.   TMainForm = class(TForm)
  19.     procedure FormShow(Sender: TObject);
  20.     procedure FormResize(Sender: TObject);
  21.     procedure FormDestroy(Sender: TObject);
  22.     procedure FormCreate(Sender: TObject);
  23.   private
  24.     DC: HDC;
  25.     RC: HGLRC;
  26.     CalcTime,
  27.     Frequency: int64;
  28.     Timestep: single;
  29.     hmap: TGluint;
  30.     rotation: single;
  31.     procedure SetupOpenGL;
  32.     procedure IdleHandler(Sender: TObject; var Done: Boolean);
  33.     procedure CalcTimestep;
  34.   public
  35.     procedure GenerateHeightMap(abmp: TBitmap);
  36.   end;
  37.  
  38. var
  39.   MainForm: TMainForm;
  40.  
  41. implementation
  42.  
  43. uses UHeightmap;
  44.  
  45. {$R *.dfm}
  46.  
  47. procedure TMainForm.GenerateHeightMap(abmp: TBitmap);
  48.   function CalcHeight(const i, j: integer): single;
  49.   begin
  50.     result := abmp.canvas.Pixels[abs(round(i * abmp.width / gridsize) - 1),
  51.                                  abs(round(j * abmp.width / gridsize) - 1)] / $FFFFFF;
  52.   end;
  53.   procedure DrawVertex(const i, j: integer);
  54.   var
  55.     aheight: single;
  56.   begin
  57.     aheight := CalcHeight(i, j);
  58.     glColor3F(aheight, aheight, aheight); glVertex3f(i / gridsize, aheight, j / gridsize);
  59.   end;
  60. var
  61.   i, j: integer;
  62. begin
  63.   glNewList(hmap, GL_COMPILE);
  64.   for i := 0 to gridsize - 1 do
  65.     for j := 0 to gridsize - 1 do
  66.     begin
  67.       glBegin(GL_TRIANGLE_STRIP);
  68.         DrawVertex(i, j);
  69.         DrawVertex(i, j + 1);
  70.         DrawVertex(i + 1, j);
  71.         DrawVertex(i + 1, j + 1);
  72.       glEnd;
  73.     end;
  74.   glEndList;
  75. end;
  76.  
  77. procedure TMainForm.SetupOpenGL;
  78. begin
  79.   glClearColor(0, 0, 0, 0);
  80.   glEnable(GL_DEPTH_TEST);
  81.   glEnable(GL_CULL_FACE);
  82. end;
  83.  
  84. procedure TMainForm.FormCreate(Sender: TObject);
  85. begin
  86.   if not QueryPerformanceFrequency(Frequency) then
  87.     Application.Terminate;
  88.   QueryPerformanceCounter(CalcTime);
  89.  
  90.   DC := GetDC(Handle);
  91.   if not InitOpenGL then
  92.     Application.Terminate;
  93.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  94.   ActivateRenderingContext(DC, RC);
  95.  
  96.   hmap := glGenLists(1);
  97.  
  98.   rotation := 0;
  99.  
  100.   Application.OnIdle := IdleHandler;
  101. end;
  102.  
  103. procedure TMainForm.FormDestroy(Sender: TObject);
  104. begin
  105.   DeactivateRenderingContext;
  106.   DestroyRenderingContext(RC);
  107.   ReleaseDC(Handle, DC);
  108. end;
  109.  
  110. procedure TMainForm.FormResize(Sender: TObject);
  111. var
  112.   tmpBool : Boolean;
  113. begin
  114.   glViewport(0, 0, ClientWidth, ClientHeight);
  115.   glMatrixMode(GL_PROJECTION);
  116.   glLoadIdentity;
  117.   gluPerspective(45.0, ClientWidth / ClientHeight, NearClipping, FarClipping);
  118.  
  119.   glMatrixMode(GL_MODELVIEW);
  120.   glLoadIdentity;
  121.   IdleHandler(Sender, tmpBool);
  122. end;
  123.  
  124. procedure TMainForm.CalcTimestep;
  125. var
  126.   CurrTime: int64;
  127. begin
  128.   QueryPerformanceCounter(CurrTime);
  129.   Timestep := (CurrTime - CalcTime) / Frequency;
  130.   CalcTime := CurrTime;
  131. end;
  132.  
  133. procedure TMainForm.IdleHandler(Sender: TObject; var Done: Boolean);
  134. begin
  135.   CalcTimestep;
  136.   rotation := rotation + (360 / 4) * timestep;
  137.   if rotation >= 360 then
  138.     rotation := rotation - 360;
  139.  
  140.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  141.   glViewport(0, 0, ClientWidth, ClientHeight);
  142.   glMatrixMode(GL_PROJECTION);
  143.   glLoadIdentity;
  144.   gluPerspective(45, ClientWidth / ClientHeight, NearClipping, FarClipping);
  145.   glMatrixMode(GL_MODELVIEW);
  146.   glLoadIdentity;
  147.  
  148. //  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  149.  
  150.   gluLookAt(0, 0, 0, -5, -5, -15, 0, 1, 0);
  151.   glpushmatrix;
  152.     glTranslatef(-5, -5, -15);
  153.     glScalef(10, 10, 10);
  154.     glRotatef(20, 1, 0, 0);
  155.     glRotatef(rotation, 0, 1, 0);
  156.     glTranslatef(-0.5, -0.5, -0.5);
  157.     glCallList(hmap);
  158.   glpopmatrix;
  159.  
  160.   SwapBuffers(DC);
  161.   Done := false;
  162. end;
  163.  
  164. procedure TMainForm.FormShow(Sender: TObject);
  165. begin
  166.   left := 0;
  167.   top := 0;
  168.   Heightform.show;
  169. end;
  170.  
  171. end.
  172.  


vielleicht liegt es daran, dass mein objekt zuerst klein ist und ich es dann skaliere ? weil es scheinen ja auch weiter entfernte polygone durch Oo


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 06, 2006 17:50 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
problem immer noch net gelöst :(

€: wenn ich ne textur hab gehts, erstrecht wenn ich dann backface culling ausmache :P

mfg


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 14 Queries | GZIP : On ]