Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Facharbeit - 3D Topographie anzeigen (https://www.delphipraxis.net/60462-facharbeit-3d-topographie-anzeigen.html)

Ravager 7. Jan 2006 03:36


Facharbeit - 3D Topographie anzeigen
 
Hallo zusammen,
wegen meiner Facharbeit hab ich mit Delphi angefangen - bin also noch nicht so der Bringer in der Sprache. Programmieren tu ich schon eine Weile, aber Delphi ist noch etwas undurchsichtig :)

aaaalso. Meine Facharbeit muss eine Topographie anzeigen können. Ich habe also x, y und Höheninformationen in einem Array:

data_dst_light : Array[0..150,0..150] of Integer;

Eine schöne 3D Ansicht der ganzen Sache würde dem Benutzer sicher Spass machen - am Besten mit Druckfunktion oder Speichern als bmp/jpg/...
Wichtig ist noch: Ich baue einen scanner. Also das array ist nicht voll sondern wird stück für stück aufgebaut. meistens ist es also nur ein
data_dst_light : Array[0..3,0..50] of Integer;
oder so etwas ;)

dafür gibt es ein zweites array
data_dst_set : Array[0..150,0..150] of Byte;
das angibt, ob die jeweilige Koordinate von Relevanz ist.

Es gilt: X und Y starten bei 0 und der letzte X-Wert in jeder Zeile ist bei xMax und der letzte Y-Wert in jeder Spalte ist bei yMax.
In dem Array ist also ein Rechteck beschrieben (weiß nicht, wie ich es besser ausdrücken soll).


Bei meiner Suche bin ich auf das Chart Steuerelement gestoßen. Ich weiß aber nicht, ob das für meine Visualisierung geeignet ist. Vielleicht kennt jemand ein Tutorial zu dem Steuerelement? Oder kann mir anderweitig helfen?

Problematisch ist noch der Zeitfaktor: ich muss in 7-10 Tagen fertig sein. Ergo: bitte die am wenigsten Komplexe Lösung :mrgreen: , das Chart sieht mir schon recht happig aus...

hoffe, alles ist verständlich beschrieben,

gn8
!Ravager

Robert Marquardt 7. Jan 2006 05:29

Re: Facharbeit - 3D Topographie anzeigen
 
Betrachte das Array als Gitter. Jetzt malt man einfach von hinten nach vorne die Vierecke.
Der Trick besteht in der perspektivischen Abbildung des Vierecks und der Einfaerbung.
Leider verstehe ich davon nicht allzuviel. Da sollte mal ein 3D-Grafikspezialist helfen.

DGL-luke 7. Jan 2006 10:34

Re: Facharbeit - 3D Topographie anzeigen
 
Ist zur Stelle ;)

Heightmaps rendern ist eine meiner leichtesten Übungen:
http://www.delphipraxis.net/internal...=463328#463328

Da steht schon ein Beispielcode von mir für OpenGL.

Für alles andere rund um OpenGL empfehle ich

http://delphigl.com/
http://delphigl.com/forum
http://wiki.delphigl.com
http://wiki.delphigl.com/Tutorial

:thumb:

EDIT: Durch Download des DGL SDK und einfügen meines Beispielcodes in das OpenGL-1.5-Template sollte sich das ganze eigentlich als die am wenigsten komplizierte Lösung herausstellen.

Du kannst übrigens evtl. auch eine 2d-Ansicht von oben erstellen, indem du die Höheninformation als Grauwert nimmst ;)

EDIT2: eigentlich reicht http://www.delphigl.com/do_download.php?f=8 (Template) und http://www.delphigl.com/do_download.php?f=12000 (Header)...

turboPASCAL 7. Jan 2006 10:51

Re: Facharbeit - 3D Topographie anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Ravager
... hab ich mit Delphi angefangen - bin also noch nicht so der Bringer ... Programmieren tu ich schon eine Weile, aber Delphi ist noch etwas undurchsichtig ...

... ich muss in 7-10 Tagen fertig sein. Ergo: bitte die am wenigsten Komplexe Lösung, das Chart sieht mir schon recht happig aus...

GlScene
...sollte auch noch erwämnt werden. Eine Komponentensammlung zum einfachen erstellen von 3D-Graphik in OpenGl die nicht viel Programmierkentnisse erfordert und sich schnell implementieren lässt.

