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

Aktuelle Zeit: Mi Jul 16, 2025 16:41

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Laden einer Heightmap
BeitragVerfasst: Di Feb 22, 2005 14:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
Code:
  1. procedure SceneRender(map:TMap);
  2. var i,k:integer;
  3.     value:integer;
  4.     HM:THeightMap;
  5. begin
  6.  setlength(HM,map.HeightMap.Width);       //
  7.  for i:= 0 to high(HM) do                 // Heightmap-Array initialisieren
  8.   setlength(HM[i],map.HeightMap.Height);  //
  9.  
  10.  for i:= 0 to map.HeightMap.Width do
  11.   for k := 0 to map.HeightMap.Height do
  12.    begin
  13.    value:=map.HeightMap.Canvas.Pixels[i,k];
  14.    HM[i,k]:=hextoint(copy(inttohex(value,6),0,2)) div 10; // HIER DER FEHLER
  15.       //^Rot-Wert wird zur Höhe^
  16.    end;
  17.  
  18.  glbegin(GL_TRIANGLE_STRIP);
  19.    glvertex3i(0,HM[0,0],0);
  20.    glvertex3i(0,HM[0,1],1);
  21.    glvertex3i(1,HM[1,1],1);
  22.   for i:= 1 to high(HM) do  //hier natürlich auch fehler.....
  23.    for k:= 0 to high(HM[0]) div 2 do //nur alle 2 zeilen neuen tri-strip!
  24.     begin
  25.      glvertex3i(i,HM[i,k],k);
  26.      glvertex3i(i+1,HM[i+1,k+1],k+1);   // ...wegen dem i+1 hier.
  27.     end;
  28.  glend;
  29.  
  30. end;


ich benutze diese prozedur, um eine heightmap aus den rot-werten eines Bitmap zu laden.

sobald ich sie aufrufe, wirft er mit eine access violation in der oben markierten zeile vor(die selbstgeschriebene hextoint-funktion funktioniert, hab ich ausgiebig getestet.). es muss ja so sein, dass mein array HM noch nicht lang genug ist. aber ich initialisiere ihn ja in den drei zeilen ganz am anfang. sogar mit einem element overhead. wo liegt mein fehler bzw. gibt es einen?

mfg
luke

edit:attachment gelöscht, weil problem behoben.

_________________
Bild

"User Error. Replace User and hit Continue."


Zuletzt geändert von luketheduke am Di Feb 22, 2005 15:46, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 22, 2005 15:35 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
Servus,

wenn THeightMap lediglich ein Dynamisches 2D Array ist, dann ist der Fehler relativ einfach: Du läufst genau um eines über Deine Array-Grenze hinaus.

Code:
  1.  
  2. setlength(HM,map.HeightMap.Width);       //
  3. for i:= 0 to high(HM) do                 // Heightmap-Array initialisieren
  4.   setlength(HM[i],map.HeightMap.Height);  //
  5.  

Hier funktioniert es, weil Du mit High(HM) die obere Grenze abfragst.

Code:
  1.  
  2. for i:= 0 to map.HeightMap.Width do
  3.   for k := 0 to map.HeightMap.Height do
  4.    begin
  5.    value:=map.HeightMap.Canvas.Pixels[i,k];
  6.    HM[i,k]:=hextoint(copy(inttohex(value,6),0,2)) div 10; // HIER DER FEHLER
  7.       //^Rot-Wert wird zur Höhe^
  8.    end;
  9.  

Hier funktioniert es nicht mehr. Dein Array geht ja nur (per Definition der Dynamischen Arrays) von 0..Width-1 resp. Height-1, da Du ja Width resp. Height Elemente anforderst.

Damit es also funktioniert, mußt Du Deine Schleife wie folgt schreiben:

Code:
  1.  
  2. for i := 0 to map.HeightMap.Width-1 do
  3.   for k := 0 to map.HeigtMap.Height-1 do
  4. [...]
  5.  


oder Du arbeitest wieder mit Low(HM) resp. High(HM) wie oben auch schon.

Grüße

Wolf

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 22, 2005 15:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Genau. Blechwolf war schneller. Ich habe aber noch ein paar andere Sachen.

Das initialisieren des 2D Array kannst du auch mittels SetLength(HM, Width, Height); erledigen. Geht einfacher und wahrscheinlich auch noch schneller.

Das Extrahieren des Rotanteiles mittels Stringoperationen ist die wohl schlechteste Möglichkeit das zu machen. Also lass das!
Viel einfacher ist er in dem du einfach den entsprechenden Wert aus dem Integer extrahierst. Das geht in dem du die Methode GetRValue aufrufst oder in dem du Value and $FF machst. Das Ergebnis ist ein Byte welches nur die letzten 8 Bits beinhält. Dazu sind absolut keine Stringoperationen nötig.

PS: Das Div 10 bei der Höhe würde ich weglassen und anstelle die Ausgabe in OpenGL um den Faktor 10 kleiner machen. Dabei hast du dann eine höhere Genauigkeit und die Größe bleibt auch gleich.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 22, 2005 15:40 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
aaahh....... *Anfängerfehler :oops: *