Robert Marquardt 7. Jan 2006 11:33

Re: Facharbeit - 3D Topographie anzeigen
 
Ich seh eigentlich keinen Grund bei einer 150x150 Matrix, die man nur einmal malt gleich mit OpenGL zu werfen.
Das sollte sich doch mit einer Matrixtransformation fuer die Projektion der Vierecke und dem Normalen-Vektor fuer die Farbe erschlagen lassen.
Terragen malt das doch auch ohne OpenGL.

Ganz abgesehen davon das man davon lernt wie es funktioniert.

Ravager 7. Jan 2006 14:22

Re: Facharbeit - 3D Topographie anzeigen
 
hey leute,


danke für eure schnellen Antworten. Allerdings kann ich wohl kaum davon ausgehen, dass auf allen Rechnern an unserer Schule OpenGL läuft/installiert ist. Gibt es denn noch andere weniger bonzige Lösungen?

über das Chart selbst hat noch keiner von euch geschrieben?! Ist das ne schmarrn idee?

Die Geschwindigkeit von OpenGL ist für mich uninteressant, da nur etwa alle 4-5 sek gerendert werden muss ^^

ich sehs mir trotzdem mal an... :)

DGL-luke 7. Jan 2006 14:54

Re: Facharbeit - 3D Topographie anzeigen
 
wenn die Geschwindigkeit eh wurscht ist, kannst dus auch mit OpenGL machen, ein Softwaretreiber ist bei Windows standardmäßig dabei. Ausserdem gibts auch noch den "Mesa"-Treiber, auch ein Softwaretreiber für OpenGL. Kenn mich mit dem aber nicht aus.

Master of the Wind 7. Jan 2006 14:57

Re: Facharbeit - 3D Topographie anzeigen
 
wenn es nicht sehr exakt sein soll, dann kannst du ja auch eine Mogellösung nehmen ;) du benutz die höhenwerte als helligkeitswerte oder graustufenwerte malst so eine Bitmap. Das wäre die Karte von oben. und dann verzerrst du die Bitmap einfach so schräg nach hinten, was ja auch nicht schwierig ist, ist ein bisschen mathematik aber net viel :). Ja das würde dann auch eine art 3D effekt geben. :)

mfg Master of the wind.

PS.: OpenGL is klasse :D

Ravager 7. Jan 2006 15:01

Re: Facharbeit - 3D Topographie anzeigen
 
okay, ich hab mir die Sache mal angeguggt.
Das mit den Graustufen und 2D-Ansicht hab ich schon.

Es geht jetzt wirklich um 3D!

GLScene gefällt mir. Das macht was her...
Nur mit durchklicken kommt man aber ned weit - ;) ich schau mir mal die DOCs an.

runger 7. Jan 2006 15:19

Re: Facharbeit - 3D Topographie anzeigen
 
Hallo DGL-luke,

du hats jetzt bereits zum x-ten Mal auf deinen opengl Code verwiesen, sei doch bitte so freundlich
und leg ein einfaches Beispiel (D7) bei.
Ich hab den Verdacht, dass dieser Code, so wie du ihn gepostet hast noch nie gelaufen ist.
Selbst wenn man die Fehler raus macht, die in diesem Codeschnipsel drin sind, liefert das keinerlei brauchbare Ergebnisse ( zumindest bei mir nicht ).
Opengl läuft anderer Code funktioniert einwandfrei.

Rainer

DGL-luke 7. Jan 2006 15:32

Re: Facharbeit - 3D Topographie anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
hm... ich hab den aus einem meiner Projekte kopiert. Aber ich werde das natürlich sofort überprüfen.

EDIT: tatsächlich... :wall:
hier das ganze in verbessert und getestet:

Delphi-Quellcode:
type Single2dArray = array of array of single;

function BuildDL(heightmap: Single2dArray; scalexy,scalez:single): integer;
var i,k,t:integer;
begin
result := glGenLists(1); //eine DL, bitte!

glNewlist(result, GL_COMPILE); //jetzt gehts los!
  t := round((length(heightmap) div 2) * scalexy);
  gltranslatef(-t,-t,0); // In die Mitte verschieben
  glbegin(gl_triangles);
  glcolor3f(255,0,0);
  for i:=1 to length(heightmap)-2 do // ich greife auch auf i-1 und i+1 zu!
    for k := 1 to length(heightmap[i])-2 do // ich greife auch auf k-1 und k+1 zu!
      begin
        //erstes dreieck
        glVertex3f(i * scalexy,    k * scalexy,    heightmap[i,k] * scalez);
        glVertex3f((i-1) * scalexy, (k) * scalexy,  heightmap[i-1,k] * scalez);
        glVertex3f(i * scalexy,    (k+1) * scalexy, heightmap[i,k+1] * scalez);
        //zweites dreieck
        glVertex3f((i-1) * scalexy, k * scalexy,    heightmap[i-1,k] * scalez);
        glVertex3f((i-1) * scalexy, (k-1) * scalexy, heightmap[i-1,k-1] * scalez);
        glVertex3f((i+1) * scalexy, (k+1) * scalexy, heightmap[i+1,k+1] * scalez);
      end;
  glend;
  glcolor3f(255,255,255);
glEndList;
end;
Im Anhang ein kleines Beispielprogramm. Benötigt dglopengl.pas.

Ravager 7. Jan 2006 15:48

Re: Facharbeit - 3D Topographie anzeigen
 
wie dem auch sei, könnma bissi runterbremsen?
ich krieg nedmal das GLScene installiert :wall:


gaanz langsam:
ich lade GLScene_v09b_Full.zip und entpacke in einen ordner
dann öffne ich delphi7/GLScene7.dpk
und drücke auf Install
Fehlermeldung: GLScene.inc fehlt
GLScene.inc ist im Source Ordner
also kopiere ich GLScene.inc von dem Source Ordner in delphi7-Ordner
und drücke auf Install
es kommt eine Meldung, dass alles installiert wurde (FMOD hab ich auch noch installiert, aber das sollte egal sein)
nach der Anleitung ( http://caperaven.co.za/gls/onlinedoc...stallation.htm ) könnten jetzt nur noch die directories fehlen
[After installing the package some files require accessability by Delphi. This is done by placing the Path to the files in the Program Options Directories Source form.]
da kapier ich aber nicht, was die von mir wollen.
Wo soll ich welche Ordner einstellen??? "Program Options Directories Source form"? keine Ahnung, wo das sein soll...

Auf jeden Fall ist die Installation so noch nicht abgeschlossen - [Fatal Error] Unit1.pas(6): File not found: 'GLScene.dcu'
was wollen die also von mir?

sorry wenn ich mich da bissi blöd stell, aber das mit dem Installieren hab ich noch nie kapiert, :mrgreen:

DGL-luke 7. Jan 2006 16:38

Re: Facharbeit - 3D Topographie anzeigen
 
Ich nehme an, dass du den ordner, in dem die glscene.pas liegt, einfach in die bibliothek aufnehmen musst.

Also In Delphi ins Mainmenu, tools->umgebungsoptionen->bibliothek, und da den entsprechenden pfad dazutun.

Ravager 7. Jan 2006 20:06

Re: Facharbeit - 3D Topographie anzeigen
 
okay, das wars... glScene ist installiert - das war ein harter Brocken :oops:

allerdings sind mir die Tutorials viel zu wenig zielgerichtet (Zeitknappheit). Ich brauche also so eine Heightmap aus dem Array, ne Kamera (die per maus + rad einstellbar ist), ne Lampe und die Möglichkeit das alles als bmp abzuspeichern.
Gerendert werden soll in einem bestimmten Bereich. Dafür ist das GLSceneViewer, oder?
Gibt es irgendwo eine Art Tutorial, das in etwa auf das hinführt und mich von Fog, Fire, Sprites, Textures, Hud, usw verschont? :mrgreen:

@TubroPascal: wo finde ich den Quellcode zu der exe - das kommt doch ziemlich genau an das hin, was ich bräuchte ^^ ?

DGL-luke 7. Jan 2006 20:14

Re: Facharbeit - 3D Topographie anzeigen
 
In Bitmap speichern sollte ganz einfach sein:

Delphi-Quellcode:
procedure SaveToBMP(Heightmap: Single2dArray; filename: string);
var bmp : TBitmap;
    i,k : Integer;
begin
bmp := TBitmap.create;
try
bmp.width := length(HeightMap);
bmp.Height := length(Heightmap[0]);

for i := 0 to bmp.width -1 do
  for k := 0 to bmp.height -1 do
    bmp.pixels[i,k] := RGB(Heightmap[i,k],HeightMap.[i,k],HeightMap.[i,k]);

bmp.savetofile(filename);
finally
bmp.free;
end;
end;
sorry wegen der formatierung ;)