EDIT: es geht jetzt sogar... hatte übrigens das ganze nochmal in der oben markierten zeile.


EDIT2: jetzt bräuchte ich noch was, damit ich die dreiecke umranden kann. geht das einfach? ich kann auf jeden fall gl_lines oder so hernehmen. aber das ist ja blöd, wenn ich dann ne komplette renderschleife brauch.

edit3: ich habs einfach gemacht. und siehe da - das erste brauchbare ergebnis!

danke für alles!

EDIT4: @lossy: ausgabe um 10 kleiner machen: das heisst, im glvertex-befehl durch 10 teilen? oder glscale?


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

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 22, 2005 19:58 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
*sry für doppelpost*

ich steh grad auf dem schlauch....

nochmal mein rendervorgang:
Code:
  1.  
  2. glbegin(GL_TRIANGLE_STRIP);
  3.    glcolor3f(0,1,0);
  4.    glvertex3i(0,HM[0,0],0);
  5.    glvertex3i(0,HM[0,1],1);
  6.    glvertex3i(1,HM[1,1],1);
  7.   for i:= 1 to high(HM)-1 do
  8.    for k:= 0 to high(HM[0]) div 2 do //nur alle 2 zeilen neuen tri-strip!
  9.     begin
  10.  
  11.      glcolor3f(0,HM[i,k] / 2.55,0);
  12.      glvertex3i(i,HM[i,k],k);
  13.      glvertex3i(i+1,HM[i+1,k+1],k+1);
  14.     end;
  15.  glend;


damit wird natürlich nur die hälfte meiner karte gerendert,. wie schaffe ich es jetzt, durch mein ganzes array zu kommen, ohne irgendwelche kalamitäten?
wenn ich das div 2 einfach weglasse, geht es ja auch nicht.

ps: im guten alten QBasic hätt mich das nur ein kleines
Code:
  1. for i% = 0 to high(HM[0]) step 2
gekostet....

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 22, 2005 20:11 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
zwei möglichkeiten: die for schleeifen durch while schleifen ersetzen oder beim zugriff aufs array die zugriffsvariable mit 2 multiplizieren. schneller sit die variante mit dem while.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 22, 2005 20:16 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
while: schon mal versucht. da muss ich aber soviel hirnen ;) . am besten from the scrap neumachen, den code im ersten post umschreiben schaff ich sowieso nicht....

mit zwei multiplizieren: schon probiert, aber wohl n bisschen zu dilettantisch -> eine Accessviolation nach der anderen.

ansonsten: thx

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 22, 2005 22:32 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
und ich sehe dem programm sogar bei kurzem ansehen an, warum dem so ist...

glvertex3i(i+1,HM[i+1,k+1],k+1);

wenn du immer auch auf die nexten vertices zugreifst, dann darfst du nicht mit deiner for schleife bis zu den letzten vertices hintergehen, weil du dann immernoch eines weiter nach vorne greifst - und damit raus aus den arraygrenzen. also bei den schleifen noch einen weiteren index abziehen. sonst kann man, wenn man das noch nicht aus dem stehgreif sieht, auch den debugger benutzen. und damit es nicht jedesmal erklärt werden muss, habe ich einst auch mal ein tutorial dazu geschrieben: http://www.delphigl.com/script/do_show. ... r&action=2 schaus dir an, evtl kommst du danach besser zurecht.
edit: und noch ein kleiner tipp zum übersetzen von for in while:
Code:
  1.  
  2. for i := a to b do
  3.  

ist
Code:
  1.  
  2. i := a;
  3. while i <= b do
  4. begin
  5.   ...
  6.   i := i + 1;
  7. end;
  8.  

udn mit zweiersteps entsprechend i := i + 1 in i := i + 2 wechseln.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 23, 2005 14:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
das mit dem vorgreifen ist mir klar. ich hab da ja auch 0 to high(hm)-1 gehabt.

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 23, 2005 16:20 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
so. jetzt hab ich

Code:
  1. glbegin(GL_TRIANGLE_STRIP);
  2.    glcolor3f(0,1,0);
  3.    glvertex3i(0,HM[0,0],0);
  4.    glvertex3i(0,HM[0,1],1);
  5.    glvertex3i(1,HM[1,1],1);
  6.     i:=0;k:=0;
  7.   while ((i < (length(HM)-2)) and (k < (length(HM)-2))) do
  8.    begin
  9.     glcolor3f(0,HM[i,k] / 2.55,0);
  10.     glvertex3i(i,HM[i,k],k);
  11.     glvertex3i(i+1,HM[i+1,k+1],k+1);
  12.     i:=i+1;k:=k+2;
  13.     iterations:=iterations+1;
  14.    end;
  15.  glend;


es funtkioniert aber nicht. er rendert nur ein dreieck, obwohl iterations auf ca. 80 hochgeht.

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 17:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
das ist jetzt der letzte doppelpost. es funktioniert nämlich. :D :D :D

womit ich einen topic in der projektsection aufmachen werde!

dort seht ihr dann auch den screenshot.

===> dieses topic kann geschlossen werden.

_________________
Bild

"User Error. Replace User and hit Continue."


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


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.014s | 16 Queries | GZIP : On ]