turboPASCAL 7. Jan 2006 23:45

Re: Facharbeit - 3D Topographie anzeigen
 
Zitat:

Zitat von Ravager
@TubroPascal: wo finde ich den Quellcode zu der exe - das kommt doch ziemlich genau an das hin, was ich bräuchte ^^ ?

Kann ich anhängen, will den aber noch etwas umbauen...

Ravager 8. Jan 2006 01:10

Re: Facharbeit - 3D Topographie anzeigen
 
okay wär genial,


wegen saveToBMP:
ich möchte, dass ein Screenshot gespeichert wird. Also so, wie mein Anzeigeelement (GLSceneViewer?) das Bild gerade rendert (Licht, Kamera), soll es in eine datei abgespeichert werden.

Die Funktion sieht eher so aus, als ob sie ein kleines bmp erzeugt mit den Farbwerten, die das array zurückliefert... oder check ichs wieder nicht?

DGL-luke 8. Jan 2006 11:32

Re: Facharbeit - 3D Topographie anzeigen
 
jupp, genauso siehts aus ;)

zu screenshot machen in OpenGL solltest du im DelphiGL-Forum genug finden, wie das mit GLScene geht, weiss ich nicht.

turboPASCAL 8. Jan 2006 13:13

Re: Facharbeit - 3D Topographie anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Bitte.
Zitat:

Zitat von Ravager
Die Funktion sieht eher so aus, als ob sie ein kleines bmp erzeugt mit den Farbwerten, die das array zurückliefert...

Kann man, muss aber nicht. ;)

Ravager 8. Jan 2006 14:11

Re: Facharbeit - 3D Topographie anzeigen
 
leute... ich kapiers ned,
Dein code läuft bei mir grad ned
Seither hab ich: Neugestartet -.-

Ich hab jetzt das gesamte GLScene gelöscht und aus der Component-Liste rausgeschmissen. Dann die neue beta-Version installiert. Keine Änderung...

Fehlermeldungen

Klassen nicht gefunden:
tglSceneViewer
tglScene
tglCadencer
tglWindowsBitmapFont
...

Außerdem werden alle möglichen dcu files nicht gefunden, wechselt aber immer
objects.dcu
vectorgeometry.dcu
...
keine Ahnung, was ich falsch mache.


==> Panik, Verzweiflung, Suizidgedanken, ...


ich werde jetzt erstmal Delphi komplett ermorden und neu installieren, dann die normale Versio (nicht beta) von GLScene so installieren wie beim letzten Mal.
Danach besauf ich mich...

DGL-luke 8. Jan 2006 14:41

Re: Facharbeit - 3D Topographie anzeigen
 
Immer mit der Ruhe ;)

Wenn Delphi etwas nicht findet, liegt das meist daran, dass du ihm nicht sagst, wo es suchen soll ;)

Prüf einfach noch mal ob du alles im Bibliothekspfad hast.

PS: wenn es x.dcu nicht findet, dann such einfach nach x.pas - das hat was mit vorkompiliertem zeug zu tun, muss dich aber jetzt nicht weiter belasten ;)

arbu man 8. Jan 2006 14:47

Re: Facharbeit - 3D Topographie anzeigen
 
So macht man einen screenshor in glscene:
Delphi-Quellcode:
procedure Tform1.RenderToBitmap(scale : Single;filename:string);
var
   bmp : TBitmap;
   pt : Int64;
   delta : Double;
begin
   pt:=StartPrecisionTimer;
   // Rendering to a bitmap requires an existing bitmap,
   // so we create and size a new one
   bmp:=TBitmap.Create;
   // Don't forget to specify a PixelFormat, or current screen pixel format
   // will be used, which may not suit your purposes!
   bmp.PixelFormat:=pf24bit;
   bmp.Width:=Round(GLSceneViewer1.Width*scale);
   bmp.Height:=Round(GLSceneViewer1.Height*scale);
   // Here we just request a render
   // The second parameter specifies DPI (Dots Per Inch), which is
   // linked to the bitmap's scaling
   // "96" is the "magic" DPI scale of the screen under windows
   GLSceneViewer1.Buffer.RenderToBitmap(bmp, Round(96*scale));
   delta:=StopPrecisionTimer(pt);
   bmp.savetofile(filename);
   bmp.Free;
end;

// aufruf
RenderToBitmap(1,'C:\test.bmp');

turboPASCAL 8. Jan 2006 16:16

Re: Facharbeit - 3D Topographie anzeigen
 
:!:
Zitat:

Zitat von DGL-luke
Prüf einfach noch mal ob du alles im Bibliothekspfad hast.

Siehe dazu: http://www.glscene.de/viewtopic.php?p=54#54

Pfade die gesetzt werden müssen/sollten:
Code:
$(Delphi)\Projects\GLScene\Source
$(Delphi)\Projects\GLScene\Source\Base
$(Delphi)\Projects\GLScene\Source\CgShaders
$(Delphi)\Projects\GLScene\Source\DesignTime
$(Delphi)\Projects\GLScene\Source\FileFormats
$(Delphi)\Projects\GLScene\Source\GameAPIs
$(Delphi)\Projects\GLScene\Source\PhysicsAPIs
$(Delphi)\Projects\GLScene\Source\Platform
$(Delphi)\Projects\GLScene\Source\PlugIn
$(Delphi)\Projects\GLScene\Source\ScriptingAPIs
$(Delphi)\Projects\GLScene\Source\Shaders
$(Delphi)\Projects\GLScene\Source\SoundAPIs
$(Delphi)\Projects\GLScene\Source\VideoAPIs
$(Delphi) Ist eine vordef. Variable (von Delphi) die den Path zu Delphi angibt zB.: C:\Programme\Borland\Delphi6

In dem Beispiel befinden sich die Komponenten von GLScene im Ordner:
C:\Programme\Borland\Delphi6\Projects\GLScene

Gegebenenfalls die Clean.bat im Ordner von GLScene ausführen um alle vorh. *.dcu's zu löschen.

Ravager 8. Jan 2006 16:26

Re: Facharbeit - 3D Topographie anzeigen
 
mein Projects Ordner ist aber nach der installation noch leer. Oder hätte ich da alls hin entpacken sollen? Davon stand nämlich nix in der Installationsanleitung?


ich hab folgendes gemacht:
Starte Highfield\Project1.dpr
:arrow: Klassen nicht gefunden (war ja klar)
Entpacke Archiv GLScene_v09b_Full.zip
Öffne Delphi7\GLScene7.dpk
Klicke auf Install
:arrow: [Fatal Error] GLCrossPlatform.pas(20): File not found: 'GLScene.inc'
Kopiere GLScene.inc von Source\ nach Delphi7\
Klicke wieder auf Install von GLScene7.dpk
:arrow: msgBox mit vielen neuen Installationen
Starte Highfield\Project1.dpr
:arrow: Error reading GLSceneViewer1.FieldOfView: Property FieldOfView does not exist.
:arrow: einige Klassen nicht gefunden
Klicke im Kontextmenü in Delphi auf Tools/Environment Options/Library

Wähle ich unter Library Path oder Browsing Path?

arbu man 8. Jan 2006 16:34

Re: Facharbeit - 3D Topographie anzeigen
 
Nimm den Library Path

turboPASCAL 8. Jan 2006 17:06

Re: Facharbeit - 3D Topographie anzeigen
 
Zitat:

Zitat von Ravager
ich hab folgendes gemacht:
Starte Highfield\Project1.dpr
:arrow: Klassen nicht gefunden (war ja klar)
Entpacke Archiv GLScene_v09b_Full.zip
Öffne Delphi7\GLScene7.dpk
Klicke auf Install
:arrow: [Fatal Error] GLCrossPlatform.pas(20): File not found: 'GLScene.inc'
Kopiere GLScene.inc von Source\ nach Delphi7\
...

- Erstelle dir in deinem Projects Ordner ein neues Verzeichnis mit einem neuen Namen zB. MeineKomponenten
- EntPacke GLScene_v09b_Full.zip in den Ordner MeineKomponenten/GLScene
- füge alle Pfadangaben den Delphi-Bibliothekspfad hinzu
z.B.:
C:\Programme\Borland\Delphi7\Projects\MeineKompone nten\GLScene
oder:
$(Delphi7)\Projects\MeineKomponenten\GLScene

(wie oben halt nur mit deinen Pfaden)
- danach im Ordner MeineKomponenten\GLScene die Datei GLScene6.dpk bzw. GLScene7.dpk je nach Delphiversion offnen, compilieren und dann installieren.

DGL-luke 8. Jan 2006 17:15

Re: Facharbeit - 3D Topographie anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Entweder du machst dir ein eigenes Delphi-Lib-Verzecihnis (hab ich, weil ich mehrere Versionen installiert hab), oder du machst dir in Delphi\lib\ einen Unterordner für GLScene, in den du alles entpackst, alle relevanten Sachen dem Bibliothekspfad hinzufügst(siehe Bild im Anhang) und DANN das dpk installierst.

Ravager 8. Jan 2006 22:10

Re: Facharbeit - 3D Topographie anzeigen
 
in der installations-Doc steht die Reihenfolge andersrum drin... naja nochmal von Vorne:
also ich hab den Krempel erst in einen Ordner (E:\Delphi7\Projects\MeineKomponenten\GLScene\) entpackt, die ganzen Pfade in die Library-Liste hinzugefügt und dann GLScene7.dpk kompiliert und installiert. Alles ohne Probleme, aber:


Öffne Highfield/Project1.dpr

Felermeldung:
Error reading GLSceneViewer1.FieldOfView: Property FieldOfView does not exist [->ignore]
Class TGLDummyCube not found [->ignore]
Class TGLDummyCube not found [->ignore]
Class TGLDirectOpenGL not found [->ignore]
Class TGLWindowsBitmapFont not found [->ignore]

->Run [declarations removen]

[Fatal Error] Unit1.pas(10): File not found: 'VectorGeometry.dcu'


und wat nu? :gruebel:
fehlt noch was?
wieder was falsch gemacht?

GLScene wird in der Komponentenliste angezeigt.

turboPASCAL 8. Jan 2006 23:18

Re: Facharbeit - 3D Topographie anzeigen
 
Hm, ok das kann daran liegen das diene heruntergeladene Datei nicht die akt. ist. Wo hast du die heruntergeladen ?

Die aktuellste ist GLScene_SnapShot_150305.zip von http://sourceforge.net/project/showf...ckage_id=64488 und damit sollte es funktionieren.

oder:

hast du auch den Path E:\Delphi7\Projects\MeineKomponenten\GLScene\Sourc e\Base der Biblio. hinzugefügt ?

Ravager 9. Jan 2006 14:12

Re: Facharbeit - 3D Topographie anzeigen
 
das Verzeichnis war hinzugefügt. Brauche ich beide Dateien aus dem Package (sorry, wenns evtl dämlich ist, aber ich will sicher gehen)

bisher hatte ich GLScene_v09b_Full.zip installiert

turboPASCAL 9. Jan 2006 21:26

Re: Facharbeit - 3D Topographie anzeigen
 
GLScene_SnapShot_150305.zip ist die aktuellste Version von GLScene, diese ersetzt GLScene_v09b_Full.zip von der ich im Moment nicht sagen kann welche Sachen fehlen bzw. vorhanden sind.

SnapShot bezeichnet die aktuelle Version der Komponenten die immer weiter entwickelt werden.

Ravager 11. Jan 2006 21:09

Re: Facharbeit - 3D Topographie anzeigen
 
hi,

danke schonmal - alles geht :bounce1: :dancer: (Das Programm läuft)

ich habe versucht, das ganze auf mein Programm (möglichst simpel) zu übertragen.

Und beim Kopieren & Starten produziert er folgende Fehler:
[Error] Test2a.pas(2): Undeclared identifier: 'TColorVector'
[Error] Test2a.pas(2): Undeclared identifier: 'TTexPoint'

Code:
procedure Formula(const x, y: Single; var z: Single;
  var color: TColorVector; var texPoint: TTexPoint);
const
  Scale = 100;
begin
  z := VectorNorm(x, y);

  // x & y-Pos vom Array umrechnen
  z := data_dst_light[Trunc(x * 100), Trunc(y * 100)] / Scale;

  // nach Höhe einfärben
  VectorLerp(clrBlue, clrRed, z, color);
end;
Wo kommen denn die Typen her? ich use die selben klassen, wie du.

Wenn man auf das HeightField Event OnHeightGet doppelklickt, wird eine neue Prozedur erstellt:
Code:
procedure TForm1.GLHeightField1GetHeight(Sender: TObject; const x,
  y: Single; var z: Single; var color: TVector4f; var texPoint: TTexPoint);
begin
also statt TColorVector heißt der Variablentyp TVector4f...
[Error] Test2a.pas(375): Undeclared identifier: 'TVector4f'
[Error] Test2a.pas(375): Undeclared identifier: 'TTexPoint'


Gefunden wird er trotzdem nicht...

hat das etwas mit den anderen packages zu tun?
GLScene7.dpk hab ich installiert, den Rest nicht.

turboPASCAL 12. Jan 2006 09:05

Re: Facharbeit - 3D Topographie anzeigen
 
Also eigentlich ist das Programm für dich schon vorbereitet, du musst nur noch das Array füllen...

Delphi-Quellcode:
procedure TForm1.SetMyArray;
var x, y: Integer;
begin

  for x := 0 to 150 do
    for y := 0 to 150 do
      HFData[x, y] := ...

  GLHeightField1.StructureChanged; // HeightField neu zeichnen
end;
Dabei sollte beachtet werden dass die Werte 1,5 nicht überschreiten sollten. Also eine Scalierung durchfüren:

Delphi-Quellcode:
// Datenwerte an HeightField ubergeben
procedure TForm1.Formula(const x, y: Single; var z: Single;
  var color: TColorVector; var texPoint: TTexPoint);
const
  Scale = 100; // <-------<<<
begin
  z := VectorNorm(x, y);

  // x & y-Pos vom Array umrechnen
  z := HFData[Trunc(x * 100), Trunc(y * 100)] / Scale;

  // nach Höhe einfärben
  VectorLerp(clrBlue, clrRed, z, color);
end;
max. 150 : 100 = max 1,5


Wegen dem "Fehler" musst du noch die Unit VectorTypes mit einbinden:
Code:
[b][color=#0000AF]uses[/color][/b]
  Windows, ..., GLScene, ..., [b][color=#df0000]VectorTypes[/color][/b];

Ravager 13. Jan 2006 11:01

Re: Facharbeit - 3D Topographie anzeigen
 
So ich steig durch. Wird wirklich praktisch :-)

jetzt fehlt nur noch eine Sache: mein Array muss nicht voll sein. Will heißen, dass das Array nicht immer alle 150 Felder beschrieben hat. Manchmal werden auch nur 50x50 gescannt - je nach eingesteller Auflösung.

Wie kommt der Apparat also damit klar, wenn ich nur ein kleineres Array habe?

das muss doch hier irgendwo passieren:
Code:
procedure TForm1.Formula(const x, y: Single; var z: Single;
  var color: TColorVector; var texPoint: TTexPoint);
const
  Scale = 100;
begin
  z := VectorNorm(x, y);

  // x & y-Pos vom Array umrechnen
  z := HFData[Trunc(x * 100), Trunc(y * 100)] / Scale;

  // nach Höhe einfärben
  VectorLerp(clrBlue, clrRed, z, color);
end;
Wenn ich alles kapiert habe, müsste ich die Zeile so abändern:

z := HFData[Trunc(x * pos_MaxX / 1.5 ), Trunc(y * pos_MaxX / 1.5 )] / Scale;


die pos_Max-Variablen geben an, wie weit das Array beschrieben ist. Also können sie Maximal den Wert 150 haben.

turboPASCAL 13. Jan 2006 17:36

Re: Facharbeit - 3D Topographie anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Ravager
die pos_Max-Variablen geben an, wie weit das Array beschrieben ist. Also können sie Maximal den Wert 150 haben.

Ähm... öh, Ja. :wink: Das HeightField ist auf 0 bis 1.5 für x,y und z eingerichtet. Das Array (HFData) auf 0 bis 150 für x,y und z die Höhe. Wenn mal Werte wie 2,5 oder so kommen ist das auch nicht schlimm. Die Werte werden dann nicht mrh in der Kameraansicht (im Mittelpunkt) angezeigt...
Die Einstellung (1,5) für das HeightField ist für die 3D-Darstellung besser geeignet als 150 (Einstellungssache).
Du kannst das Array mit deinen Werten füllen wie du es benötigst ohne Umzurechnen, das wird ja schon gemacht (der Wert von Scale).

Das Beispiel zeigt ja wie. An der Procedure "Formula" brauchst du nichts machen. In der procedure TForm1.SetMyArray; kannst du deine Werte setzen...

Ravager 14. Jan 2006 18:04

Re: Facharbeit - 3D Topographie anzeigen
 
okay ich bin dabei. Wäre allerdings schön, wenn der Benutzer das Ganze in X- und Y- Richtung seperat Skalieren könnte (Raster unverändert).


Was aber viel wichtiger ist: welche z-Werte soll ich da eingeben?
der Datentyp von HFData ist Single. Mein Array data_dst_light hat den Datentyp Integer. Wie wandle ich die Sache um?

Code:
  for x := 0 to 150 do
    for y := 0 to 150 do
      HFData[x, y] := data_dst_light[y, x] / ((1 - opt_Contrast) * 255 + 1);

turboPASCAL 14. Jan 2006 18:28

Re: Facharbeit - 3D Topographie anzeigen
 
Var Single := Integer oder Var Single := Byte funktioniert, anders herum nicht. Wo ist da das Problem ?
Zun scalieren, das ist so eine Sache, entweder du rechnest es um oder du musst die Ausdehnung des HeightFields anpassen.

Ravager 14. Jan 2006 19:16

Re: Facharbeit - 3D Topographie anzeigen
 
wenn ich die Ausdehnung des Fields anpasse, stimmt der Raster ned - dann kann ichs auch gleich sein lassen, oder?

ich kann grad keinen Screenshot machen, weil ich am Akkuaufladen bin.
Wo das Problem ist, kann ich nicht sagen:
Code:
data_src_light : Array[0..150,0..150] of Integer;  // 0 - 65535
data_dst_light : Array[0..150,0..150] of Integer;  //Das ist das Array, das komische Ergebnisse produziert

---------------
//Hier wird das SRC-Array umgerechnet, so dass Graustufenwerte ausgegeben werden ( 0 - 255 )
data_dst_light[x,y] := Trunc((255 * (data_src_light[x, y] - data_MinL)) / (data_MaxL - data_MinL))
//(Ergebnis wurde in 2D überprüft und stimmt)
---------------
//Hier wird dein GL Array gefüllt
HFData[x, y] := data_dst_light[x, y];

Die Standardwerte, auch aus deinem letzten Beispiel sehen vor, dass bis z=150 das ganze nicht übermäßig groß aussieht. Jetzt werden aber doch auch nur Werte bis 255 eingegeben. Trotzdem sieht eine Zeile (y=1; 1<x<150) aus wie eine Autobahn: Die Höhe ist ungefähr 5-10 mal so groß, wie der Array.


Wie gesagt: ich kann grad ned testen, sonst würd ich dir einen Screenshot bauen...
:)

bye
!Ravager

Ravager 18. Jan 2006 15:00

Re: Facharbeit - 3D Topographie anzeigen
 
Hallo Leute,

die Sache ist fast fertig. Sieht echt gut aus.

Bleibt noch ein kleines Problem: ich hab eine 3D-Darstellung mit einem SceneViewer und eine 2D-Darstellung mit Canvas in einem TImage. Beide Steuerelemente befinden sich in einem Panel.

Der Benutzer kann von 2D auf 3D umschalten. Dann wird der SceneViewer Visible gemacht, ansonsten ist er versteckt.

Problem ist jetzt die Größenänderung: Das Panel verhält sich Korrekt (alle 4 Anchors gehen). Der SceneViewer auch. Aber nur, wenn er visible ist. Findet während 2D-Modus eine Größenänderung des Fensters statt und schaltet man dann auf 3D um, bleibt der SceneViewer klein. Sobalt er wieder sichtbar ist, läuft alles normal aber sonst ignoriert Delphi [akRight] und [akBottom].

Noch schlimmer ist es beim Image. Hier findet überhaupt keine Größenänderung statt.

Fehlt vielleicht irgendeine Einstellung der Steuerelemente?
oder muss man ein Resize-Ergeinis programmieren, wie in den anderen Porgrammiersprachen?

Ravager 23. Jan 2006 18:21

Re: Facharbeit - 3D Topographie anzeigen
 
könnt ihr mir dabei wirklich nicht helfen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz